Index: trunk/src/find2.c =================================================================== --- trunk/src/find2.c (revision 21849) +++ trunk/src/find2.c (revision 21850) @@ -34,7 +34,7 @@ it's also cheap on remove! */ /* Do everything that needs to be done for an object found */ -static int pcb_find_found(pcb_find_t *ctx, pcb_any_obj_t *obj) +static int pcb_find_found(pcb_find_t *ctx, pcb_any_obj_t *obj, pcb_any_obj_t *arrived_from) { if (ctx->list_found) vtp0_append(&ctx->found, obj); @@ -47,7 +47,7 @@ ctx->nfound++; - if ((ctx->found_cb != NULL) && (ctx->found_cb(ctx, obj) != 0)) { + if ((ctx->found_cb != NULL) && (ctx->found_cb(ctx, obj, arrived_from) != 0)) { ctx->aborted = 1; return 1; } @@ -56,12 +56,12 @@ } -static int pcb_find_addobj(pcb_find_t *ctx, pcb_any_obj_t *obj) +static int pcb_find_addobj(pcb_find_t *ctx, pcb_any_obj_t *obj, pcb_any_obj_t *arrived_from) { PCB_DFLAG_SET(&obj->Flags, ctx->mark); vtp0_append(&ctx->open, obj); - if (pcb_find_found(ctx, obj) != 0) { + if (pcb_find_found(ctx, obj, arrived_from) != 0) { ctx->aborted = 1; return 1; } @@ -83,7 +83,7 @@ PCB_PADSTACK_LOOP(s->data); { if ((padstack != from) && (padstack->term != NULL) && (padstack->intconn == ic) && (!(PCB_DFLAG_TEST(&(padstack->Flags), ctx->mark)))) - if (pcb_find_addobj(ctx, (pcb_any_obj_t *)padstack) != 0) + if (pcb_find_addobj(ctx, (pcb_any_obj_t *)padstack, from_) != 0) return; } PCB_END_LOOP; @@ -91,7 +91,7 @@ PCB_LINE_COPPER_LOOP(s->data); { if ((line != from) && (line->term != NULL) && (line->intconn == ic) && (!(PCB_DFLAG_TEST(&(line->Flags), ctx->mark)))) - if (pcb_find_addobj(ctx, (pcb_any_obj_t *)line) != 0) + if (pcb_find_addobj(ctx, (pcb_any_obj_t *)line, from_) != 0) return; } PCB_ENDALL_LOOP; @@ -99,7 +99,7 @@ PCB_ARC_COPPER_LOOP(s->data); { if ((arc != from) && (arc->term != NULL) && (arc->intconn == ic) && (!(PCB_DFLAG_TEST(&(arc->Flags), ctx->mark)))) - if (pcb_find_addobj(ctx, (pcb_any_obj_t *)arc) != 0) + if (pcb_find_addobj(ctx, (pcb_any_obj_t *)arc, from_) != 0) return; } PCB_ENDALL_LOOP; @@ -107,7 +107,7 @@ PCB_POLY_COPPER_LOOP(s->data); { if ((polygon != from) && (polygon->term != NULL) && (polygon->intconn == ic) && (!(PCB_DFLAG_TEST(&(polygon->Flags), ctx->mark)))) - if (pcb_find_addobj(ctx, (pcb_any_obj_t *)polygon) != 0) + if (pcb_find_addobj(ctx, (pcb_any_obj_t *)polygon, from_) != 0) return; } PCB_ENDALL_LOOP; @@ -117,7 +117,7 @@ PCB_TEXT_COPPER_LOOP(s->data); { if ((text != from) && (text->term != NULL) && (text->intconn == ic) && (!(PCB_DFLAG_TEST(&(text->Flags), ctx->mark)))) - if (pcb_find_addobj(ctx, (pcb_any_obj_t *)text) != 0) + if (pcb_find_addobj(ctx, (pcb_any_obj_t *)text, from_) != 0) return; } PCB_ENDALL_LOOP; @@ -133,7 +133,7 @@ pcb_any_obj_t *__obj__ = (pcb_any_obj_t *)obj; \ if (!(PCB_DFLAG_TEST(&(__obj__->Flags), ctx->mark))) { \ if (!INOCN(curr, obj) && (pcb_intersect_obj_obj(curr, __obj__))) {\ - if (pcb_find_addobj(ctx, __obj__) != 0) return; \ + if (pcb_find_addobj(ctx, __obj__, curr) != 0) return; \ if ((__obj__->term != NULL) && (!ctx->ignore_intconn) && (__obj__->intconn > 0)) \ int_conn(ctx, __obj__); \ } \ @@ -292,7 +292,7 @@ return -1; pcb_data_dynflag_clear(data, ctx->mark); - pcb_find_addobj(ctx, from); + pcb_find_addobj(ctx, from, NULL); /* add the starting object with no 'arrived_from' */ return pcb_find_exec(ctx); } Index: trunk/src/find2.h =================================================================== --- trunk/src/find2.h (revision 21849) +++ trunk/src/find2.h (revision 21850) @@ -46,8 +46,10 @@ /* if non-NULL, call after an object is found; if returns non-zero, set ->aborted and stop the search. When search started from an object, it is called for the starting object as well. All object data and ctx - fields are updated for obj before the call. */ - int (*found_cb)(pcb_find_t *ctx, pcb_any_obj_t *obj); + fields are updated for new_obj before the call. arrived_from is + the previous object (that already triggered a callback) from which + new_obj was first found; can be NULL for the starting object. */ + int (*found_cb)(pcb_find_t *ctx, pcb_any_obj_t *new_obj, pcb_any_obj_t *arrived_from); /* public state/result */ vtp0_t found; /* objects found, when list_found is 1 - of (pcb_any_obj_t *) */ Index: trunk/src_plugins/diag/diag.c =================================================================== --- trunk/src_plugins/diag/diag.c (revision 21849) +++ trunk/src_plugins/diag/diag.c (revision 21850) @@ -444,7 +444,7 @@ its++; now = pcb_dtime(); } while(now < end); - pcb_message(PCB_MSG_INFO, "find.c peformance: %f pin find per second\n", (double)its * (double)pins / (now-from)); + pcb_message(PCB_MSG_INFO, "find.c peformance: %d %f pin find per second\n", its, (double)its * (double)pins / (now-from)); PCB_ACT_IRES(0); return 0; } @@ -483,7 +483,7 @@ its++; now = pcb_dtime(); } while(now < end); - pcb_message(PCB_MSG_INFO, "find2.c peformance: %f pin find per second\n", (double)its * (double)pins / (now-from)); + pcb_message(PCB_MSG_INFO, "find2.c peformance: %d %f pin find per second\n", its, (double)its * (double)pins / (now-from)); PCB_ACT_IRES(0); return 0; } Index: trunk/src_plugins/export_oldconn/oldconn.c =================================================================== --- trunk/src_plugins/export_oldconn/oldconn.c (revision 21849) +++ trunk/src_plugins/export_oldconn/oldconn.c (revision 21850) @@ -77,7 +77,7 @@ fputs("{\n", f); } -static int count_term_cb(pcb_find_t *fctx, pcb_any_obj_t *o) +static int count_term_cb(pcb_find_t *fctx, pcb_any_obj_t *o, pcb_any_obj_t *arrived_from) { unsigned long *cnt = fctx->user_data; @@ -139,7 +139,7 @@ pcb_any_obj_t *start; } term_cb_t; -static int print_term_conn_cb(pcb_find_t *fctx, pcb_any_obj_t *o) +static int print_term_conn_cb(pcb_find_t *fctx, pcb_any_obj_t *o, pcb_any_obj_t *arrived_from) { term_cb_t *ctx = fctx->user_data; pcb_subc_t *sc; Index: trunk/src_plugins/lib_netmap/netmap.c =================================================================== --- trunk/src_plugins/lib_netmap/netmap.c (revision 21849) +++ trunk/src_plugins/lib_netmap/netmap.c (revision 21850) @@ -45,7 +45,7 @@ return &dn->net; } -static int found(pcb_find_t *fctx, pcb_any_obj_t *obj) +static int found(pcb_find_t *fctx, pcb_any_obj_t *obj, pcb_any_obj_t *arrived_from) { pcb_netmap_t *map = fctx->user_data; dyn_obj_t *d, *dl; Index: trunk/src_plugins/report/report.c =================================================================== --- trunk/src_plugins/report/report.c (revision 21849) +++ trunk/src_plugins/report/report.c (revision 21850) @@ -444,7 +444,7 @@ return 0; } -static int net_length_cb(pcb_find_t *fctx, pcb_any_obj_t *o) +static int net_length_cb(pcb_find_t *fctx, pcb_any_obj_t *o, pcb_any_obj_t *arrived_from) { double *length = fctx->user_data; double dx, dy;