From 2e4810f17261b6367fe138ade528fd09556d6c2a Mon Sep 17 00:00:00 2001 From: Martin Whitaker Date: Sun, 17 May 2015 20:16:40 +0100 Subject: [PATCH] Fix for br977 - preprocessor macros substitute text inside token. When replacing macro formal parameters, the preprocessor should not replace matching strings that are not complete tokens. The test for this was incorrect, and failed when a match was found at the start of the replacement text. --- ivlpp/lexor.lex | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/ivlpp/lexor.lex b/ivlpp/lexor.lex index c4f37ed1a..17ea89a6e 100644 --- a/ivlpp/lexor.lex +++ b/ivlpp/lexor.lex @@ -863,6 +863,11 @@ static int define_continue_flag = 0; #define _STR1(x) #x #define _STR2(x) _STR1(x) +static int is_id_char(char c) +{ + return isalnum((int)c) || c == '_' || c == '$'; +} + /* * Find an argument, but only if it is not directly preceded by something * that would make it part of another simple identifier ([a-zA-Z0-9_$]). @@ -877,12 +882,8 @@ static char *find_arg(char*ptr, char*head, char*arg) cp = strstr(cp, arg); if (!cp) break; - /* If we are not at the start of the string verify that this - * match is not in the middle of another identifier. - */ - if (cp != head && - (isalnum((int)*(cp-1)) || *(cp-1) == '_' || *(cp-1) == '$' || - isalnum((int)*(cp+len)) || *(cp+len) == '_' || *(cp+len) == '$')) { + /* Verify that this match is not in the middle of another identifier. */ + if ((cp != head && is_id_char(cp[-1])) || is_id_char(cp[len])) { cp++; continue; }