/* --------------------------------------------------------------------------- * frees memory used by an element */ void FreeElementMemory (ElementType *element) { if (element == NULL) return; ELEMENTNAME_LOOP (element); { free (textstring); } END_LOOP; PIN_LOOP (element); { free (pin->Name); free (pin->Number); } END_LOOP; PAD_LOOP (element); { free (pad->Name); free (pad->Number); } END_LOOP; g_list_free_full (element->Pin, (GDestroyNotify)FreePin); g_list_free_full (element->Pad, (GDestroyNotify)FreePad); g_list_free_full (element->Line, (GDestroyNotify)FreeLine); g_list_free_full (element->Arc, (GDestroyNotify)FreeArc); FreeAttributeListMemory (&element->Attributes); memset (element, 0, sizeof (ElementType)); }
/* --------------------------------------------------------------------------- * free memory used by PCB */ void FreePCBMemory (PCBTypePtr PCBPtr) { int i; if (PCBPtr) { MYFREE (PCBPtr->Name); MYFREE (PCBPtr->Filename); MYFREE (PCBPtr->PrintFilename); if (PCBPtr->Data) FreeDataMemory (PCBPtr->Data); MYFREE (PCBPtr->Data); /* release font symbols */ for (i = 0; i <= MAX_FONTPOSITION; i++) MYFREE (PCBPtr->Font.Symbol[i].Line); FreeLibraryMemory (&PCBPtr->NetlistLib); FreeAttributeListMemory (&PCBPtr->Attributes); /* clear struct */ memset (PCBPtr, 0, sizeof (PCBType)); } else { fprintf (stderr, "Warning: Tried to FreePCBMemory(null)\n"); } }
/* --------------------------------------------------------------------------- * frees memory used by an element */ void FreeElementMemory (ElementTypePtr Element) { if (Element) { ELEMENTNAME_LOOP (Element); { MYFREE (textstring); } END_LOOP; PIN_LOOP (Element); { MYFREE (pin->Name); MYFREE (pin->Number); } END_LOOP; PAD_LOOP (Element); { MYFREE (pad->Name); MYFREE (pad->Number); } END_LOOP; MYFREE (Element->Pin); MYFREE (Element->Pad); MYFREE (Element->Line); MYFREE (Element->Arc); FreeAttributeListMemory (&Element->Attributes); memset (Element, 0, sizeof (ElementType)); } }
/*! * \brief Free the memory used by PCB. */ void FreePCBMemory (PCBType *pcb) { int i; if (pcb == NULL) { return; } free (pcb->Name); free (pcb->Filename); free (pcb->PrintFilename); FreeDataMemory (pcb->Data); free (pcb->Data); /* release font symbols */ for (i = 0; i <= MAX_FONTPOSITION; i++) { free (pcb->Font.Symbol[i].Line); } FreeLibraryMemory (&pcb->NetlistLib); NetlistChanged (0); FreeAttributeListMemory (&pcb->Attributes); /* clear struct */ memset (pcb, 0, sizeof (PCBType)); }
/* --------------------------------------------------------------------------- * free memory used by data struct */ void FreeDataMemory (DataType *data) { LayerType *layer; int i; if (data == NULL) return; VIA_LOOP (data); { free (via->Name); } END_LOOP; g_list_free_full (data->Via, (GDestroyNotify)FreeVia); ELEMENT_LOOP (data); { FreeElementMemory (element); } END_LOOP; g_list_free_full (data->Element, (GDestroyNotify)FreeElement); g_list_free_full (data->Rat, (GDestroyNotify)FreeRat); for (layer = data->Layer, i = 0; i < MAX_LAYER + 2; layer++, i++) { FreeAttributeListMemory (&layer->Attributes); TEXT_LOOP (layer); { free (text->TextString); } END_LOOP; if (layer->Name) free (layer->Name); LINE_LOOP (layer); { if (line->Number) free (line->Number); } END_LOOP; g_list_free_full (layer->Line, (GDestroyNotify)FreeLine); g_list_free_full (layer->Arc, (GDestroyNotify)FreeArc); g_list_free_full (layer->Text, (GDestroyNotify)FreeText); POLYGON_LOOP (layer); { FreePolygonMemory (polygon); } END_LOOP; g_list_free_full (layer->Polygon, (GDestroyNotify)FreePolygon); if (layer->line_tree) r_destroy_tree (&layer->line_tree); if (layer->arc_tree) r_destroy_tree (&layer->arc_tree); if (layer->text_tree) r_destroy_tree (&layer->text_tree); if (layer->polygon_tree) r_destroy_tree (&layer->polygon_tree); } if (data->element_tree) r_destroy_tree (&data->element_tree); for (i = 0; i < MAX_ELEMENTNAMES; i++) if (data->name_tree[i]) r_destroy_tree (&data->name_tree[i]); if (data->via_tree) r_destroy_tree (&data->via_tree); if (data->pin_tree) r_destroy_tree (&data->pin_tree); if (data->pad_tree) r_destroy_tree (&data->pad_tree); if (data->rat_tree) r_destroy_tree (&data->rat_tree); /* clear struct */ memset (data, 0, sizeof (DataType)); }
/* --------------------------------------------------------------------------- * free memory used by data struct */ void FreeDataMemory (DataTypePtr Data) { LayerTypePtr layer; int i; if (Data) { VIA_LOOP (Data); { MYFREE (via->Name); } END_LOOP; ELEMENT_LOOP (Data); { FreeElementMemory (element); } END_LOOP; for (layer = Data->Layer, i = 0; i < MAX_LAYER + 2; layer++, i++) { FreeAttributeListMemory (&layer->Attributes); TEXT_LOOP (layer); { MYFREE (text->TextString); } END_LOOP; if (layer->Name) MYFREE (layer->Name); LINE_LOOP (layer); { if (line->Number) MYFREE (line->Number); } END_LOOP; MYFREE (layer->Line); MYFREE (layer->Arc); MYFREE (layer->Text); POLYGON_LOOP (layer); { FreePolygonMemory (polygon); } END_LOOP; MYFREE (layer->Polygon); if (layer->line_tree) r_destroy_tree (&layer->line_tree); if (layer->arc_tree) r_destroy_tree (&layer->arc_tree); if (layer->text_tree) r_destroy_tree (&layer->text_tree); if (layer->polygon_tree) r_destroy_tree (&layer->polygon_tree); } if (Data->element_tree) r_destroy_tree (&Data->element_tree); for (i = 0; i < MAX_ELEMENTNAMES; i++) if (Data->name_tree[i]) r_destroy_tree (&Data->name_tree[i]); if (Data->via_tree) r_destroy_tree (&Data->via_tree); if (Data->pin_tree) r_destroy_tree (&Data->pin_tree); if (Data->pad_tree) r_destroy_tree (&Data->pad_tree); if (Data->rat_tree) r_destroy_tree (&Data->rat_tree); /* clear struct */ memset (Data, 0, sizeof (DataType)); } else { fprintf (stderr, "Warning: Tried to FreeDataMemory(null)\n"); } }