Index: trunk/src/data.c =================================================================== --- trunk/src/data.c (revision 15140) +++ trunk/src/data.c (revision 15141) @@ -253,42 +253,9 @@ list_map0(&data->Element, pcb_element_t, pcb_element_free); list_map0(&data->Rat, pcb_rat_t, pcb_rat_free); - for (layer = data->Layer, i = 0; i < data->LayerN; layer++, i++) { - if (!layer->is_bound) - pcb_attribute_free(&layer->meta.real.Attributes); - PCB_TEXT_LOOP(layer); - { - free(text->TextString); - } - PCB_END_LOOP; - PCB_LINE_LOOP(layer); - { - if (line->Number) - free(line->Number); - } - PCB_END_LOOP; + for (layer = data->Layer, i = 0; i < data->LayerN; layer++, i++) + pcb_layer_free(layer); - list_map0(&layer->Line, pcb_line_t, pcb_line_free); - list_map0(&layer->Arc, pcb_arc_t, pcb_arc_free); - list_map0(&layer->Text, pcb_text_t, pcb_text_free); - PCB_POLY_LOOP(layer); - { - pcb_poly_free_fields(polygon); - } - PCB_END_LOOP; - list_map0(&layer->Polygon, pcb_poly_t, pcb_poly_free); - if (!layer->is_bound) { - if (layer->line_tree) - pcb_r_destroy_tree(&layer->line_tree); - if (layer->arc_tree) - pcb_r_destroy_tree(&layer->arc_tree); - if (layer->text_tree) - pcb_r_destroy_tree(&layer->text_tree); - if (layer->polygon_tree) - pcb_r_destroy_tree(&layer->polygon_tree); - } - } - if (!subc) { if (data->element_tree) pcb_r_destroy_tree(&data->element_tree); Index: trunk/src/layer.c =================================================================== --- trunk/src/layer.c (revision 15140) +++ trunk/src/layer.c (revision 15141) @@ -39,6 +39,7 @@ #include "layer_vis.h" #include "rtree.h" #include "obj_pstk_inlines.h" +#include "list_common.h" pcb_virt_layer_t pcb_virt_layers[] = { {"invisible", PCB_LYT_VIRTUAL + 1, PCB_LYT_VIRTUAL | PCB_LYT_INVIS }, @@ -107,6 +108,44 @@ } \ } while(0) +void pcb_layer_free(pcb_layer_t *layer) +{ + if (!layer->is_bound) + pcb_attribute_free(&layer->meta.real.Attributes); + PCB_TEXT_LOOP(layer); + { + free(text->TextString); + } + PCB_END_LOOP; + PCB_LINE_LOOP(layer); + { + if (line->Number) + free(line->Number); + } + PCB_END_LOOP; + + list_map0(&layer->Line, pcb_line_t, pcb_line_free); + list_map0(&layer->Arc, pcb_arc_t, pcb_arc_free); + list_map0(&layer->Text, pcb_text_t, pcb_text_free); + PCB_POLY_LOOP(layer); + { + pcb_poly_free_fields(polygon); + } + PCB_END_LOOP; + list_map0(&layer->Polygon, pcb_poly_t, pcb_poly_free); + if (!layer->is_bound) { + if (layer->line_tree) + pcb_r_destroy_tree(&layer->line_tree); + if (layer->arc_tree) + pcb_r_destroy_tree(&layer->arc_tree); + if (layer->text_tree) + pcb_r_destroy_tree(&layer->text_tree); + if (layer->polygon_tree) + pcb_r_destroy_tree(&layer->polygon_tree); + } + memset(layer, 0, sizeof(layer)); +} + pcb_bool pcb_layer_is_pure_empty(pcb_layer_t *layer) { /* if any local list is non-empty, the layer is non-empty */ Index: trunk/src/layer.h =================================================================== --- trunk/src/layer.h (revision 15140) +++ trunk/src/layer.h (revision 15141) @@ -178,6 +178,9 @@ /************ NEW API - new code should use these **************/ +/* Free all metadata and objects of a layer; does not free(layer) */ +void pcb_layer_free(pcb_layer_t *layer); + /* Return the layer pointer (or NULL on invalid or virtual layers) for an id */ pcb_layer_t *pcb_get_layer(pcb_data_t *data, pcb_layer_id_t id);