Index: trunk/src/drc.h =================================================================== --- trunk/src/drc.h (revision 21149) +++ trunk/src/drc.h (revision 21150) @@ -42,10 +42,9 @@ int have_measured; pcb_coord_t measured_value; pcb_coord_t required_value; - int object_count; - long int *object_id_list; - int *object_type_list; + vtid_t objs[2]; /* two groups of offending objects */ + gdl_elem_t link; /* always part of a list */ }; Index: trunk/src/find_drc.c =================================================================== --- trunk/src/find_drc.c (revision 21149) +++ trunk/src/find_drc.c (revision 21150) @@ -43,8 +43,7 @@ static pcb_drc_violation_t *pcb_drc_violation_new( const char *title, const char *explanation, pcb_coord_t x, pcb_coord_t y, pcb_angle_t angle, pcb_bool have_measured, pcb_coord_t measured_value, - pcb_coord_t required_value, int object_count, long int *object_id_list, - int *object_type_list) + pcb_coord_t required_value, vtid_t objs[2]) { pcb_drc_violation_t *violation = malloc(sizeof(pcb_drc_violation_t)); @@ -56,10 +55,8 @@ violation->have_measured = have_measured; violation->measured_value = measured_value; violation->required_value = required_value; - violation->object_count = object_count; - violation->object_id_list = object_id_list; - violation->object_type_list = object_type_list; - + memcpy(&violation->objs, objs, sizeof(violation->objs)); + memset(objs, 0, sizeof(violation->objs)); return violation; } @@ -82,12 +79,8 @@ static void GotoError(void); /* Build a list of the of offending items by ID. (Currently just "thing") */ -static void BuildObjectList(int *object_count, long int **object_id_list, int **object_type_list) +static void BuildObjectList(vtid_t objs[2]) { - *object_count = 0; - *object_id_list = NULL; - *object_type_list = NULL; - switch (thing_type) { case PCB_OBJ_LINE: case PCB_OBJ_ARC: @@ -94,11 +87,7 @@ case PCB_OBJ_POLY: case PCB_OBJ_PSTK: case PCB_OBJ_RAT: - *object_count = 1; - *object_id_list = (long int *) malloc(sizeof(long int)); - *object_type_list = (int *) malloc(sizeof(int)); - **object_id_list = ((pcb_any_obj_t *) thing_ptr3)->ID; - **object_type_list = thing_type; + vtid_append(&objs[0], ((pcb_any_obj_t *)thing_ptr3)->ID); return; default: @@ -193,16 +182,14 @@ { const char *message; pcb_coord_t x, y; - int object_count; - long int *object_id_list; - int *object_type_list; pcb_drc_violation_t *violation; - pcb_drc_list_t *lst = user_data; - pcb_line_t *line = (pcb_line_t *)ptr2; pcb_arc_t *arc = (pcb_arc_t *)ptr2; pcb_pstk_t *ps = (pcb_pstk_t *)ptr2; + vtid_t objs[2]; + memset(objs, 0, sizeof(objs)); + thing_type = type; thing_ptr1 = ptr1; thing_ptr2 = ptr2; @@ -244,16 +231,13 @@ pcb_draw_obj((pcb_any_obj_t *)ptr2); drcerr_count++; LocateError(&x, &y); - BuildObjectList(&object_count, &object_id_list, &object_type_list); + BuildObjectList(objs); violation = pcb_drc_violation_new(message, "Circuits that are too close may bridge during imaging, etching,\n" "plating, or soldering processes resulting in a direct short.", x, y, 0, /* ANGLE OF ERROR UNKNOWN */ pcb_false, /* MEASUREMENT OF ERROR UNKNOWN */ 0, /* MAGNITUDE OF ERROR UNKNOWN */ - conf_core.design.bloat, object_count, object_id_list, object_type_list); - append_drc_violation(lst, violation); - free(object_id_list); - free(object_type_list); + conf_core.design.bloat, objs); if (!throw_drc_dialog()) { IsBad = pcb_true; return PCB_R_DIR_FOUND_CONTINUE; @@ -269,10 +253,10 @@ static int drc_text(pcb_drc_list_t *lst, pcb_layer_t *layer, pcb_text_t *text, pcb_coord_t min_wid, pcb_coord_t *x, pcb_coord_t *y) { pcb_drc_violation_t *violation; - int object_count; - long int *object_id_list; - int *object_type_list; + vtid_t objs[2]; + memset(objs, 0, sizeof(objs)); + if (text->thickness == 0) return 0; /* automatic thickness is always valid - ensured by the renderer */ if (text->thickness < min_wid) { @@ -282,16 +266,14 @@ drcerr_count++; SetThing(PCB_OBJ_TEXT, layer, text, text); LocateError(x, y); - BuildObjectList(&object_count, &object_id_list, &object_type_list); + BuildObjectList(objs); violation = pcb_drc_violation_new( "Text thickness is too thin", "Process specifications dictate a minimum feature-width\n" "that can reliably be reproduced", *x, *y, 0, /* ANGLE OF ERROR UNKNOWN */ pcb_true, /* MEASUREMENT OF ERROR KNOWN */ - text->thickness, min_wid, object_count, object_id_list, object_type_list); + text->thickness, min_wid, objs); append_drc_violation(lst, violation); - free(object_id_list); - free(object_type_list); if (!throw_drc_dialog()) { IsBad = pcb_true; return 1; @@ -306,12 +288,12 @@ int pcb_drc_all(pcb_drc_list_t *lst) { pcb_coord_t x, y; - int object_count; - long int *object_id_list; - int *object_type_list; pcb_drc_violation_t *violation; int nopastecnt = 0; + vtid_t objs[2]; + memset(objs, 0, sizeof(objs)); + reset_drc_dialog_message(); IsBad = pcb_false; @@ -392,16 +374,14 @@ drcerr_count++; SetThing(PCB_OBJ_LINE, layer, line, line); LocateError(&x, &y); - BuildObjectList(&object_count, &object_id_list, &object_type_list); + BuildObjectList(objs); violation = pcb_drc_violation_new( "Line width is too thin", "Process specifications dictate a minimum feature-width\n" "that can reliably be reproduced", x, y, 0, /* ANGLE OF ERROR UNKNOWN */ pcb_true, /* MEASUREMENT OF ERROR KNOWN */ - line->Thickness, conf_core.design.min_wid, object_count, object_id_list, object_type_list); + line->Thickness, conf_core.design.min_wid, objs); append_drc_violation(lst, violation); - free(object_id_list); - free(object_type_list); if (!throw_drc_dialog()) { IsBad = pcb_true; break; @@ -425,16 +405,14 @@ drcerr_count++; SetThing(PCB_OBJ_ARC, layer, arc, arc); LocateError(&x, &y); - BuildObjectList(&object_count, &object_id_list, &object_type_list); + BuildObjectList(objs); violation = pcb_drc_violation_new( "Arc width is too thin", "Process specifications dictate a minimum feature-width\n" "that can reliably be reproduced", x, y, 0, /* ANGLE OF ERROR UNKNOWN */ pcb_true, /* MEASUREMENT OF ERROR KNOWN */ - arc->Thickness, conf_core.design.min_wid, object_count, object_id_list, object_type_list); + arc->Thickness, conf_core.design.min_wid, objs); append_drc_violation(lst, violation); - free(object_id_list); - free(object_type_list); if (!throw_drc_dialog()) { IsBad = pcb_true; break; @@ -462,7 +440,7 @@ drcerr_count++; SetThing(PCB_OBJ_PSTK, padstack, padstack, padstack); LocateError(&x, &y); - BuildObjectList(&object_count, &object_id_list, &object_type_list); + BuildObjectList(objs); violation = pcb_drc_violation_new( "padstack annular ring too small", "Annular rings that are too small may erode during etching,\n" "resulting in a broken connection", @@ -469,7 +447,7 @@ x, y, 0, /* ANGLE OF ERROR UNKNOWN */ pcb_true, /* MEASUREMENT OF ERROR KNOWN */ ring, - conf_core.design.min_ring, object_count, object_id_list, object_type_list); + conf_core.design.min_ring, objs); append_drc_violation(lst, violation); } if (hole > 0) { @@ -476,17 +454,15 @@ drcerr_count++; SetThing(PCB_OBJ_PSTK, padstack, padstack, padstack); LocateError(&x, &y); - BuildObjectList(&object_count, &object_id_list, &object_type_list); + BuildObjectList(objs); violation = pcb_drc_violation_new( "Padstack drill size is too small", "Process rules dictate the minimum drill size which can be used", x, y, 0, /* ANGLE OF ERROR UNKNOWN */ pcb_true, /* MEASUREMENT OF ERROR KNOWN */ - hole, conf_core.design.min_drill, object_count, object_id_list, object_type_list); + hole, conf_core.design.min_drill, objs); append_drc_violation(lst, violation); } - free(object_id_list); - free(object_type_list); if (!throw_drc_dialog()) { IsBad = pcb_true; break; @@ -512,16 +488,14 @@ drcerr_count++; SetThing(PCB_OBJ_LINE, layer, line, line); LocateError(&x, &y); - BuildObjectList(&object_count, &object_id_list, &object_type_list); + BuildObjectList(objs); violation = pcb_drc_violation_new( "Silk line is too thin", "Process specifications dictate a minimum silkscreen feature-width\n" "that can reliably be reproduced", x, y, 0, /* ANGLE OF ERROR UNKNOWN */ pcb_true, /* MEASUREMENT OF ERROR KNOWN */ - line->Thickness, conf_core.design.min_slk, object_count, object_id_list, object_type_list); + line->Thickness, conf_core.design.min_slk, objs); append_drc_violation(lst, violation); - free(object_id_list); - free(object_type_list); if (!throw_drc_dialog()) { IsBad = pcb_true; break; @@ -552,11 +526,11 @@ static pcb_bool DRCFind(pcb_drc_list_t *lst, int What, void *ptr1, void *ptr2, void *ptr3) { pcb_coord_t x, y; - int object_count; - long int *object_id_list; - int *object_type_list; pcb_drc_violation_t *violation; + vtid_t objs[2]; + memset(objs, 0, sizeof(objs)); + if (conf_core.design.shrink != 0) { Bloat = -conf_core.design.shrink; TheFlag = PCB_FLAG_DRC | PCB_FLAG_SELECTED; @@ -590,7 +564,7 @@ drc = pcb_false; drcerr_count++; LocateError(&x, &y); - BuildObjectList(&object_count, &object_id_list, &object_type_list); + BuildObjectList(objs); violation = pcb_drc_violation_new( "Potential for broken trace", "Insufficient overlap between objects can lead to broken tracks\n" "due to registration errors with old wheel style photo-plotters.", @@ -597,10 +571,8 @@ x, y, 0, /* ANGLE OF ERROR UNKNOWN */ pcb_false, /* MEASUREMENT OF ERROR UNKNOWN */ 0, /* MAGNITUDE OF ERROR UNKNOWN */ - conf_core.design.shrink, object_count, object_id_list, object_type_list); + conf_core.design.shrink, objs); append_drc_violation(lst, violation); - free(object_id_list); - free(object_type_list); if (!throw_drc_dialog()) return pcb_true; @@ -636,7 +608,7 @@ DumpList(); drcerr_count++; LocateError(&x, &y); - BuildObjectList(&object_count, &object_id_list, &object_type_list); + BuildObjectList(objs); violation = pcb_drc_violation_new( "Copper areas too close", "Circuits that are too close may bridge during imaging, etching,\n" "plating, or soldering processes resulting in a direct short.", @@ -643,10 +615,8 @@ x, y, 0, /* ANGLE OF ERROR UNKNOWN */ pcb_false, /* MEASUREMENT OF ERROR UNKNOWN */ 0, /* MAGNITUDE OF ERROR UNKNOWN */ - conf_core.design.bloat, object_count, object_id_list, object_type_list); + conf_core.design.bloat, objs); append_drc_violation(lst, violation); - free(object_id_list); - free(object_type_list); User = pcb_false; drc = pcb_false; if (!throw_drc_dialog()) Index: trunk/src_plugins/lib_gtk_common/dlg_drc.c =================================================================== --- trunk/src_plugins/lib_gtk_common/dlg_drc.c (revision 21149) +++ trunk/src_plugins/lib_gtk_common/dlg_drc.c (revision 21150) @@ -210,24 +210,22 @@ /* Flag the objects listed against this DRC violation */ for (i = 0; i < violation->object_count; i++) { int object_id = violation->object_id_list[i]; - int object_type = violation->object_type_list[i]; - int found_type; - void *ptr1, *ptr2, *ptr3; + pcb_any_obj_t *obj; - found_type = pcb_search_obj_by_id(PCB->Data, &ptr1, &ptr2, &ptr3, object_id, object_type); - if (found_type == PCB_OBJ_VOID) { + obj = htip_get(&PCB->Data->id2obj, object_id); + if (obj == NULL) { pcb_message(PCB_MSG_WARNING, _("Object ID %i identified during DRC was not found. Stale DRC window?\n"), object_id); continue; } - pcb_undo_add_obj_to_flag(ptr2); - PCB_FLAG_SET(PCB_FLAG_FOUND, (pcb_any_obj_t *) ptr2); - switch (violation->object_type_list[i]) { + pcb_undo_add_obj_to_flag(obj); + PCB_FLAG_SET(PCB_FLAG_FOUND, obj); + switch (obj->type) { case PCB_OBJ_LINE: case PCB_OBJ_ARC: case PCB_OBJ_POLY: - pcb_layervis_change_group_vis(pcb_layer_id(PCB->Data, (pcb_layer_t *) ptr1), pcb_true, pcb_true); + pcb_layervis_change_group_vis(pcb_layer_id(PCB->Data, obj->parent.layer), pcb_true, pcb_true); } - pcb_draw_obj((pcb_any_obj_t *)ptr2); + pcb_draw_obj(obj); } pcb_board_set_changed_flag(pcb_true); pcb_undo_inc_serial(); @@ -262,8 +260,6 @@ g_free(violation->title); g_free(violation->explanation); - g_free(violation->object_id_list); - g_free(violation->object_type_list); G_OBJECT_CLASS(ghid_drc_violation_parent_class)->finalize(object); } @@ -271,7 +267,6 @@ typedef struct object_list { int count; long int *id_list; - int *type_list; } object_list; static void ghid_drc_violation_set_property(GObject * object, guint property_id, const GValue * value, GParamSpec * pspec) @@ -308,14 +303,10 @@ break; case PROP_OBJECT_LIST: /* Copy the passed data to make new lists */ - g_free(violation->object_id_list); - g_free(violation->object_type_list); obj_list = (object_list *) g_value_get_pointer(value); violation->object_count = obj_list->count; violation->object_id_list = g_new(long int, obj_list->count); - violation->object_type_list = g_new(int, obj_list->count); memcpy(violation->object_id_list, obj_list->id_list, sizeof(long int) * obj_list->count); - memcpy(violation->object_type_list, obj_list->type_list, sizeof(int) * obj_list->count); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec); @@ -393,9 +384,8 @@ { object_list obj_list; - obj_list.count = violation->object_count; - obj_list.id_list = violation->object_id_list; - obj_list.type_list = violation->object_type_list; + obj_list.count = violation->objs[0].used; + obj_list.id_list = violation->objs[0].array; return (GhidDrcViolation *) g_object_new(GHID_TYPE_DRC_VIOLATION, "title", violation->title,