nupa_subcktcall(), introduce search_isolated_identifier()
the functionality is a bit different though, because the previous code searched for the *last* occurence of the identifier yet the new code searches for the first occurence.
This commit is contained in:
parent
6a57023ced
commit
8b1e4fc32c
|
|
@ -1483,6 +1483,31 @@ nupa_assignment(dico_t *dico, const char * const s, char mode)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* search for whitespace delimited occurence of `identifier' in str
|
||||||
|
* delimited by whitespace or begin/end of string
|
||||||
|
*/
|
||||||
|
|
||||||
|
static char *
|
||||||
|
search_isolated_identifier(char *str, const char *identifier)
|
||||||
|
{
|
||||||
|
char *str_begin = str;
|
||||||
|
|
||||||
|
while ((str = strstr(str, identifier)) != NULL) {
|
||||||
|
|
||||||
|
if (str <= str_begin || isspace_c(str[-1])) {
|
||||||
|
char after = str[strlen(identifier)];
|
||||||
|
if (!after || isspace_c(after))
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
str += strlen(identifier);
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool
|
bool
|
||||||
nupa_subcktcall(dico_t *dico, char *s, char * const x, char * const inst_name)
|
nupa_subcktcall(dico_t *dico, char *s, char * const x, char * const inst_name)
|
||||||
/* s= a subckt define line, with formal params.
|
/* s= a subckt define line, with formal params.
|
||||||
|
|
@ -1576,7 +1601,6 @@ nupa_subcktcall(dico_t *dico, char *s, char * const x, char * const inst_name)
|
||||||
same name as subckt 'x1'
|
same name as subckt 'x1'
|
||||||
*/
|
*/
|
||||||
scopy_up(&tstr, skip_non_ws(x));
|
scopy_up(&tstr, skip_non_ws(x));
|
||||||
int j0 = 0;
|
|
||||||
|
|
||||||
char * const t_p = spice_dstring_value(&tstr);
|
char * const t_p = spice_dstring_value(&tstr);
|
||||||
char * const ls_ptr = t_p + spice_dstring_length(&tstr);
|
char * const ls_ptr = t_p + spice_dstring_length(&tstr);
|
||||||
|
|
@ -1585,24 +1609,12 @@ nupa_subcktcall(dico_t *dico, char *s, char * const x, char * const inst_name)
|
||||||
scopyd(&parsebuf, &tstr);
|
scopyd(&parsebuf, &tstr);
|
||||||
char * const buf = spice_dstring_value(&parsebuf);
|
char * const buf = spice_dstring_value(&parsebuf);
|
||||||
|
|
||||||
int found = 0, found_j = 0;
|
const char *p_subname = search_isolated_identifier(buf, spice_dstring_value(&subname));
|
||||||
char *token = strtok(buf, " "); /* a bit more exact - but not sufficient everytime */
|
|
||||||
j0 = j0 + (int) strlen(token) + 1;
|
|
||||||
if (strcmp(token, spice_dstring_value(&subname)))
|
|
||||||
while ((token = strtok(NULL, " ")) != NULL) {
|
|
||||||
if (!strcmp(token, spice_dstring_value(&subname))) {
|
|
||||||
found = 1;
|
|
||||||
found_j = j0;
|
|
||||||
}
|
|
||||||
j0 = j0 + (int) strlen(token) + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
j0 = found_j; /* last occurence of subname in buf */
|
|
||||||
spice_dstring_free(&parsebuf);
|
spice_dstring_free(&parsebuf);
|
||||||
|
|
||||||
/* make sure that subname followed by space */
|
if (p_subname) {
|
||||||
if (found) {
|
char *jp = t_p + (int)(p_subname - buf) + spice_dstring_length(&subname) + 1; /* 1st position of arglist: jp */
|
||||||
char *jp = t_p + j0 + spice_dstring_length(&subname) + 1; /* 1st position of arglist: jp */
|
|
||||||
|
|
||||||
while ((jp < ls_ptr) && ((*jp <= ' ') || (*jp == ',')))
|
while ((jp < ls_ptr) && ((*jp <= ' ') || (*jp == ',')))
|
||||||
jp++;
|
jp++;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue