diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 69ae70171..027b05241 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -152,6 +152,7 @@ static char *inp_spawn_brace(char *s); static char *inp_pathresolve(const char *name); static char *inp_pathresolve_at(char *name, char *dir); +static char *search_plain_identifier(char *str, const char *identifier); void tprint(struct line *deck); struct inp_read_t @@ -3650,8 +3651,8 @@ get_number_terminals(char *c) static void inp_sort_params(struct line *start_card, struct line *end_card, struct line *card_bf_start, struct line *s_c, struct line *e_c) { - char *param_name = NULL, *param_str = NULL, *param_ptr = NULL; - int i, j, num_params = 0, ind = 0, max_level = 0, num_terminals = 0, ioff = 1; + char *param_name = NULL, *param_str = NULL; + int i, j, num_params = 0, ind = 0, max_level = 0, num_terminals = 0; bool in_control = FALSE; bool found_in_list = FALSE; @@ -3736,14 +3737,7 @@ inp_sort_params(struct line *start_card, struct line *end_card, struct line *car param_str = param_strs[j]; - while ((param_ptr = strstr(param_str, param_name)) != NULL) { - ioff = (strchr(param_ptr, '}') != NULL ? 1 : 0); /* want prevent wrong memory access below */ - /* looking for curly braces or other string limiter */ - if ((!isalnum(param_ptr[-ioff]) && param_ptr[-ioff] != '_' && - !isalnum(param_ptr[strlen(param_name)]) && - param_ptr[strlen(param_name)] != '_') || - strcmp(param_ptr, param_name) == 0) - { /* this are cases without curly braces */ + if (search_plain_identifier(param_str, param_name)) { ind = 0; found_in_list = FALSE; while (depends_on[j][ind] != NULL) { @@ -3757,9 +3751,6 @@ inp_sort_params(struct line *start_card, struct line *end_card, struct line *car depends_on[j][ind++] = param_name; depends_on[j][ind] = NULL; } - break; - } - param_str = param_ptr + strlen(param_name); } } } @@ -4205,6 +4196,32 @@ search_identifier(char *str, const char *identifier, char *str_begin) } +static char * +search_plain_identifier(char *str, const char *identifier) +{ + char *str_begin = str; + + while ((str = strstr(str, identifier)) != NULL) { + char before; + + if (str > str_begin) + before = str[-1]; + else + before = '\0'; + + if (!before || !identifier_char(before)) { + char after = str[strlen(identifier)]; + if (!after || !identifier_char(after)) + return str; + } + + str += strlen(identifier); + } + + return NULL; +} + + /* ps compatibility: ECOMP 3 0 TABLE {V(1,2)} = (-1 0V) (1, 10V) -->