From 5d45047d01714811b61dbd9bd799daabed425c66 Mon Sep 17 00:00:00 2001 From: John Camelon Date: Thu, 2 Dec 2004 03:15:08 +0000 Subject: [PATCH] Patch for Devin Steffler Fixed 79921 - [Scanner] problems with ')' inside a string being passed to va_args macro parm Fixed 79227 - [Scanner][IProblem][Ethereal] "Unbounded string encountered" invalid IProblems with invalid offsets highlighting weird commented code --- .../core/parser/tests/CompleteParseASTTest.java | 12 ++++++++++++ .../internal/core/parser/scanner2/Scanner2.java | 16 +++++++++++++--- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java index e24d13be73a..5194cf69daa 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/CompleteParseASTTest.java @@ -2532,5 +2532,17 @@ public class CompleteParseASTTest extends CompleteParseBaseTest writer.write("if (WIFEXITED(test)) {}\n}\n"); //$NON-NLS-1$ parse(writer.toString()); } + + public void testBug79921_79227() throws Exception { + Writer writer = new StringWriter(); + writer.write("/* some\n* commented\n* code\n*/\n"); //$NON-NLS-1$ + writer.write("#define g_message(...) g_log (1, 2, __VA_ARGS__);\n"); //$NON-NLS-1$ + writer.write("int g_log (int a, int b, ...) { return 0; }\n"); //$NON-NLS-1$ + writer.write("int foo2() {\n"); //$NON-NLS-1$ + writer.write("g_message(\"a string [as] f%2.2x (%2)\") \\\n"); //$NON-NLS-1$ + writer.write("// ^ the culprit\n}\n"); //$NON-NLS-1$ + parse(writer.toString()); + } + } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/Scanner2.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/Scanner2.java index a9976e54536..0b522985725 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/Scanner2.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/Scanner2.java @@ -2612,6 +2612,7 @@ public class Scanner2 implements IScanner, IScannerData { int currarg = -1; CharArrayObjectMap argmap = new CharArrayObjectMap(arglist.length); + boolean insideString = false; while (bufferPos[bufferStackPos] < limit) { skipOverWhiteSpace(); @@ -2632,13 +2633,22 @@ public class Scanner2 implements IScanner, IScannerData { int argend = -1; if ((macro.hasGCCVarArgs() || macro.hasVarArgs()) && currarg == macro.getVarArgsPosition()) { + --bufferPos[bufferStackPos]; // go back to first char of macro args + // there are varargs and the other parms have been accounted for, the rest will replace __VA_ARGS__ or name where "name..." is the parm - while (++bufferPos[bufferStackPos] < limit) { - if (buffer[bufferPos[bufferStackPos]] == ')') { + do { + if (buffer[bufferPos[bufferStackPos]] == '"') { + if (insideString) + insideString = false; + else + insideString = true; + } + + if (!insideString && buffer[bufferPos[bufferStackPos]] == ')') { --bufferPos[bufferStackPos]; break; } - } + } while (++bufferPos[bufferStackPos] < limit); argend = bufferPos[bufferStackPos]; } else argend = skipOverMacroArg();