From a259c145119baaee05344ee1762ae4f792ffd540 Mon Sep 17 00:00:00 2001 From: Doug Schaefer Date: Wed, 16 Jun 2004 13:51:55 +0000 Subject: [PATCH] Fixed handling of defined() in expression evaluator. --- .../cdt/core/parser/tests/Scanner2Test.java | 3 ++- .../parser/scanner2/ExpressionEvaluator.java | 16 ++++++++++++++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/Scanner2Test.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/Scanner2Test.java index 5b662814b86..6028b16b872 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/Scanner2Test.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/Scanner2Test.java @@ -878,7 +878,8 @@ public class Scanner2Test extends BaseScanner2Test try { validateEOF(); - fail(EXPECTED_FAILURE); + // These are no longer scanner exceptions, the are simply ignored. + //fail(EXPECTED_FAILURE); } catch (ScannerException se) { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/ExpressionEvaluator.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/ExpressionEvaluator.java index 90cd353079a..7395acb80f7 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/ExpressionEvaluator.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/ExpressionEvaluator.java @@ -241,7 +241,7 @@ public class ExpressionEvaluator { int limit = bufferLimit[bufferStackPos]; // check first character - int c = buffer[++bufferPos[bufferStackPos]]; + char c = buffer[++bufferPos[bufferStackPos]]; if (!((c >= 'A' && c <= 'Z') || c == '_' || (c >= 'a' && c <= 'z'))) { throw new EvalException("illegal identifier in defined()"); } @@ -250,12 +250,14 @@ public class ExpressionEvaluator { int idstart = bufferPos[bufferStackPos]; int idlen = 1; while (++bufferPos[bufferStackPos] < limit) { - if ((c >= 'A' && c <= 'Z') || c == '_' || (c >= 'a' && c <= 'z') || (c >= '0' || c <= '9')) { + c = buffer[bufferPos[bufferStackPos]]; + if ((c >= 'A' && c <= 'Z') || c == '_' || (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9')) { ++idlen; continue; } else break; } + --bufferPos[bufferStackPos]; // consume to the closing paren; while (true) { @@ -286,6 +288,8 @@ public class ExpressionEvaluator { return value; } + private static char[] _defined = "defined".toCharArray(); + private void nextToken() throws EvalException { contextLoop: while (bufferStackPos >= 0) { @@ -374,6 +378,14 @@ public class ExpressionEvaluator { --bufferPos[bufferStackPos]; + // Check for defined( + pos = bufferPos[bufferStackPos]; + if (pos + 1 < limit && buffer[pos + 1] == '(' + && CharArrayUtils.equals(buffer, start, len, _defined)) { + tokenType = t_defined; + return; + } + // Check for macro expansion Object expObject = null; if (bufferData[bufferStackPos] instanceof FunctionStyleMacro.Expansion) {