Index: trunk/src/data.c =================================================================== --- trunk/src/data.c (revision 25863) +++ trunk/src/data.c (revision 25864) @@ -922,7 +922,7 @@ } } -pcb_data_t *pcb_data_by_name(pcb_board_t *pcb, const char **name) +static pcb_data_t *pcb_data_by_name_(pcb_board_t *pcb, const char **name, int *addr) { if (name == NULL) return NULL; @@ -931,6 +931,7 @@ (*name) += 3; if (**name == '/') (*name)++; + *addr = 1; return pcb->Data; } else if (pcb_strncasecmp(*name, "buffer#", 7) == 0) { @@ -940,6 +941,7 @@ *name = end; if (**name == '/') (*name)++; + *addr = idx+2; return pcb_buffers[idx].Data; } } @@ -947,11 +949,26 @@ (*name) += 6; if (**name == '/') (*name)++; + *addr = conf_core.editor.buffer_number+2; return PCB_PASTEBUFFER->Data; } + *addr = 0; return NULL; } +pcb_data_t *pcb_data_by_name(pcb_board_t *pcb, const char **name) +{ + int dummy; + return pcb_data_by_name_(pcb, name, &dummy); +} + +int pcb_data_addr_by_name(pcb_board_t *pcb, const char **name) +{ + int dummy; + pcb_data_by_name_(pcb, name, &dummy); + return dummy; +} + const char *pcb_data_to_name(pcb_board_t *pcb, pcb_data_t *data, char *buf, int buf_len) { int n; Index: trunk/src/data.h =================================================================== --- trunk/src/data.h (revision 25863) +++ trunk/src/data.h (revision 25864) @@ -229,6 +229,12 @@ /* Convert name to data, return NULL if not found */ pcb_data_t *pcb_data_by_name(pcb_board_t *pcb, const char **name); + +/* Convert name to data address, return 0 if not found; 1 is pcb's data, + 2+ are buffer+2 */ +int pcb_data_addr_by_name(pcb_board_t *pcb, const char **name); + + /* Convert data to name; either returns a static srting or fills in buf with dynamic data and returns buf. Buf needs to be at least 16 bytes long. Returns NULL if data is not the pcb or a buffer. */ Index: trunk/src/idpath.c =================================================================== --- trunk/src/idpath.c (revision 25863) +++ trunk/src/idpath.c (revision 25864) @@ -43,6 +43,7 @@ static int idpath_map(pcb_idpath_t *idp, pcb_any_obj_t *obj, int level, int *numlevels) { pcb_data_t *data; + int n; if (numlevels != 0) (*numlevels)++; @@ -76,6 +77,12 @@ case PCB_PARENT_NET: return -1; case PCB_PARENT_BOARD: + for(n = 0; n < PCB_MAX_BUFFER; n++) { + if (data == pcb_buffers[n].Data) { + idp->data_addr =n+2; + return 0; + } + } return 0; case PCB_PARENT_SUBC: /* recurse */ return idpath_map(idp, (pcb_any_obj_t *)data->parent.subc, level-1, numlevels); @@ -115,10 +122,13 @@ { const char *s; char *next; - int n, len = 1; + int data_addr, n, len = 1; pcb_idpath_t *idp; for(s = str; *s == '/'; s++) + + data_addr = pcb_data_addr_by_name(PCB, &s); + for(; *s != '\0'; s++) { if ((s[0] == '/') && (s[1] != '/') && (s[1] != '\0')) len++; @@ -125,6 +135,7 @@ } idp = pcb_idpath_alloc(len); + idp->data_addr = data_addr; for(s = str, n = 0; *s != '\0'; s++,n++) { while(*s == '/') s++;