From 726f1d3fb85ec5cb57e734526cdd1201391eb668 Mon Sep 17 00:00:00 2001 From: rlar Date: Sat, 13 Dec 2014 22:30:46 +0100 Subject: [PATCH] inpcom.c, teemper bug fix, rewrite `inp_functionalise_identifier()' do not compare against `VALIDCHARS' which is much to broad with respect to our operators --- src/frontend/inpcom.c | 67 ++++++++++++++----------------------------- 1 file changed, 22 insertions(+), 45 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 9c35af4cc..2dc5a1ba2 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -6065,13 +6065,14 @@ inp_fix_temper_in_param(struct line *deck) new_str = inp_functionalise_identifier(curr_line, new_func->funcname); - if (new_str) { - /* restore first part of the line */ - new_str = INPstrCat(firsttok_str, new_str, " "); - new_str = inp_remove_ws(new_str); - } - else + if (new_str == curr_line) { + tfree(firsttok_str); continue; + } + + /* restore first part of the line */ + new_str = INPstrCat(firsttok_str, new_str, " "); + new_str = inp_remove_ws(new_str); /* if we have inserted into a .param line, convert to .func */ if (prefix(".param", new_str)) { @@ -6100,46 +6101,22 @@ inp_fix_temper_in_param(struct line *deck) static char * inp_functionalise_identifier(char *curr_line, char *identifier) { - /* This is the new code - it finds each variable name and checks it against `identifier' */ - int state; - char *var_name, *chp_start, *chp, *new_str = NULL; - for (state = 0, var_name = chp_start = chp = curr_line; ; chp++) { - switch(state) - { - case 0: - /* in state 0 we are looking for the first character of a variable name, - which has to be an alphabetic character. */ - if (isalpha(*chp)) - { - state = 1; - var_name = chp; - } - break; - case 1: - /* In state 1 we are looking for the last character of a variable name. - The variable name consists of alphanumeric characters and special characters, - which are defined above as VALIDCHARS. */ - state = (*chp) && (isalphanum(*chp) || strchr(VALIDCHARS, *chp)); - if (!state) { - char ch = *chp; - *chp = '\0'; - if (strcmp(var_name, identifier) == 0 && ch != '(') { - new_str = INPstrCat(new_str, copy(chp_start), ""); - new_str = INPstrCat(new_str, copy("()"), ""); - chp_start=chp; - } - *chp = ch; - } - break; + int len = strlen(identifier); + char *p, *str = curr_line; + + for (p = str; (p = search_identifier(p, identifier, str)) != NULL; ) + if (p[len] != '(') { + int prefix_len = (int) (p - str) + len; + char *x = str; + str = tprintf("%.*s()%s", prefix_len, str, str + prefix_len); + if (x != curr_line) + tfree(x); + p = str + prefix_len + 2; + } else { + p ++; } - if (!(*chp)) - break; - } - if (new_str) { - /* add final part of line */ - new_str = INPstrCat(new_str, copy(chp_start), ""); - } - return new_str; + + return str; }