summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/include/xml/free.c36
-rw-r--r--src/test.c15
2 files changed, 37 insertions, 14 deletions
diff --git a/src/include/xml/free.c b/src/include/xml/free.c
new file mode 100644
index 0000000..bbf3369
--- /dev/null
+++ b/src/include/xml/free.c
@@ -0,0 +1,36 @@
+#include <stdlib.h>
+
+#include "xml.h"
+
+void freemap(map_t *map)
+{
+ if (map->n_attrs) {
+ for (int i = 0; i < map->n_attrs; ++i) {
+ free(map->attrs[i].id);
+ free(map->attrs[i].value);
+ }
+ free(map->attrs);
+ }
+ if(map->size == sizeof(map_t)) {
+ for (int i = 0; i < map->n; ++i) {
+ map_t *pl = (map_t *)map->payload;
+ if (pl[i].n_attrs) {
+ for (int j = 0; j < pl[i].n_attrs; ++j) {
+ free(pl[i].attrs[j].id);
+ free(pl[i].attrs[j].value);
+ }
+ free(pl[i].attrs);
+ }
+ if (pl[i].size == sizeof(map_t))
+ freemap(pl[i].payload);
+ else
+ free(pl[i].payload);
+ free(pl[i].tag);
+ }
+ free(map->payload);
+ }
+ else
+ free(map->payload);
+ free(map->tag);
+ free(map);
+}
diff --git a/src/test.c b/src/test.c
index 80e8b39..c6e7f22 100644
--- a/src/test.c
+++ b/src/test.c
@@ -268,20 +268,7 @@ void test_decode(void)
map_t *map = decode(xml, &start, &len);
printf("%s\n", (xml = encode(map, 1)));
free(xml);
- // TODO: create a freemap function
- free(map->tag);
- free(map->attrs[0].id);
- free(map->attrs[0].value);
- free(map->attrs[1].id);
- free(map->attrs[1].value);
- free(map->attrs);
- map_t *pl = (map_t *) map->payload;
- free(pl[0].tag);
- free(pl[1].tag);
- free(pl[0].payload);
- free(pl[1].payload);
- free(map->payload);
- free(map);
+ freemap(map);
}
int main(void)