Index: trunk/src/obj_term.c =================================================================== --- trunk/src/obj_term.c (revision 10891) +++ trunk/src/obj_term.c (revision 10892) @@ -36,7 +36,6 @@ #include "obj_term.h" #include "obj_subc_parent.h" #include "pcb-printf.h" -#include "rats.h" #include "undo.h" static const char core_term_cookie[] = "core-term"; @@ -260,25 +259,23 @@ #define CHECK_TERM_LY(ob) \ do { \ if (PCB_NSTRCMP(term_name, ob->term) == 0 && (!same || !PCB_FLAG_TEST(PCB_FLAG_DRC, ob))) { \ - conn->ptr1 = subc; \ - conn->obj = (pcb_any_obj_t *)ob; \ - conn->group = layer->grp; \ - pcb_obj_center((pcb_any_obj_t *)ob, &conn->X, &conn->Y); \ - return pcb_true; \ + if (parent_out != NULL) *parent_out = subc; \ + if (gid_out != NULL) *gid_out = layer->grp; \ + return (pcb_any_obj_t *)ob; \ } \ } while(0) -pcb_bool pcb_term_find_name(pcb_data_t *data, const char *subc_name, const char *term_name, pcb_connection_t *conn, pcb_bool same) +pcb_any_obj_t *pcb_term_find_name(pcb_data_t *data, const char *subc_name, const char *term_name, pcb_bool same, pcb_subc_t **parent_out, pcb_layergrp_id_t *gid_out) { pcb_subc_t *subc; if ((subc = pcb_subc_by_name(PCB->Data, subc_name)) == NULL) - return pcb_false; + return NULL; PCB_LINE_ALL_LOOP(data) { CHECK_TERM_LY(line); } PCB_ENDALL_LOOP; - return pcb_false; + return NULL; } Index: trunk/src/obj_term.h =================================================================== --- trunk/src/obj_term.h (revision 10891) +++ trunk/src/obj_term.h (revision 10892) @@ -38,7 +38,6 @@ #include #include #include "obj_common.h" -#include "rats.h" typedef enum pcb_term_err_e { PCB_TERM_ERR_SUCCESS = 0, @@ -78,8 +77,8 @@ /* Rename an object's ->term field in an undoable way */ pcb_term_err_t pcb_term_undoable_rename(pcb_board_t *pcb, pcb_any_obj_t *obj, const char *new_name); -/* Look up subc_name/term_name and put the result in conn. Returns true if found */ -pcb_bool pcb_term_find_name(pcb_data_t *data, const char *subc_name, const char *term_name, pcb_connection_t *conn, pcb_bool same); +/* Look up subc_name/term_name and put the result in conn. Returns the object + or NULL if not found. If the *out parameters are non-NULL, load them */ +pcb_any_obj_t *pcb_term_find_name(pcb_data_t *data, const char *subc_name, const char *term_name, pcb_bool same, pcb_subc_t **parent_out, pcb_layergrp_id_t *gid_out); - #endif Index: trunk/src/rats.c =================================================================== --- trunk/src/rats.c (revision 10891) +++ trunk/src/rats.c (revision 10892) @@ -109,11 +109,16 @@ gdl_iterator_t it; pcb_pad_t *pad; pcb_pin_t *pin; + pcb_any_obj_t *obj; /* first check for subcircuits; this is the only one thing we'll need to do once elements are removed */ - if (pcb_term_find_name(PCB->Data, ElementName, PinNum, conn, Same)) + obj = pcb_term_find_name(PCB->Data, ElementName, PinNum, Same, &conn->ptr1, &conn->group); + if (obj != NULL) { + conn->obj = obj; + pcb_obj_center(obj, &conn->X, &conn->Y); return pcb_true; + } if ((element = pcb_search_elem_by_name(PCB->Data, ElementName)) == NULL) return pcb_false;