From 8b1e4fc32ce24ec64056cb21d68ade9239fc716a Mon Sep 17 00:00:00 2001 From: rlar Date: Sat, 25 Nov 2017 17:15:53 +0100 Subject: [PATCH] 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. --- src/frontend/numparam/xpressn.c | 44 +++++++++++++++++++++------------ 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/src/frontend/numparam/xpressn.c b/src/frontend/numparam/xpressn.c index 8ab799838..4c64a8726 100644 --- a/src/frontend/numparam/xpressn.c +++ b/src/frontend/numparam/xpressn.c @@ -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 nupa_subcktcall(dico_t *dico, char *s, char * const x, char * const inst_name) /* 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' */ scopy_up(&tstr, skip_non_ws(x)); - int j0 = 0; char * const t_p = spice_dstring_value(&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); char * const buf = spice_dstring_value(&parsebuf); - int found = 0, found_j = 0; - 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; - } + const char *p_subname = search_isolated_identifier(buf, spice_dstring_value(&subname)); - j0 = found_j; /* last occurence of subname in buf */ spice_dstring_free(&parsebuf); - /* make sure that subname followed by space */ - if (found) { - char *jp = t_p + j0 + spice_dstring_length(&subname) + 1; /* 1st position of arglist: jp */ + if (p_subname) { + char *jp = t_p + (int)(p_subname - buf) + spice_dstring_length(&subname) + 1; /* 1st position of arglist: jp */ while ((jp < ls_ptr) && ((*jp <= ' ') || (*jp == ','))) jp++;