diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/include/xml/free.c | 36 | ||||
-rw-r--r-- | src/test.c | 15 |
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); +} @@ -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) |