From 76e0b3df102f54672f8d4dfcc19c144e52a8ff4e Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Sat, 3 Jul 2021 22:10:26 -0700 Subject: [PATCH] segment: Ignore !ENDDEFINE in /*comments*/ and "strings". --- src/language/lexer/segment.c | 32 +++++++++++++++++++++++++++----- tests/language/lexer/segment.at | 8 ++++---- 2 files changed, 31 insertions(+), 9 deletions(-) diff --git a/src/language/lexer/segment.c b/src/language/lexer/segment.c index 2689811593..9c2c9b11e8 100644 --- a/src/language/lexer/segment.c +++ b/src/language/lexer/segment.c @@ -1579,11 +1579,33 @@ find_enddefine (struct substring input) { size_t n = input.length; const struct substring enddefine = ss_cstr ("!ENDDEFINE"); - for (size_t i = 0; i + enddefine.length <= n; i++) - if (input.string[i] == '!' - && ss_equals_case (ss_substr (input, i, enddefine.length), enddefine)) - return i; - return SIZE_MAX; + for (int ofs = 0;;) + { + /* Skip !ENDDEFINE in comment. */ + ofs = skip_spaces_and_comments (input.string, n, true, ofs); + if (ofs + enddefine.length > n) + return SIZE_MAX; + + char c = input.string[ofs]; + if (c == '!' + && ss_equals_case (ss_substr (input, ofs, enddefine.length), + enddefine)) + return ofs; + else if (c == '\'' || c == '"') + { + /* Skip quoted !ENDDEFINE. */ + ofs++; + for (;;) + { + if (ofs >= n) + return SIZE_MAX; + else if (input.string[ofs++] == c) + break; + } + } + else + ofs++; + } } /* We are in the body of a macro definition, looking for additional lines of diff --git a/tests/language/lexer/segment.at b/tests/language/lexer/segment.at index 00f3fe0c3f..86a0941194 100644 --- a/tests/language/lexer/segment.at +++ b/tests/language/lexer/segment.at @@ -1014,7 +1014,7 @@ AT_SETUP([DEFINE command - simple]) AT_KEYWORDS([segment]) AT_DATA([input], [dnl define !macro1() -var1 var2 var3 +var1 var2 var3 "!enddefine" !enddefine. ]) AT_DATA([expout-base], [dnl @@ -1025,7 +1025,7 @@ punct ) spaces newline \n (DEFINE) -macro_body var1_var2_var3 +macro_body var1_var2_var3_"!enddefine" newline \n (DEFINE) macro_id !enddefine @@ -1040,7 +1040,7 @@ AT_CLEANUP AT_SETUP([DEFINE command - no newline after parentheses]) AT_KEYWORDS([segment]) AT_DATA([input], [dnl -define !macro1() var1 var2 var3 +define !macro1() var1 var2 var3 /* !enddefine !enddefine. ]) AT_DATA([expout-base], [dnl @@ -1048,7 +1048,7 @@ identifier define space macro_id !macro1 punct ( punct ) -macro_body _var1_var2_var3 +macro_body _var1_var2_var3_/*_!enddefine newline \n (DEFINE) macro_id !enddefine -- 2.30.2