Index: trunk/src/create.c =================================================================== --- trunk/src/create.c (revision 2422) +++ trunk/src/create.c (revision 2423) @@ -373,7 +373,7 @@ * verify that the layer is on the board first! */ if (setjmp(info.env) == 0) { - r_search(Layer->line_tree, &search, NULL, line_callback, &info); + r_search(Layer->line_tree, &search, NULL, line_callback, &info, NULL); return CreateNewLineOnLayer(Layer, X1, Y1, X2, Y2, Thickness, Clearance, Flags); } Index: trunk/src/crosshair.c =================================================================== --- trunk/src/crosshair.c (revision 2422) +++ trunk/src/crosshair.c (revision 2423) @@ -841,8 +841,8 @@ /* Only find points of arcs and lines on currently visible layers. */ if (!layer->On) continue; - r_search(layer->line_tree, &SearchBox, NULL, onpoint_line_callback, &info); - r_search(layer->arc_tree, &SearchBox, NULL, onpoint_arc_callback, &info); + r_search(layer->line_tree, &SearchBox, NULL, onpoint_line_callback, &info, NULL); + r_search(layer->arc_tree, &SearchBox, NULL, onpoint_arc_callback, &info, NULL); } /* Undraw the old objects */ Index: trunk/src/draw.c =================================================================== --- trunk/src/draw.c (revision 2422) +++ trunk/src/draw.c (revision 2423) @@ -475,8 +475,8 @@ if (!draw_plated && draw_unplated) plated = 0; - r_search(PCB->Data->pin_tree, drawn_area, NULL, hole_callback, &plated); - r_search(PCB->Data->via_tree, drawn_area, NULL, hole_callback, &plated); + r_search(PCB->Data->pin_tree, drawn_area, NULL, hole_callback, &plated, NULL); + r_search(PCB->Data->via_tree, drawn_area, NULL, hole_callback, &plated, NULL); } static void _draw_line(LineType * line) @@ -687,11 +687,11 @@ && gui->set_layer("invisible", SL(INVISIBLE, 0), 0)) { side = SWAP_IDENT ? COMPONENT_LAYER : SOLDER_LAYER; if (PCB->ElementOn) { - r_search(PCB->Data->element_tree, drawn_area, NULL, element_callback, &side); - r_search(PCB->Data->name_tree[NAME_INDEX()], drawn_area, NULL, name_callback, &side); + r_search(PCB->Data->element_tree, drawn_area, NULL, element_callback, &side, NULL); + r_search(PCB->Data->name_tree[NAME_INDEX()], drawn_area, NULL, name_callback, &side, NULL); DrawLayer(&(PCB->Data->Layer[max_copper_layer + side]), drawn_area); } - r_search(PCB->Data->pad_tree, drawn_area, NULL, pad_callback, &side); + r_search(PCB->Data->pad_tree, drawn_area, NULL, pad_callback, &side, NULL); gui->end_layer(); } @@ -749,7 +749,7 @@ if (gui->gui) { /* Draw element Marks */ if (PCB->PinOn) - r_search(PCB->Data->element_tree, drawn_area, NULL, EMark_callback, NULL); + r_search(PCB->Data->element_tree, drawn_area, NULL, EMark_callback, NULL, NULL); /* Draw rat lines on top */ if (gui->set_layer("rats", SL(RATS, 0), 0)) { DrawRats(drawn_area); @@ -835,27 +835,27 @@ if (PCB->PinOn || !gui->gui) { /* draw element pins */ - r_search(PCB->Data->pin_tree, drawn_area, NULL, pin_callback, NULL); + r_search(PCB->Data->pin_tree, drawn_area, NULL, pin_callback, NULL, NULL); /* draw element pads */ if (group == component_group) { side = COMPONENT_LAYER; - r_search(PCB->Data->pad_tree, drawn_area, NULL, pad_callback, &side); + r_search(PCB->Data->pad_tree, drawn_area, NULL, pad_callback, &side, NULL); } if (group == solder_group) { side = SOLDER_LAYER; - r_search(PCB->Data->pad_tree, drawn_area, NULL, pad_callback, &side); + r_search(PCB->Data->pad_tree, drawn_area, NULL, pad_callback, &side, NULL); } } /* draw vias */ if (PCB->ViaOn || !gui->gui) { - r_search(PCB->Data->via_tree, drawn_area, NULL, via_callback, NULL); - r_search(PCB->Data->via_tree, drawn_area, NULL, hole_callback, NULL); + r_search(PCB->Data->via_tree, drawn_area, NULL, via_callback, NULL, NULL); + r_search(PCB->Data->via_tree, drawn_area, NULL, hole_callback, NULL, NULL); } if (PCB->PinOn || doing_assy) - r_search(PCB->Data->pin_tree, drawn_area, NULL, hole_callback, NULL); + r_search(PCB->Data->pin_tree, drawn_area, NULL, hole_callback, NULL, NULL); } static r_dir_t clearPin_callback(const BoxType * b, void *cl) @@ -941,22 +941,22 @@ #endif DrawLayer(LAYER_PTR(max_copper_layer + side), drawn_area); /* draw package */ - r_search(PCB->Data->element_tree, drawn_area, NULL, element_callback, &side); - r_search(PCB->Data->name_tree[NAME_INDEX()], drawn_area, NULL, name_callback, &side); + r_search(PCB->Data->element_tree, drawn_area, NULL, element_callback, &side, NULL); + r_search(PCB->Data->name_tree[NAME_INDEX()], drawn_area, NULL, name_callback, &side, NULL); #if 0 } gui->use_mask(HID_MASK_CLEAR); - r_search(PCB->Data->pin_tree, drawn_area, NULL, clearPin_callback, NULL); - r_search(PCB->Data->via_tree, drawn_area, NULL, clearPin_callback, NULL); - r_search(PCB->Data->pad_tree, drawn_area, NULL, clearPad_callback, &side); + r_search(PCB->Data->pin_tree, drawn_area, NULL, clearPin_callback, NULL, NULL); + r_search(PCB->Data->via_tree, drawn_area, NULL, clearPin_callback, NULL, NULL); + r_search(PCB->Data->pad_tree, drawn_area, NULL, clearPad_callback, &side, NULL); if (gui->poly_after) { gui->use_mask(HID_MASK_AFTER); DrawLayer(LAYER_PTR(max_copper_layer + layer), drawn_area); /* draw package */ - r_search(PCB->Data->element_tree, drawn_area, NULL, element_callback, &side); - r_search(PCB->Data->name_tree[NAME_INDEX()], drawn_area, NULL, name_callback, &side); + r_search(PCB->Data->element_tree, drawn_area, NULL, element_callback, &side, NULL); + r_search(PCB->Data->name_tree[NAME_INDEX()], drawn_area, NULL, name_callback, &side, NULL); } gui->use_mask(HID_MASK_OFF); #endif @@ -991,9 +991,9 @@ gui->use_mask(HID_MASK_CLEAR); } - r_search(PCB->Data->pin_tree, screen, NULL, clearPin_callback, NULL); - r_search(PCB->Data->via_tree, screen, NULL, clearPin_callback, NULL); - r_search(PCB->Data->pad_tree, screen, NULL, clearPad_callback, &side); + r_search(PCB->Data->pin_tree, screen, NULL, clearPin_callback, NULL, NULL); + r_search(PCB->Data->via_tree, screen, NULL, clearPin_callback, NULL, NULL); + r_search(PCB->Data->pad_tree, screen, NULL, clearPad_callback, &side, NULL); if (thin) gui->set_color(Output.pmGC, "erase"); @@ -1032,7 +1032,7 @@ if (can_mask) gui->use_mask(HID_MASK_CLEAR); - r_search(PCB->Data->rat_tree, drawn_area, NULL, rat_callback, NULL); + r_search(PCB->Data->rat_tree, drawn_area, NULL, rat_callback, NULL, NULL); if (can_mask) gui->use_mask(HID_MASK_OFF); } @@ -1060,19 +1060,19 @@ struct poly_info info = { screen, Layer }; /* print the non-clearing polys */ - r_search(Layer->polygon_tree, screen, NULL, poly_callback, &info); + r_search(Layer->polygon_tree, screen, NULL, poly_callback, &info, NULL); if (conf_core.editor.check_planes) return; /* draw all visible lines this layer */ - r_search(Layer->line_tree, screen, NULL, line_callback, Layer); + r_search(Layer->line_tree, screen, NULL, line_callback, Layer, NULL); /* draw the layer arcs on screen */ - r_search(Layer->arc_tree, screen, NULL, arc_callback, Layer); + r_search(Layer->arc_tree, screen, NULL, arc_callback, Layer, NULL); /* draw the layer text on screen */ - r_search(Layer->text_tree, screen, NULL, text_callback, Layer); + r_search(Layer->text_tree, screen, NULL, text_callback, Layer, NULL); /* We should check for gui->gui here, but it's kinda cool seeing the auto-outline magically disappear when you first add something to Index: trunk/src/find_deadcode.c =================================================================== --- trunk/src/find_deadcode.c (revision 2422) +++ trunk/src/find_deadcode.c (revision 2423) @@ -69,11 +69,11 @@ info.line = *line; EXPAND_BOUNDS(&info.line); if (setjmp(info.env) == 0) - r_search(PCB->Data->via_tree, (BoxType *) & info.line, NULL, pv_touch_callback, &info); + r_search(PCB->Data->via_tree, (BoxType *) & info.line, NULL, pv_touch_callback, &info, NULL); else return true; if (setjmp(info.env) == 0) - r_search(PCB->Data->pin_tree, (BoxType *) & info.line, NULL, pv_touch_callback, &info); + r_search(PCB->Data->pin_tree, (BoxType *) & info.line, NULL, pv_touch_callback, &info, NULL); else return true; @@ -103,11 +103,11 @@ /* find the first line that touches coordinates */ if (setjmp(info.env) == 0) - r_search(LAYER_PTR(layer)->line_tree, (BoxType *) & info.line, NULL, LOT_Linecallback, &info); + r_search(LAYER_PTR(layer)->line_tree, (BoxType *) & info.line, NULL, LOT_Linecallback, &info, NULL); else return (true); if (setjmp(info.env) == 0) - r_search(LAYER_PTR(layer)->arc_tree, (BoxType *) & info.line, NULL, LOT_Arccallback, &info); + r_search(LAYER_PTR(layer)->arc_tree, (BoxType *) & info.line, NULL, LOT_Arccallback, &info, NULL); else return (true); @@ -122,7 +122,7 @@ /* handle special 'pad' layers */ info.layer = layer - max_copper_layer; if (setjmp(info.env) == 0) - r_search(PCB->Data->pad_tree, &info.line.BoundingBox, NULL, LOT_Padcallback, &info); + r_search(PCB->Data->pad_tree, &info.line.BoundingBox, NULL, LOT_Padcallback, &info, NULL); else return true; } Index: trunk/src/find_lookup.c =================================================================== --- trunk/src/find_lookup.c (revision 2422) +++ trunk/src/find_lookup.c (revision 2423) @@ -374,7 +374,7 @@ /* check pads */ if (setjmp(info.env) == 0) - r_search(PCB->Data->pad_tree, (BoxType *) & info.pv, NULL, LOCtoPVpad_callback, &info); + r_search(PCB->Data->pad_tree, (BoxType *) & info.pv, NULL, LOCtoPVpad_callback, &info, NULL); else return true; @@ -385,17 +385,17 @@ info.layer = layer; /* add touching lines */ if (setjmp(info.env) == 0) - r_search(LAYER_PTR(layer)->line_tree, (BoxType *) & info.pv, NULL, LOCtoPVline_callback, &info); + r_search(LAYER_PTR(layer)->line_tree, (BoxType *) & info.pv, NULL, LOCtoPVline_callback, &info, NULL); else return true; /* add touching arcs */ if (setjmp(info.env) == 0) - r_search(LAYER_PTR(layer)->arc_tree, (BoxType *) & info.pv, NULL, LOCtoPVarc_callback, &info); + r_search(LAYER_PTR(layer)->arc_tree, (BoxType *) & info.pv, NULL, LOCtoPVarc_callback, &info, NULL); else return true; /* check all polygons */ if (setjmp(info.env) == 0) - r_search(LAYER_PTR(layer)->polygon_tree, (BoxType *) & info.pv, NULL, LOCtoPVpoly_callback, &info); + r_search(LAYER_PTR(layer)->polygon_tree, (BoxType *) & info.pv, NULL, LOCtoPVpoly_callback, &info, NULL); else return true; } @@ -402,7 +402,7 @@ /* Check for rat-lines that may intersect the PV */ if (AndRats) { if (setjmp(info.env) == 0) - r_search(PCB->Data->rat_tree, (BoxType *) & info.pv, NULL, LOCtoPVrat_callback, &info); + r_search(PCB->Data->rat_tree, (BoxType *) & info.pv, NULL, LOCtoPVrat_callback, &info, NULL); else return true; } @@ -567,11 +567,11 @@ EXPAND_BOUNDS(&info.pv); if (setjmp(info.env) == 0) - r_search(PCB->Data->via_tree, (BoxType *) & info.pv, NULL, pv_pv_callback, &info); + r_search(PCB->Data->via_tree, (BoxType *) & info.pv, NULL, pv_pv_callback, &info, NULL); else return true; if (setjmp(info.env) == 0) - r_search(PCB->Data->pin_tree, (BoxType *) & info.pv, NULL, pv_pv_callback, &info); + r_search(PCB->Data->pin_tree, (BoxType *) & info.pv, NULL, pv_pv_callback, &info, NULL); else return true; PVList.Location++; @@ -710,11 +710,11 @@ info.line = *(LINELIST_ENTRY(layer, LineList[layer].Location)); EXPAND_BOUNDS(&info.line); if (setjmp(info.env) == 0) - r_search(PCB->Data->via_tree, (BoxType *) & info.line, NULL, pv_line_callback, &info); + r_search(PCB->Data->via_tree, (BoxType *) & info.line, NULL, pv_line_callback, &info, NULL); else return true; if (setjmp(info.env) == 0) - r_search(PCB->Data->pin_tree, (BoxType *) & info.line, NULL, pv_line_callback, &info); + r_search(PCB->Data->pin_tree, (BoxType *) & info.line, NULL, pv_line_callback, &info, NULL); else return true; LineList[layer].Location++; @@ -725,11 +725,11 @@ info.arc = *(ARCLIST_ENTRY(layer, ArcList[layer].Location)); EXPAND_BOUNDS(&info.arc); if (setjmp(info.env) == 0) - r_search(PCB->Data->via_tree, (BoxType *) & info.arc, NULL, pv_arc_callback, &info); + r_search(PCB->Data->via_tree, (BoxType *) & info.arc, NULL, pv_arc_callback, &info, NULL); else return true; if (setjmp(info.env) == 0) - r_search(PCB->Data->pin_tree, (BoxType *) & info.arc, NULL, pv_arc_callback, &info); + r_search(PCB->Data->pin_tree, (BoxType *) & info.arc, NULL, pv_arc_callback, &info, NULL); else return true; ArcList[layer].Location++; @@ -741,11 +741,11 @@ info.polygon = *(POLYGONLIST_ENTRY(layer, PolygonList[layer].Location)); EXPAND_BOUNDS(&info.polygon); if (setjmp(info.env) == 0) - r_search(PCB->Data->via_tree, (BoxType *) & info.polygon, NULL, pv_poly_callback, &info); + r_search(PCB->Data->via_tree, (BoxType *) & info.polygon, NULL, pv_poly_callback, &info, NULL); else return true; if (setjmp(info.env) == 0) - r_search(PCB->Data->pin_tree, (BoxType *) & info.polygon, NULL, pv_poly_callback, &info); + r_search(PCB->Data->pin_tree, (BoxType *) & info.polygon, NULL, pv_poly_callback, &info, NULL); else return true; PolygonList[layer].Location++; @@ -767,11 +767,11 @@ info.pad = *(PADLIST_ENTRY(layer, PadList[layer].Location)); EXPAND_BOUNDS(&info.pad); if (setjmp(info.env) == 0) - r_search(PCB->Data->via_tree, (BoxType *) & info.pad, NULL, pv_pad_callback, &info); + r_search(PCB->Data->via_tree, (BoxType *) & info.pad, NULL, pv_pad_callback, &info, NULL); else return true; if (setjmp(info.env) == 0) - r_search(PCB->Data->pin_tree, (BoxType *) & info.pad, NULL, pv_pad_callback, &info); + r_search(PCB->Data->pin_tree, (BoxType *) & info.pad, NULL, pv_pad_callback, &info, NULL); else return true; PadList[layer].Location++; @@ -786,10 +786,10 @@ if (AndRats) { while (RatList.Location < RatList.Number) { info.rat = *(RATLIST_ENTRY(RatList.Location)); - r_search_pt(PCB->Data->via_tree, &info.rat.Point1, 1, NULL, pv_rat_callback, &info); - r_search_pt(PCB->Data->via_tree, &info.rat.Point2, 1, NULL, pv_rat_callback, &info); - r_search_pt(PCB->Data->pin_tree, &info.rat.Point1, 1, NULL, pv_rat_callback, &info); - r_search_pt(PCB->Data->pin_tree, &info.rat.Point2, 1, NULL, pv_rat_callback, &info); + r_search_pt(PCB->Data->via_tree, &info.rat.Point1, 1, NULL, pv_rat_callback, &info, NULL); + r_search_pt(PCB->Data->via_tree, &info.rat.Point2, 1, NULL, pv_rat_callback, &info, NULL); + r_search_pt(PCB->Data->pin_tree, &info.rat.Point1, 1, NULL, pv_rat_callback, &info, NULL); + r_search_pt(PCB->Data->pin_tree, &info.rat.Point2, 1, NULL, pv_rat_callback, &info, NULL); RatList.Location++; } @@ -872,12 +872,12 @@ info.layer = layer; /* add arcs */ if (setjmp(info.env) == 0) - r_search(LAYER_PTR(layer)->line_tree, &info.arc.BoundingBox, NULL, LOCtoArcLine_callback, &info); + r_search(LAYER_PTR(layer)->line_tree, &info.arc.BoundingBox, NULL, LOCtoArcLine_callback, &info, NULL); else return true; if (setjmp(info.env) == 0) - r_search(LAYER_PTR(layer)->arc_tree, &info.arc.BoundingBox, NULL, LOCtoArcArc_callback, &info); + r_search(LAYER_PTR(layer)->arc_tree, &info.arc.BoundingBox, NULL, LOCtoArcArc_callback, &info, NULL); else return true; @@ -891,7 +891,7 @@ else { info.layer = layer - max_copper_layer; if (setjmp(info.env) == 0) - r_search(PCB->Data->pad_tree, &info.arc.BoundingBox, NULL, LOCtoArcPad_callback, &info); + r_search(PCB->Data->pad_tree, &info.arc.BoundingBox, NULL, LOCtoArcPad_callback, &info, NULL); else return true; } @@ -973,7 +973,7 @@ EXPAND_BOUNDS(&info.line) /* add the new rat lines */ if (setjmp(info.env) == 0) - r_search(PCB->Data->rat_tree, &info.line.BoundingBox, NULL, LOCtoLineRat_callback, &info); + r_search(PCB->Data->rat_tree, &info.line.BoundingBox, NULL, LOCtoLineRat_callback, &info, NULL); else return true; @@ -988,12 +988,12 @@ info.layer = layer; /* add lines */ if (setjmp(info.env) == 0) - r_search(LAYER_PTR(layer)->line_tree, (BoxType *) & info.line, NULL, LOCtoLineLine_callback, &info); + r_search(LAYER_PTR(layer)->line_tree, (BoxType *) & info.line, NULL, LOCtoLineLine_callback, &info, NULL); else return true; /* add arcs */ if (setjmp(info.env) == 0) - r_search(LAYER_PTR(layer)->arc_tree, (BoxType *) & info.line, NULL, LOCtoLineArc_callback, &info); + r_search(LAYER_PTR(layer)->arc_tree, (BoxType *) & info.line, NULL, LOCtoLineArc_callback, &info, NULL); else return true; /* now check all polygons */ @@ -1012,7 +1012,7 @@ /* handle special 'pad' layers */ info.layer = layer - max_copper_layer; if (setjmp(info.env) == 0) - r_search(PCB->Data->pad_tree, &info.line.BoundingBox, NULL, LOCtoLinePad_callback, &info); + r_search(PCB->Data->pad_tree, &info.line.BoundingBox, NULL, LOCtoLinePad_callback, &info, NULL); else return true; } @@ -1097,17 +1097,17 @@ if (layer < max_copper_layer) { info.layer = layer; if (setjmp(info.env) == 0) - r_search_pt(LAYER_PTR(layer)->line_tree, Point, 1, NULL, LOCtoRat_callback, &info); + r_search_pt(LAYER_PTR(layer)->line_tree, Point, 1, NULL, LOCtoRat_callback, &info, NULL); else return true; if (setjmp(info.env) == 0) - r_search_pt(LAYER_PTR(layer)->polygon_tree, Point, 1, NULL, PolygonToRat_callback, &info); + r_search_pt(LAYER_PTR(layer)->polygon_tree, Point, 1, NULL, PolygonToRat_callback, &info, NULL); } else { /* handle special 'pad' layers */ info.layer = layer - max_copper_layer; if (setjmp(info.env) == 0) - r_search_pt(PCB->Data->pad_tree, Point, 1, NULL, LOCtoPad_callback, &info); + r_search_pt(PCB->Data->pad_tree, Point, 1, NULL, LOCtoPad_callback, &info, NULL); else return true; } @@ -1250,7 +1250,7 @@ /* add the new rat lines */ info.layer = LayerGroup; if (setjmp(info.env) == 0) - r_search(PCB->Data->rat_tree, &info.pad.BoundingBox, NULL, LOCtoPadRat_callback, &info); + r_search(PCB->Data->rat_tree, &info.pad.BoundingBox, NULL, LOCtoPadRat_callback, &info, NULL); else return true; @@ -1264,17 +1264,17 @@ info.layer = layer; /* add lines */ if (setjmp(info.env) == 0) - r_search(LAYER_PTR(layer)->line_tree, &info.pad.BoundingBox, NULL, LOCtoPadLine_callback, &info); + r_search(LAYER_PTR(layer)->line_tree, &info.pad.BoundingBox, NULL, LOCtoPadLine_callback, &info, NULL); else return true; /* add arcs */ if (setjmp(info.env) == 0) - r_search(LAYER_PTR(layer)->arc_tree, &info.pad.BoundingBox, NULL, LOCtoPadArc_callback, &info); + r_search(LAYER_PTR(layer)->arc_tree, &info.pad.BoundingBox, NULL, LOCtoPadArc_callback, &info, NULL); else return true; /* add polygons */ if (setjmp(info.env) == 0) - r_search(LAYER_PTR(layer)->polygon_tree, &info.pad.BoundingBox, NULL, LOCtoPadPoly_callback, &info); + r_search(LAYER_PTR(layer)->polygon_tree, &info.pad.BoundingBox, NULL, LOCtoPadPoly_callback, &info, NULL); else return true; } @@ -1282,7 +1282,7 @@ /* handle special 'pad' layers */ info.layer = layer - max_copper_layer; if (setjmp(info.env) == 0) - r_search(PCB->Data->pad_tree, (BoxType *) & info.pad, NULL, LOCtoPadPad_callback, &info); + r_search(PCB->Data->pad_tree, (BoxType *) & info.pad, NULL, LOCtoPadPad_callback, &info, NULL); else return true; } @@ -1364,7 +1364,7 @@ info.layer = LayerGroup; /* check rats */ if (setjmp(info.env) == 0) - r_search(PCB->Data->rat_tree, (BoxType *) & info.polygon, NULL, LOCtoPolyRat_callback, &info); + r_search(PCB->Data->rat_tree, (BoxType *) & info.polygon, NULL, LOCtoPolyRat_callback, &info, NULL); else return true; /* loop over all layers of the group */ @@ -1389,12 +1389,12 @@ info.layer = layer; /* check all lines */ if (setjmp(info.env) == 0) - r_search(LAYER_PTR(layer)->line_tree, (BoxType *) & info.polygon, NULL, LOCtoPolyLine_callback, &info); + r_search(LAYER_PTR(layer)->line_tree, (BoxType *) & info.polygon, NULL, LOCtoPolyLine_callback, &info, NULL); else return true; /* check all arcs */ if (setjmp(info.env) == 0) - r_search(LAYER_PTR(layer)->arc_tree, (BoxType *) & info.polygon, NULL, LOCtoPolyArc_callback, &info); + r_search(LAYER_PTR(layer)->arc_tree, (BoxType *) & info.polygon, NULL, LOCtoPolyArc_callback, &info, NULL); else return true; } @@ -1401,7 +1401,7 @@ else { info.layer = layer - max_copper_layer; if (setjmp(info.env) == 0) - r_search(PCB->Data->pad_tree, (BoxType *) & info.polygon, NULL, LOCtoPolyPad_callback, &info); + r_search(PCB->Data->pad_tree, (BoxType *) & info.polygon, NULL, LOCtoPolyPad_callback, &info, NULL); else return true; } Index: trunk/src/line.c =================================================================== --- trunk/src/line.c (revision 2422) +++ trunk/src/line.c (revision 2423) @@ -357,26 +357,26 @@ last2 = length2; if (setjmp(info.env) == 0) { info.line = &line1; - r_search(PCB->Data->via_tree, &line1.BoundingBox, NULL, drcVia_callback, &info); - r_search(PCB->Data->pin_tree, &line1.BoundingBox, NULL, drcVia_callback, &info); + r_search(PCB->Data->via_tree, &line1.BoundingBox, NULL, drcVia_callback, &info, NULL); + r_search(PCB->Data->pin_tree, &line1.BoundingBox, NULL, drcVia_callback, &info, NULL); if (info.solder || comp == group) - r_search(PCB->Data->pad_tree, &line1.BoundingBox, NULL, drcPad_callback, &info); + r_search(PCB->Data->pad_tree, &line1.BoundingBox, NULL, drcPad_callback, &info, NULL); if (two_lines) { info.line = &line2; - r_search(PCB->Data->via_tree, &line2.BoundingBox, NULL, drcVia_callback, &info); - r_search(PCB->Data->pin_tree, &line2.BoundingBox, NULL, drcVia_callback, &info); + r_search(PCB->Data->via_tree, &line2.BoundingBox, NULL, drcVia_callback, &info, NULL); + r_search(PCB->Data->pin_tree, &line2.BoundingBox, NULL, drcVia_callback, &info, NULL); if (info.solder || comp == group) - r_search(PCB->Data->pad_tree, &line2.BoundingBox, NULL, drcPad_callback, &info); + r_search(PCB->Data->pad_tree, &line2.BoundingBox, NULL, drcPad_callback, &info, NULL); } GROUP_LOOP(PCB->Data, group); { info.line = &line1; - r_search(layer->line_tree, &line1.BoundingBox, NULL, drcLine_callback, &info); - r_search(layer->arc_tree, &line1.BoundingBox, NULL, drcArc_callback, &info); + r_search(layer->line_tree, &line1.BoundingBox, NULL, drcLine_callback, &info, NULL); + r_search(layer->arc_tree, &line1.BoundingBox, NULL, drcArc_callback, &info, NULL); if (two_lines) { info.line = &line2; - r_search(layer->line_tree, &line2.BoundingBox, NULL, drcLine_callback, &info); - r_search(layer->arc_tree, &line2.BoundingBox, NULL, drcArc_callback, &info); + r_search(layer->line_tree, &line2.BoundingBox, NULL, drcLine_callback, &info, NULL); + r_search(layer->arc_tree, &line2.BoundingBox, NULL, drcArc_callback, &info, NULL); } } END_LOOP; Index: trunk/src/misc.c =================================================================== --- trunk/src/misc.c (revision 2422) +++ trunk/src/misc.c (revision 2423) @@ -551,8 +551,8 @@ { HoleCountStruct hcs = { 0, 0 }; - r_search(PCB->Data->pin_tree, within_area, NULL, hole_counting_callback, &hcs); - r_search(PCB->Data->via_tree, within_area, NULL, hole_counting_callback, &hcs); + r_search(PCB->Data->pin_tree, within_area, NULL, hole_counting_callback, &hcs, NULL); + r_search(PCB->Data->via_tree, within_area, NULL, hole_counting_callback, &hcs, NULL); if (plated != NULL) *plated = hcs.nplated; Index: trunk/src/move.c =================================================================== --- trunk/src/move.c (revision 2422) +++ trunk/src/move.c (revision 2423) @@ -545,7 +545,7 @@ info.X = newone->Point1.X; info.Y = newone->Point1.Y; if (setjmp(info.env) == 0) - r_search(Layer->line_tree, &sb, NULL, moveline_callback, &info); + r_search(Layer->line_tree, &sb, NULL, moveline_callback, &info, NULL); } /* consider via at Point2 */ sb.X1 = newone->Point2.X - newone->Thickness / 2; @@ -557,7 +557,7 @@ info.X = newone->Point2.X; info.Y = newone->Point2.Y; if (setjmp(info.env) == 0) - r_search(Layer->line_tree, &sb, NULL, moveline_callback, &info); + r_search(Layer->line_tree, &sb, NULL, moveline_callback, &info, NULL); } Draw(); return (newone); @@ -671,9 +671,9 @@ d.dnum = GetLayerNumber(PCB->Data, Dest); d.polygon = Polygon; d.type = PIN_TYPE; - r_search(PCB->Data->pin_tree, &Polygon->BoundingBox, NULL, mptl_pin_callback, &d); + r_search(PCB->Data->pin_tree, &Polygon->BoundingBox, NULL, mptl_pin_callback, &d, NULL); d.type = VIA_TYPE; - r_search(PCB->Data->via_tree, &Polygon->BoundingBox, NULL, mptl_pin_callback, &d); + r_search(PCB->Data->via_tree, &Polygon->BoundingBox, NULL, mptl_pin_callback, &d, NULL); newone = (struct polygon_st *) MovePolygonToLayerLowLevel(Layer, Polygon, Dest); InitClip(PCB->Data, Dest, newone); if (Dest->On) { Index: trunk/src/polygon.c =================================================================== --- trunk/src/polygon.c (revision 2422) +++ trunk/src/polygon.c (revision 2423) @@ -1000,7 +1000,7 @@ static int clearPoly(DataTypePtr Data, LayerTypePtr Layer, PolygonType * polygon, const BoxType * here, Coord expand) { - int r = 0; + int r = 0, seen; BoxType region; struct cpInfo info; Cardinal group; @@ -1024,18 +1024,25 @@ r = 0; info.accumulate = NULL; info.batch_size = 0; - if (info.solder || group == Group(Data, component_silk_layer)) - r += r_search(Data->pad_tree, ®ion, NULL, pad_sub_callback, &info); + if (info.solder || group == Group(Data, component_silk_layer)) { + r_search(Data->pad_tree, ®ion, NULL, pad_sub_callback, &info, &seen); + r += seen; + } GROUP_LOOP(Data, group); { - r += r_search(layer->line_tree, ®ion, NULL, line_sub_callback, &info); + r_search(layer->line_tree, ®ion, NULL, line_sub_callback, &info, &seen); + r += seen; subtract_accumulated(&info, polygon); - r += r_search(layer->arc_tree, ®ion, NULL, arc_sub_callback, &info); - r += r_search(layer->text_tree, ®ion, NULL, text_sub_callback, &info); + r_search(layer->arc_tree, ®ion, NULL, arc_sub_callback, &info, &seen); + r += seen; + r_search(layer->text_tree, ®ion, NULL, text_sub_callback, &info, &seen); + r += seen; } END_LOOP; - r += r_search(Data->via_tree, ®ion, NULL, pin_sub_callback, &info); - r += r_search(Data->pin_tree, ®ion, NULL, pin_sub_callback, &info); + r_search(Data->via_tree, ®ion, NULL, pin_sub_callback, &info, &seen); + r += seen; + r_search(Data->pin_tree, ®ion, NULL, pin_sub_callback, &info, &seen); + r += seen; subtract_accumulated(&info, polygon); } polygon->NoHolesValid = 0; @@ -1454,7 +1461,7 @@ r_dir_t (*call_back) (DataTypePtr data, LayerTypePtr lay, PolygonTypePtr poly, int type, void *ptr1, void *ptr2)) { BoxType sb = ((PinTypePtr) ptr2)->BoundingBox; - int r = 0; + int r = 0, seen; struct plow_info info; info.type = type; @@ -1469,7 +1476,8 @@ LAYER_LOOP(Data, max_copper_layer); { info.layer = layer; - r += r_search(layer->polygon_tree, &sb, NULL, plow_callback, &info); + r_search(layer->polygon_tree, &sb, NULL, plow_callback, &info, &seen); + r += seen; } END_LOOP; } @@ -1477,7 +1485,8 @@ GROUP_LOOP(Data, GetLayerGroupNumberByNumber(GetLayerNumber(Data, ((LayerTypePtr) ptr1)))); { info.layer = layer; - r += r_search(layer->polygon_tree, &sb, NULL, plow_callback, &info); + r_search(layer->polygon_tree, &sb, NULL, plow_callback, &info, &seen); + r += seen; } END_LOOP; } @@ -1494,7 +1503,8 @@ GROUP_LOOP(Data, GetLayerGroupNumberByNumber(GetLayerNumber(Data, ((LayerTypePtr) ptr1)))); { info.layer = layer; - r += r_search(layer->polygon_tree, &sb, NULL, plow_callback, &info); + r_search(layer->polygon_tree, &sb, NULL, plow_callback, &info, &seen); + r += seen; } END_LOOP; break; @@ -1505,7 +1515,8 @@ GROUP_LOOP(Data, group); { info.layer = layer; - r += r_search(layer->polygon_tree, &sb, NULL, plow_callback, &info); + r_search(layer->polygon_tree, &sb, NULL, plow_callback, &info, &seen); + r += seen; } END_LOOP; } Index: trunk/src/polygon1.c =================================================================== --- trunk/src/polygon1.c (revision 2422) +++ trunk/src/polygon1.c (revision 2423) @@ -721,7 +721,7 @@ /* fill in the segment in info corresponding to this node */ if (setjmp(info.sego) == 0) { - r_search(looping_over->tree, &box, NULL, get_seg, &info); + r_search(looping_over->tree, &box, NULL, get_seg, &info, NULL); assert(0); } @@ -734,9 +734,12 @@ /* NB: If this actually hits anything, we are teleported back to the beginning */ info.tree = rtree_over->tree; - if (info.tree) - if (UNLIKELY(r_search(info.tree, &info.s->box, seg_in_region, seg_in_seg, &info))) + if (info.tree) { + int seen; + r_search(info.tree, &info.s->box, seg_in_region, seg_in_seg, &info, &seen); + if (UNLIKELY(seen)) assert(0); /* XXX: Memory allocation failure */ + } } while ((av = av->next) != &looping_over->head); @@ -788,7 +791,7 @@ sb.X2 = pa->xmax + 1; sb.Y2 = pa->ymax + 1; - r_search(b->contour_tree, &sb, NULL, contour_bounds_touch, &c_info); + r_search(b->contour_tree, &sb, NULL, contour_bounds_touch, &c_info, NULL); if (c_info.need_restart) need_restart = 1; } @@ -903,11 +906,14 @@ * but we must loop in case the box containter is not * the poly container */ do { + int cnt; + if (heap_is_empty(heap)) break; outer = (POLYAREA *) heap_remove_smallest(heap); - switch (r_search(outer->contour_tree, (BoxType *) poly, NULL, count_contours_i_am_inside, poly)) { + r_search(outer->contour_tree, (BoxType *) poly, NULL, count_contours_i_am_inside, poly, &cnt); + switch (cnt) { case 0: /* Didn't find anything in this piece, Keep looking */ break; case 1: /* Found we are inside this piece, and not any of its holes */ @@ -1205,7 +1211,7 @@ container = NULL; /* build a heap of all of the polys that the hole is inside its bounding box */ heap = heap_create(); - r_search(tree, (BoxType *) curh, NULL, heap_it, heap); + r_search(tree, (BoxType *) curh, NULL, heap_it, heap, NULL); if (heap_is_empty(heap)) { #ifndef NDEBUG #ifdef DEBUG @@ -1264,7 +1270,7 @@ info.result = NULL; /* Rtree search, calling back a routine to longjmp back with data about any hole inside the added one */ /* Be sure not to bother jumping back to report the main contour! */ - r_search(pa_info->pa->contour_tree, (BoxType *) curh, NULL, find_inside, &info); + r_search(pa_info->pa->contour_tree, (BoxType *) curh, NULL, find_inside, &info, NULL); /* Nothing found? */ break; @@ -1855,7 +1861,7 @@ * data about any hole inside the B polygon. * NB: Does not jump back to report the main contour! */ - r_search(a->contour_tree, &box, NULL, find_inside_m_pa, &info); + r_search(a->contour_tree, &box, NULL, find_inside_m_pa, &info, NULL); /* Nothing found? */ break; @@ -2371,7 +2377,7 @@ #ifndef NDEBUG r = #endif - r_search(c->tree, NULL, NULL, flip_cb, NULL); + r_search(c->tree, NULL, NULL, flip_cb, NULL, NULL); #ifndef NDEBUG assert(r == c->Count); #endif @@ -2579,7 +2585,7 @@ ray.X2 = 0x7fffffff; ray.Y2 = p[1] + 1; if (setjmp(info.env) == 0) - r_search(c->tree, &ray, NULL, crossing, &info); + r_search(c->tree, &ray, NULL, crossing, &info, NULL); return info.f; } Index: trunk/src/remove.c =================================================================== --- trunk/src/remove.c (revision 2422) +++ trunk/src/remove.c (revision 2423) @@ -329,7 +329,7 @@ info.line = Line; info.point = Point; if (setjmp(info.env) == 0) { - r_search(Layer->line_tree, (const BoxType *) Point, NULL, remove_point, &info); + r_search(Layer->line_tree, (const BoxType *) Point, NULL, remove_point, &info, NULL); return RemoveLine(Layer, Line); } MoveObject(LINEPOINT_TYPE, Layer, info.line, info.point, other.X - Point->X, other.Y - Point->Y); Index: trunk/src/rtree.c =================================================================== --- trunk/src/rtree.c (revision 2422) +++ trunk/src/rtree.c (revision 2423) @@ -399,6 +399,7 @@ r_dir_t (*check_it) (const BoxType * region, void *cl); r_dir_t (*found_it) (const BoxType * box, void *cl); void *closure; + int cancel; } r_arg; /* most of the auto-routing time is spent in this routine @@ -407,6 +408,8 @@ */ int __r_search(struct rtree_node *node, const BoxType * query, r_arg * arg) { + r_dir_t res; + assert(node); /** assert that starting_region is well formed */ assert(query->X1 < query->X2 && query->Y1 < query->Y2); @@ -427,8 +430,15 @@ if ((node->u.rects[i].bounds.X1 < query->X2) && (node->u.rects[i].bounds.X2 > query->X1) && (node->u.rects[i].bounds.Y1 < query->Y2) && - (node->u.rects[i].bounds.Y2 > query->Y1) && arg->found_it(node->u.rects[i].bptr, arg->closure)) - seen++; + (node->u.rects[i].bounds.Y2 > query->Y1)) { + res = arg->found_it(node->u.rects[i].bptr, arg->closure); + if (res == R_DIR_CANCEL) { + arg->cancel = 1; + return seen; + } + if (res != R_DIR_NOT_FOUND) + seen++; + } } return seen; } @@ -445,15 +455,24 @@ } /* not a leaf, recurse on lower nodes */ - if (arg->check_it) { + if (arg->check_it != NULL) { int seen = 0; struct rtree_node **n; for (n = &node->u.kids[0]; *n; n++) { if ((*n)->box.X1 >= query->X2 || (*n)->box.X2 <= query->X1 || - (*n)->box.Y1 >= query->Y2 || (*n)->box.Y2 <= query->Y1 || !arg->check_it(&(*n)->box, arg->closure)) + (*n)->box.Y1 >= query->Y2 || (*n)->box.Y2 <= query->Y1) continue; + res = arg->check_it(&(*n)->box, arg->closure); + if (res == R_DIR_CANCEL) { + arg->cancel = 1; + return seen; + } + if (!res) + continue; seen += __r_search(*n, query, arg); + if (arg->cancel) + break; } return seen; } @@ -463,7 +482,9 @@ for (n = &node->u.kids[0]; *n; n++) { if ((*n)->box.X1 >= query->X2 || (*n)->box.X2 <= query->X1 || (*n)->box.Y1 >= query->Y2 || (*n)->box.Y2 <= query->Y1) continue; - seen += __r_search(*n, query, arg); + seen += __r_search(*n, query, arg); + if (arg->cancel) + break; } return seen; } @@ -470,20 +491,25 @@ } /* Parameterized search in the rtree. - * Returns the number of rectangles found. + * Sets num_found to the number of rectangles found. * calls found_rectangle for each intersection seen * and calls check_region with the current sub-region * to see whether deeper searching is desired + * Returns how the search ended. */ -int +r_dir_t r_search(rtree_t * rtree, const BoxType * query, r_dir_t (*check_region) (const BoxType * region, void *cl), - r_dir_t (*found_rectangle) (const BoxType * box, void *cl), void *cl) + r_dir_t (*found_rectangle) (const BoxType * box, void *cl), void *cl, + int *num_found) { r_arg arg; + int res = 0; + arg.cancel = 0; + if (!rtree || rtree->size < 1) - return 0; + goto ret; if (query) { #ifdef SLOW_ASSERTS assert(__r_tree_is_good(rtree->root)); @@ -490,23 +516,33 @@ #endif #ifdef DEBUG if (query->X2 <= query->X1 || query->Y2 <= query->Y1) - return 0; + goto ret; #endif /* check this box. If it's not touched we're done here */ if (rtree->root->box.X1 >= query->X2 || rtree->root->box.X2 <= query->X1 || rtree->root->box.Y1 >= query->Y2 || rtree->root->box.Y2 <= query->Y1) - return 0; + goto ret; arg.check_it = check_region; arg.found_it = found_rectangle; arg.closure = cl; - return __r_search(rtree->root, query, &arg); + + res = __r_search(rtree->root, query, &arg); } else { arg.check_it = check_region; arg.found_it = found_rectangle; arg.closure = cl; - return __r_search(rtree->root, &rtree->root->box, &arg); + res = __r_search(rtree->root, &rtree->root->box, &arg); } + +ret:; + if (num_found != NULL) + *num_found = res; + if (arg.cancel) + return R_DIR_CANCEL; + if (res == 0) + return R_DIR_NOT_FOUND; + return R_DIR_FOUND_CONTINUE; } /*------ r_region_is_empty ------*/ @@ -520,19 +556,12 @@ int r_region_is_empty(rtree_t * rtree, const BoxType * region) { jmp_buf env; -#ifndef NDEBUG int r; -#endif if (setjmp(env)) return 0; -#ifndef NDEBUG - r = -#endif - r_search(rtree, region, NULL, __r_region_is_empty_rect_in_reg, &env); -#ifndef NDEBUG + r_search(rtree, region, NULL, __r_region_is_empty_rect_in_reg, &env, &r); assert(r == 0); /* otherwise longjmp would have been called */ -#endif return 1; /* no rectangles found */ } Index: trunk/src/rtree.h =================================================================== --- trunk/src/rtree.h (revision 2422) +++ trunk/src/rtree.h (revision 2423) @@ -43,7 +43,7 @@ typedef enum r_dir_e { R_DIR_NOT_FOUND = 0, /* object not found or not accepted */ R_DIR_FOUND_CONTINUE = 1, /* object found or accepted, go on searching */ - R_DIR_FOUND_CANCEL /* object found or accepted, cancel the search and return */ + R_DIR_CANCEL /* cancel the search and return immediately */ } r_dir_t; /* create an rtree from the list of boxes. if 'manage' is true, then @@ -70,13 +70,15 @@ * abort the search if that is the desired behavior. */ -int r_search(rtree_t * rtree, const BoxType * starting_region, +r_dir_t r_search(rtree_t * rtree, const BoxType * starting_region, r_dir_t (*region_in_search) (const BoxType * region, void *cl), - r_dir_t (*rectangle_in_region) (const BoxType * box, void *cl), void *closure); -static inline int r_search_pt(rtree_t * rtree, const PointType * pt, + r_dir_t (*rectangle_in_region) (const BoxType * box, void *cl), void *closure, + int *num_found); +static inline r_dir_t r_search_pt(rtree_t * rtree, const PointType * pt, int radius, r_dir_t (*region_in_search) (const BoxType * region, void *cl), - r_dir_t (*rectangle_in_region) (const BoxType * box, void *cl), void *closure) + r_dir_t (*rectangle_in_region) (const BoxType * box, void *cl), void *closure, + int *num_found) { BoxType box; @@ -85,7 +87,7 @@ box.Y1 = pt->Y - radius; box.Y2 = pt->Y + radius; - return r_search(rtree, &box, region_in_search, rectangle_in_region, closure); + return r_search(rtree, &box, region_in_search, rectangle_in_region, closure, num_found); } /* -- special-purpose searches build upon r_search -- */ Index: trunk/src/rubberband.c =================================================================== --- trunk/src/rubberband.c (revision 2422) +++ trunk/src/rubberband.c (revision 2423) @@ -210,7 +210,7 @@ /* check all visible lines of the group member */ info.layer = layer; if (info.layer->On) { - r_search(info.layer->line_tree, &info.box, NULL, rubber_callback, &info); + r_search(info.layer->line_tree, &info.box, NULL, rubber_callback, &info, NULL); } } END_LOOP; @@ -276,7 +276,7 @@ info.pad = Pad; info.type = PAD_TYPE; - r_search(PCB->Data->rat_tree, &Pad->BoundingBox, NULL, rat_callback, &info); + r_search(PCB->Data->rat_tree, &Pad->BoundingBox, NULL, rat_callback, &info, NULL); } static void CheckPinForRat(PinTypePtr Pin) @@ -285,7 +285,7 @@ info.type = PIN_TYPE; info.pin = Pin; - r_search(PCB->Data->rat_tree, &Pin->BoundingBox, NULL, rat_callback, &info); + r_search(PCB->Data->rat_tree, &Pin->BoundingBox, NULL, rat_callback, &info, NULL); } static void CheckLinePointForRat(LayerTypePtr Layer, PointTypePtr Point) @@ -295,7 +295,7 @@ info.point = Point; info.type = LINEPOINT_TYPE; - r_search(PCB->Data->rat_tree, (BoxType *) Point, NULL, rat_callback, &info); + r_search(PCB->Data->rat_tree, (BoxType *) Point, NULL, rat_callback, &info, NULL); } /* --------------------------------------------------------------------------- @@ -327,7 +327,7 @@ for (n = 0; n < max_copper_layer; n++) { info.layer = LAYER_PTR(n); - r_search(info.layer->line_tree, &info.box, NULL, rubber_callback, &info); + r_search(info.layer->line_tree, &info.box, NULL, rubber_callback, &info, NULL); } } @@ -357,7 +357,7 @@ /* check all visible lines of the group member */ if (layer->On) { info.layer = layer; - r_search(layer->line_tree, &info.box, NULL, rubber_callback, &info); + r_search(layer->line_tree, &info.box, NULL, rubber_callback, &info, NULL); } } END_LOOP; Index: trunk/src/search.c =================================================================== --- trunk/src/search.c (revision 2422) +++ trunk/src/search.c (revision 2423) @@ -117,7 +117,7 @@ info.locked = (locked & LOCKED_TYPE) ? 0 : LOCKFLAG; if (setjmp(info.env) == 0) { - r_search(PCB->Data->via_tree, &SearchBox, NULL, pinorvia_callback, &info); + r_search(PCB->Data->via_tree, &SearchBox, NULL, pinorvia_callback, &info, NULL); return false; } return true; @@ -140,7 +140,7 @@ info.locked = (locked & LOCKED_TYPE) ? 0 : LOCKFLAG; if (setjmp(info.env) == 0) - r_search(PCB->Data->pin_tree, &SearchBox, NULL, pinorvia_callback, &info); + r_search(PCB->Data->pin_tree, &SearchBox, NULL, pinorvia_callback, &info, NULL); else return true; return false; @@ -182,7 +182,7 @@ info.locked = (locked & LOCKED_TYPE) ? 0 : LOCKFLAG; info.BackToo = (BackToo && PCB->InvisibleObjectsOn); if (setjmp(info.env) == 0) - r_search(PCB->Data->pad_tree, &SearchBox, NULL, pad_callback, &info); + r_search(PCB->Data->pad_tree, &SearchBox, NULL, pad_callback, &info, NULL); else return true; return false; @@ -196,7 +196,6 @@ LineTypePtr *Line; PointTypePtr *Point; double least; - jmp_buf env; int locked; }; @@ -212,8 +211,8 @@ return R_DIR_NOT_FOUND; *i->Line = l; *i->Point = (PointTypePtr) l; - longjmp(i->env, 1); - return R_DIR_FOUND_CONTINUE; /* never reached */ + + return R_DIR_CANCEL; /* found what we were looking for */ } @@ -226,11 +225,10 @@ info.locked = (locked & LOCKED_TYPE) ? 0 : LOCKFLAG; *Layer = SearchLayer; - if (setjmp(info.env) == 0) { - r_search(SearchLayer->line_tree, &SearchBox, NULL, line_callback, &info); - return false; - } - return (true); + if (r_search(SearchLayer->line_tree, &SearchBox, NULL, line_callback, &info, NULL) != R_DIR_NOT_FOUND) + return true; + + return false; } static r_dir_t rat_callback(const BoxType * box, void *cl) @@ -263,7 +261,7 @@ info.locked = (locked & LOCKED_TYPE) ? 0 : LOCKFLAG; if (setjmp(info.env) == 0) { - r_search(PCB->Data->rat_tree, &SearchBox, NULL, rat_callback, &info); + r_search(PCB->Data->rat_tree, &SearchBox, NULL, rat_callback, &info, NULL); return false; } return (true); @@ -305,7 +303,7 @@ *Layer = SearchLayer; if (setjmp(info.env) == 0) { - r_search(SearchLayer->arc_tree, &SearchBox, NULL, arc_callback, &info); + r_search(SearchLayer->arc_tree, &SearchBox, NULL, arc_callback, &info, NULL); return false; } return (true); @@ -339,7 +337,7 @@ info.locked = (locked & LOCKED_TYPE) ? 0 : LOCKFLAG; if (setjmp(info.env) == 0) { - r_search(SearchLayer->text_tree, &SearchBox, NULL, text_callback, &info); + r_search(SearchLayer->text_tree, &SearchBox, NULL, text_callback, &info, NULL); return false; } return (true); @@ -374,7 +372,7 @@ info.locked = (locked & LOCKED_TYPE) ? 0 : LOCKFLAG; if (setjmp(info.env) == 0) { - r_search(SearchLayer->polygon_tree, &SearchBox, NULL, polygon_callback, &info); + r_search(SearchLayer->polygon_tree, &SearchBox, NULL, polygon_callback, &info, NULL); return false; } return (true); @@ -421,7 +419,7 @@ *Point = NULL; info.least = MAX_LINE_POINT_DISTANCE + SearchRadius; info.locked = (locked & LOCKED_TYPE) ? 0 : LOCKFLAG; - if (r_search(SearchLayer->line_tree, &SearchBox, NULL, linepoint_callback, &info)) + if (r_search(SearchLayer->line_tree, &SearchBox, NULL, linepoint_callback, &info, NULL)) return true; return false; } @@ -497,7 +495,7 @@ info.area = SQUARE(MAX_COORD); info.BackToo = (BackToo && PCB->InvisibleObjectsOn); info.locked = (locked & LOCKED_TYPE) ? 0 : LOCKFLAG; - if (r_search(PCB->Data->name_tree[NAME_INDEX()], &SearchBox, NULL, name_callback, &info)) + if (r_search(PCB->Data->name_tree[NAME_INDEX()], &SearchBox, NULL, name_callback, &info, NULL)) return true; } return (false); @@ -542,7 +540,7 @@ info.area = SQUARE(MAX_COORD); info.BackToo = (BackToo && PCB->InvisibleObjectsOn); info.locked = (locked & LOCKED_TYPE) ? 0 : LOCKFLAG; - if (r_search(PCB->Data->element_tree, &SearchBox, NULL, element_callback, &info)) + if (r_search(PCB->Data->element_tree, &SearchBox, NULL, element_callback, &info, NULL)) return true; } return false; Index: trunk/src_plugins/autoplace/autoplace.c =================================================================== --- trunk/src_plugins/autoplace/autoplace.c (revision 2422) +++ trunk/src_plugins/autoplace/autoplace.c (revision 2423) @@ -281,7 +281,7 @@ ni.trap.Y2 = ni.trap.Y1; ni.trap.Y1 = bbox.Y1; /* do the search! */ - r_search(rtree, NULL, __r_find_neighbor_reg_in_sea, __r_find_neighbor_rect_in_reg, &ni); + r_search(rtree, NULL, __r_find_neighbor_reg_in_sea, __r_find_neighbor_rect_in_reg, &ni, NULL); return ni.neighbor; } Index: trunk/src_plugins/autoroute/autoroute.c =================================================================== --- trunk/src_plugins/autoroute/autoroute.c (revision 2422) +++ trunk/src_plugins/autoroute/autoroute.c (revision 2423) @@ -803,7 +803,7 @@ info.winner = NULL; info.query = point_box(X, Y); if (setjmp(info.env) == 0) - r_search(rd->layergrouptree[layergroup], &info.query, NULL, __found_one_on_lg, &info); + r_search(rd->layergrouptree[layergroup], &info.query, NULL, __found_one_on_lg, &info, NULL); return info.winner; } @@ -1517,7 +1517,7 @@ mtc.nearest_cost = cost_to_routebox(mtc.CostPoint, mtc.CostPointLayer, mtc.nearest); else mtc.nearest_cost = EXPENSIVE; - r_search(targets, NULL, __region_within_guess, __found_new_guess, &mtc); + r_search(targets, NULL, __region_within_guess, __found_new_guess, &mtc, NULL); assert(mtc.nearest != NULL && mtc.nearest_cost >= 0); assert(mtc.nearest->flags.target); /* this is a target, right? */ return mtc.nearest; @@ -2091,7 +2091,7 @@ } ans.keep = e->rb->style->Clearance; ans.parent = nonhomeless_parent(e->rb); - r_search(rtree, &ans.inflated, NULL, __Expand_this_rect, &ans); + r_search(rtree, &ans.inflated, NULL, __Expand_this_rect, &ans, NULL); /* because the overlaping boxes are found in random order, some blockers * may have limited edges prematurely, so we check if the blockers realy * are blocking, and make another try if not @@ -2113,7 +2113,7 @@ else ans.done |= _WEST; if (ans.done != _NORTH + _EAST + _SOUTH + _WEST) { - r_search(rtree, &ans.inflated, NULL, __Expand_this_rect, &ans); + r_search(rtree, &ans.inflated, NULL, __Expand_this_rect, &ans, NULL); } if ((noshrink & _NORTH) == 0) ans.inflated.Y1 += ans.bloat; @@ -2486,6 +2486,7 @@ * be expanded. */ for (dir = NORTH; dir <= WEST; dir = directionIncrement(dir)) { + int tmp; /* don't break the edge we came from */ if (e->expand_dir != ((dir + 2) % 4)) { heap[dir] = heap_create(); @@ -2505,7 +2506,8 @@ bi.box.X1 = e->rb->sbox.X2; if (e->expand_dir == SW) bi.box.X2 = e->rb->sbox.X1; - rb->n = r_search(tree, &bi.box, NULL, __GatherBlockers, &bi); + r_search(tree, &bi.box, NULL, __GatherBlockers, &bi, &tmp); + rb->n = tmp; break; case EAST: bi.box.X1 = bi.box.X2 - bloat - 1; @@ -2516,7 +2518,8 @@ bi.box.Y1 = e->rb->sbox.Y2; if (e->expand_dir == NW) bi.box.Y2 = e->rb->sbox.Y1; - rb->e = r_search(tree, &bi.box, NULL, __GatherBlockers, &bi); + r_search(tree, &bi.box, NULL, __GatherBlockers, &bi, &tmp); + rb->e = tmp; break; case SOUTH: bi.box.Y1 = bi.box.Y2 - bloat - 1; @@ -2527,7 +2530,8 @@ bi.box.X1 = e->rb->sbox.X2; if (e->expand_dir == NW) bi.box.X2 = e->rb->sbox.X1; - rb->s = r_search(tree, &bi.box, NULL, __GatherBlockers, &bi); + r_search(tree, &bi.box, NULL, __GatherBlockers, &bi, &tmp); + rb->s = tmp; break; case WEST: bi.box.X2 = bi.box.X1 + bloat + 1; @@ -2538,7 +2542,8 @@ bi.box.Y1 = e->rb->sbox.Y2; if (e->expand_dir == NE) bi.box.Y2 = e->rb->sbox.Y1; - rb->w = r_search(tree, &bi.box, NULL, __GatherBlockers, &bi); + r_search(tree, &bi.box, NULL, __GatherBlockers, &bi, &tmp); + rb->w = tmp; break; default: assert(0); @@ -2746,7 +2751,7 @@ foib.intersect = NULL; if (setjmp(foib.env) == 0) - r_search(rtree, &r, NULL, foib_rect_in_reg, &foib); + r_search(rtree, &r, NULL, foib_rect_in_reg, &foib, NULL); return foib.intersect; } @@ -2813,7 +2818,7 @@ info.query = shrink_routebox(rb); if (setjmp(info.env) == 0) { - r_search(rtree, &info.query, NULL, ftherm_rect_in_reg, &info); + r_search(rtree, &info.query, NULL, ftherm_rect_in_reg, &info, NULL); return NULL; } return info.plane; @@ -3526,7 +3531,7 @@ { if (!AutoRouteParameters.with_conflicts) return; - r_search(tree, &rb->sbox, NULL, __conflict_source, rb); + r_search(tree, &rb->sbox, NULL, __conflict_source, rb, NULL); touch_conflicts(NULL, 1); } @@ -4064,7 +4069,7 @@ big.Y1 = 0; big.Y2 = MAX_COORD; for (i = 0; i < max_group; i++) { - if (r_search(rd->layergrouptree[i], &big, NULL, bad_boy, NULL)) + if (r_search(rd->layergrouptree[i], &big, NULL, bad_boy, NULL, NULL)) return false; } return true; @@ -4405,13 +4410,13 @@ info.X = box->X1; info.Y = box->Y1; if (setjmp(info.env) == 0) - r_search(PCB->Data->pin_tree, box, NULL, fpin_rect, &info); + r_search(PCB->Data->pin_tree, box, NULL, fpin_rect, &info, NULL); else { *pin = info.pin; return PIN_TYPE; } if (setjmp(info.env) == 0) - r_search(PCB->Data->via_tree, box, NULL, fpin_rect, &info); + r_search(PCB->Data->via_tree, box, NULL, fpin_rect, &info, NULL); else { *pin = info.pin; return VIA_TYPE; @@ -4685,7 +4690,7 @@ int i; BoxType big = { 0, 0, MAX_COORD, MAX_COORD }; for (i = 0; i < max_group; i++) { - r_search(rd->layergrouptree[i], &big, NULL, ripout_livedraw_obj_cb, NULL); + r_search(rd->layergrouptree[i], &big, NULL, ripout_livedraw_obj_cb, NULL, NULL); } } #ifdef ROUTE_DEBUG Index: trunk/src_plugins/autoroute/mtspace.c =================================================================== --- trunk/src_plugins/autoroute/mtspace.c (revision 2422) +++ trunk/src_plugins/autoroute/mtspace.c (revision 2423) @@ -177,7 +177,7 @@ cl.tree = which_tree(mtspace, which); small_search = box_center(box); if (setjmp(cl.env) == 0) { - r_search(cl.tree, &small_search, NULL, mts_remove_one, &cl); + r_search(cl.tree, &small_search, NULL, mts_remove_one, &cl, NULL); assert(0); /* didn't find it?? */ } } @@ -305,18 +305,14 @@ static void qloop(struct query_closure *qc, rtree_t * tree, heap_or_vector res, bool is_vec) { BoxType *cbox; -#ifndef NDEBUG int n; -#endif + while (!(qc->desired ? heap_is_empty(qc->checking.h) : vector_is_empty(qc->checking.v))) { cbox = qc->desired ? (BoxTypePtr) heap_remove_smallest(qc->checking.h) : (BoxTypePtr) vector_remove_last(qc->checking.v); if (setjmp(qc->env) == 0) { assert(box_is_good(cbox)); qc->cbox = cbox; -#ifndef NDEBUG - n = -#endif - r_search(tree, cbox, NULL, query_one, qc); + r_search(tree, cbox, NULL, query_one, qc, &n); assert(n == 0); /* nothing intersected with this tree, put it in the result vector */ if (is_vec) Index: trunk/src_plugins/gl/hidgl.c =================================================================== --- trunk/src_plugins/gl/hidgl.c (revision 2422) +++ trunk/src_plugins/gl/hidgl.c (revision 2423) @@ -618,7 +618,7 @@ /* Drawing operations now set our reference bit in the stencil buffer */ - r_search(poly->Clipped->contour_tree, clip_box, NULL, do_hole, &info); + r_search(poly->Clipped->contour_tree, clip_box, NULL, do_hole, &info, NULL); hidgl_flush_triangles(&buffer); glPopAttrib(); /* Restore the colour and stencil buffer write-mask etc.. */ Index: trunk/src_plugins/gpmi/pcb-gpmi/gpmi_plugin/gpmi_pkg/layout/search.c =================================================================== --- trunk/src_plugins/gpmi/pcb-gpmi/gpmi_plugin/gpmi_pkg/layout/search.c (revision 2422) +++ trunk/src_plugins/gpmi/pcb-gpmi/gpmi_plugin/gpmi_pkg/layout/search.c (revision 2423) @@ -65,33 +65,33 @@ s->layer = -1; if (obj_types & OM_LINE) { s->searching = OM_LINE; - r_search (CURRENT->line_tree, &spot, NULL, search_callback, s); + r_search (CURRENT->line_tree, &spot, NULL, search_callback, s, NULL); } if (obj_types & OM_TEXT) { s->searching = OM_TEXT; - r_search (CURRENT->text_tree, &spot, NULL, search_callback, s); + r_search (CURRENT->text_tree, &spot, NULL, search_callback, s, NULL); } if (obj_types & OM_ARC) { s->searching = OM_ARC; - r_search (CURRENT->arc_tree, &spot, NULL, search_callback, s); + r_search (CURRENT->arc_tree, &spot, NULL, search_callback, s, NULL); } if (obj_types & OM_VIA) { s->searching = OM_VIA; - r_search (PCB->Data->via_tree, &spot, NULL, search_callback, s); + r_search (PCB->Data->via_tree, &spot, NULL, search_callback, s, NULL); } if (obj_types & OM_PIN) { s->searching = OM_PIN; - r_search (PCB->Data->pin_tree, &spot, NULL, search_callback, s); + r_search (PCB->Data->pin_tree, &spot, NULL, search_callback, s, NULL); } if (obj_types & OM_POLYGON) { s->searching = OM_POLYGON; for (s->layer = 0; s->layer < MAX_LAYER + 2; s->layer++) - r_search (PCB->Data->Layer[s->layer].polygon_tree, &spot, NULL, search_callback, s); + r_search (PCB->Data->Layer[s->layer].polygon_tree, &spot, NULL, search_callback, s, NULL); s->layer = -1; } Index: trunk/src_plugins/puller/puller.c =================================================================== --- trunk/src_plugins/puller/puller.c (revision 2422) +++ trunk/src_plugins/puller/puller.c (revision 2423) @@ -357,8 +357,8 @@ spot.Y1 = y - 1; spot.X2 = x + 1; spot.Y2 = y + 1; - r_search(CURRENT->line_tree, &spot, NULL, line_callback, CURRENT); - r_search(CURRENT->arc_tree, &spot, NULL, arc_callback, CURRENT); + r_search(CURRENT->line_tree, &spot, NULL, line_callback, CURRENT, NULL); + r_search(CURRENT->arc_tree, &spot, NULL, arc_callback, CURRENT, NULL); if (the_line && the_arc && !multi) return 1; x = Px; @@ -731,8 +731,8 @@ b.X2 = x + 10; b.Y1 = y - 10; b.Y2 = y + 10; - r_search(CURRENT->line_tree, &b, NULL, find_pair_line_callback, &fpcs); - r_search(CURRENT->arc_tree, &b, NULL, find_pair_arc_callback, &fpcs); + r_search(CURRENT->line_tree, &b, NULL, find_pair_line_callback, &fpcs, NULL); + r_search(CURRENT->arc_tree, &b, NULL, find_pair_arc_callback, &fpcs, NULL); } static int check_point_in_pin(PinTypePtr pin, int x, int y, End * e) @@ -983,8 +983,8 @@ box.Y1 = pin->Y - pin->Thickness / 2; box.X2 = pin->X + pin->Thickness / 2; box.Y2 = pin->Y + pin->Thickness / 2; - r_search(CURRENT->line_tree, &box, NULL, find_pair_pinline_callback, pin); - r_search(CURRENT->arc_tree, &box, NULL, find_pair_pinarc_callback, pin); + r_search(CURRENT->line_tree, &box, NULL, find_pair_pinline_callback, pin, NULL); + r_search(CURRENT->arc_tree, &box, NULL, find_pair_pinarc_callback, pin, NULL); } ENDALL_LOOP; @@ -994,8 +994,8 @@ box.Y1 = via->Y - via->Thickness / 2; box.X2 = via->X + via->Thickness / 2; box.Y2 = via->Y + via->Thickness / 2; - r_search(CURRENT->line_tree, &box, NULL, find_pair_pinline_callback, via); - r_search(CURRENT->arc_tree, &box, NULL, find_pair_pinarc_callback, via); + r_search(CURRENT->line_tree, &box, NULL, find_pair_pinline_callback, via, NULL); + r_search(CURRENT->arc_tree, &box, NULL, find_pair_pinarc_callback, via, NULL); } END_LOOP; @@ -1005,8 +1005,8 @@ box.Y1 = MIN(pad->Point1.Y, pad->Point2.Y) - pad->Thickness / 2; box.X2 = MAX(pad->Point1.X, pad->Point2.X) + pad->Thickness / 2; box.Y2 = MAX(pad->Point1.Y, pad->Point2.Y) + pad->Thickness / 2; - r_search(CURRENT->line_tree, &box, NULL, find_pair_padline_callback, pad); - r_search(CURRENT->arc_tree, &box, NULL, find_pair_padarc_callback, pad); + r_search(CURRENT->line_tree, &box, NULL, find_pair_padline_callback, pad, NULL); + r_search(CURRENT->arc_tree, &box, NULL, find_pair_padarc_callback, pad, NULL); } ENDALL_LOOP; @@ -1931,13 +1931,13 @@ end_pinpad = start_extra->end.pin; fp = 0; - r_search(CURRENT->line_tree, &box, NULL, gp_line_cb, 0); - r_search(CURRENT->arc_tree, &box, NULL, gp_arc_cb, 0); - r_search(CURRENT->text_tree, &box, NULL, gp_text_cb, 0); - r_search(CURRENT->polygon_tree, &box, NULL, gp_poly_cb, 0); - r_search(PCB->Data->pin_tree, &box, NULL, gp_pin_cb, 0); - r_search(PCB->Data->via_tree, &box, NULL, gp_pin_cb, 0); - r_search(PCB->Data->pad_tree, &box, NULL, gp_pad_cb, 0); + r_search(CURRENT->line_tree, &box, NULL, gp_line_cb, 0, NULL); + r_search(CURRENT->arc_tree, &box, NULL, gp_arc_cb, 0, NULL); + r_search(CURRENT->text_tree, &box, NULL, gp_text_cb, 0, NULL); + r_search(CURRENT->polygon_tree, &box, NULL, gp_poly_cb, 0, NULL); + r_search(PCB->Data->pin_tree, &box, NULL, gp_pin_cb, 0, NULL); + r_search(PCB->Data->via_tree, &box, NULL, gp_pin_cb, 0, NULL); + r_search(PCB->Data->pad_tree, &box, NULL, gp_pad_cb, 0, NULL); /* radians, absolute angle of (at the moment) the start_line */ abs_angle = fa + start_angle;