Index: altium_parser/main.c =================================================================== --- altium_parser/main.c (revision 35273) +++ altium_parser/main.c (revision 35274) @@ -20,10 +20,12 @@ } if (pcbdoc_ascii_parse_file(NULL, &tree, fn) != 0) { + altium_tree_free(&tree); fprintf(stderr, "failed to parse '%s'\n", fn); return -1; } + altium_tree_free(&tree); return 0; } Index: altium_parser/pcbdoc_ascii.c =================================================================== --- altium_parser/pcbdoc_ascii.c (revision 35273) +++ altium_parser/pcbdoc_ascii.c (revision 35274) @@ -152,3 +152,14 @@ return pcbdoc_ascii_parse_blocks(tree); } + +void altium_tree_free(altium_tree_t *tree) +{ + altium_block_t *blk; + + for(blk = gdl_first(&tree->blocks); blk != NULL; blk = gdl_first(&tree->blocks)) { + gdl_remove(&tree->blocks, blk, link); + free(blk); + } +} + Index: altium_parser/pcbdoc_ascii.h =================================================================== --- altium_parser/pcbdoc_ascii.h (revision 35273) +++ altium_parser/pcbdoc_ascii.h (revision 35274) @@ -30,3 +30,5 @@ int pcbdoc_ascii_test_parse(pcb_plug_io_t *ctx, pcb_plug_iot_t typ, const char *file_name, FILE *f); int pcbdoc_ascii_parse_file(rnd_hidlib_t *hidlib, altium_tree_t *tree, const char *fn); +void altium_tree_free(altium_tree_t *tree); +