[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
[cdt-patch] Scanner Bug Fix
|
patch_04.15.03(cdt.core).txt
-fixed scanner
bug36047
patch_04.15.03(cdt.ui.test).txt
-Moved ScannerFailedTest::testBug36047 to
ScannerTestCase::testBug36047
-Added
ScannerFailedTest::testBug36475
-Andrew
Index: ChangeLog
===================================================================
RCS file: /home/tools/org.eclipse.cdt.ui.tests/ChangeLog,v
retrieving revision 1.27
diff -u -r1.27 ChangeLog
--- ChangeLog 14 Apr 2003 14:14:52 -0000 1.27
+++ ChangeLog 15 Apr 2003 13:05:37 -0000
@@ -1,3 +1,7 @@
+2003-04-15 Andrew Niefer
+ Moved ScannerFailedTest::testBug36047 to ScannerTestCase::testBug36047
+ Added ScannerFailedTest::testBug36475
+
2003-04-13 John Camelon
Added DOMTests::testPointersToFunctions.
Index: failures/org/eclipse/cdt/core/parser/failedTests/ScannerFailedTest.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.ui.tests/failures/org/eclipse/cdt/core/parser/failedTests/ScannerFailedTest.java,v
retrieving revision 1.2
diff -u -r1.2 ScannerFailedTest.java
--- failures/org/eclipse/cdt/core/parser/failedTests/ScannerFailedTest.java 11 Apr 2003 21:20:16 -0000 1.2
+++ failures/org/eclipse/cdt/core/parser/failedTests/ScannerFailedTest.java 15 Apr 2003 13:05:37 -0000
@@ -37,30 +37,31 @@
{
TestSuite suite = new TestSuite();
- suite.addTest( new ScannerFailedTest( "testBug36047" ) );
+ suite.addTest( new ScannerFailedTest( "testBug36475" ) );
return suite;
}
- public void testBug36047() throws Exception
+ public void testBug36475() throws Exception
{
boolean testPassed = false;
try
{
StringWriter writer = new StringWriter();
- writer.write( "# define MAD_VERSION_STRINGIZE(str) #str\n" );
- writer.write( "# define MAD_VERSION_STRING(num) MAD_VERSION_STRINGIZE(num)\n" );
- writer.write( "# define MAD_VERSION MAD_VERSION_STRING(MAD_VERSION_MAJOR) \".\"\n" );
- initializeScanner( writer.toString() );
+ writer.write( " \"A\" \"B\" \"C\" " );
+
+ initializeScanner( writer.toString() );
+
+ validateString( "ABC" );
validateEOF();
testPassed = true;
}
- catch( ScannerException se )
+ catch( Throwable e )
{
- if( !se.getMessage().equals( "Invalid preprocessor directive encountered at offset 5" ) ){
- fail( "Unexpected Error: " + se.getMessage() );
+ if( !(e instanceof AssertionFailedError) ){
+ fail( "Unexpected Error: " + e.getMessage() );
}
}
Index: parser/org/eclipse/cdt/core/parser/tests/ScannerTestCase.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.ui.tests/parser/org/eclipse/cdt/core/parser/tests/ScannerTestCase.java,v
retrieving revision 1.12
diff -u -r1.12 ScannerTestCase.java
--- parser/org/eclipse/cdt/core/parser/tests/ScannerTestCase.java 11 Apr 2003 21:20:16 -0000 1.12
+++ parser/org/eclipse/cdt/core/parser/tests/ScannerTestCase.java 15 Apr 2003 13:05:38 -0000
@@ -1,6 +1,7 @@
package org.eclipse.cdt.core.parser.tests;
import java.io.StringReader;
+import java.io.StringWriter;
import java.util.List;
import junit.framework.Test;
@@ -1301,5 +1302,32 @@
validateToken(Token.tARROW);
validateIdentifier("A");
validateEOF();
+ }
+
+ public void testBug36047() throws Exception
+ {
+ StringWriter writer = new StringWriter();
+ writer.write( "# define MAD_VERSION_STRINGIZE(str) #str\n" );
+ writer.write( "# define MAD_VERSION_STRING(num) MAD_VERSION_STRINGIZE(num)\n" );
+ writer.write( "# define MAD_VERSION MAD_VERSION_STRING(MAD_VERSION_MAJOR) \".\" \\\n" );
+ writer.write( " MAD_VERSION_STRING(MAD_VERSION_MINOR) \".\" \\\n" );
+ writer.write( " MAD_VERSION_STRING(MAD_VERSION_PATCH) \".\" \\\n" );
+ writer.write( " MAD_VERSION_STRING(MAD_VERSION_EXTRA)\n" );
+ writer.write( "# define MAD_VERSION_MAJOR 2\n" );
+ writer.write( "# define MAD_VERSION_MINOR 1\n" );
+ writer.write( "# define MAD_VERSION_PATCH 3\n" );
+ writer.write( "# define MAD_VERSION_EXTRA boo\n" );
+ writer.write( "MAD_VERSION\n" );
+ initializeScanner( writer.toString() );
+
+ validateString( "2" );
+ validateString( "." );
+ validateString( "1" );
+ validateString( "." );
+ validateString( "3" );
+ validateString( "." );
+ validateString( "boo" );
+
+ validateEOF();
}
}
Index: parser/ChangeLog
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/ChangeLog,v
retrieving revision 1.29
diff -u -r1.29 ChangeLog
--- parser/ChangeLog 14 Apr 2003 14:14:50 -0000 1.29
+++ parser/ChangeLog 15 Apr 2003 13:05:04 -0000
@@ -1,3 +1,6 @@
+2003-04-15 Andrew Niefer
+ Added scanner support to fix Bug36047
+
2003-04-13 John Camelon
Minor cleanup of callbacks due to removal of NewModelBuilder.
Added parser support to partially fix bug36416 & bug36294. Also added minimal C-Model support for these fixes.
Index: parser/org/eclipse/cdt/internal/core/parser/IScanner.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/IScanner.java,v
retrieving revision 1.4
diff -u -r1.4 IScanner.java
--- parser/org/eclipse/cdt/internal/core/parser/IScanner.java 17 Mar 2003 19:48:46 -0000 1.4
+++ parser/org/eclipse/cdt/internal/core/parser/IScanner.java 15 Apr 2003 13:05:04 -0000
@@ -15,6 +15,7 @@
public interface IScanner {
public static final int tPOUNDPOUND = -6;
+ public static final int tPOUND = -7;
public IScanner initialize( Reader sourceToBeRead, String fileName );
Index: parser/org/eclipse/cdt/internal/core/parser/Scanner.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Scanner.java,v
retrieving revision 1.19
diff -u -r1.19 Scanner.java
--- parser/org/eclipse/cdt/internal/core/parser/Scanner.java 11 Apr 2003 21:20:14 -0000 1.19
+++ parser/org/eclipse/cdt/internal/core/parser/Scanner.java 15 Apr 2003 13:05:04 -0000
@@ -315,6 +315,11 @@
private boolean throwExceptionOnBadCharacterRead = false;
private boolean atEOF = false;
+ private boolean tokenizingMacroReplacementList = false;
+ public void setTokenizingMacroReplacementList( boolean mr ){
+ tokenizingMacroReplacementList = mr;
+ }
+
private boolean quickScan = false;
public void setQuickScan(boolean qs) {
quickScan = qs;
@@ -714,7 +719,10 @@
throw new ScannerException(BAD_PP + contextStack.getCurrentContext().getOffset());
else
return newToken( tPOUNDPOUND, "##" );
- }
+ } else if( tokenizingMacroReplacementList ) {
+ ungetChar( c );
+ return newToken( tPOUND, "#" );
+ }
while (((c >= 'a') && (c <= 'z'))
|| ((c >= 'A') && (c <= 'Z')) || (c == '_') ) {
@@ -730,8 +738,6 @@
if (throwExceptionOnBadPreprocessorSyntax)
throw new ScannerException(
BAD_PP + contextStack.getCurrentContext().getOffset());
-
-
} else {
int type = ((Integer) directive).intValue();
switch (type) {
@@ -1539,10 +1545,26 @@
helperScanner.initialize(
new StringReader(replacementString),
null);
+ helperScanner.setTokenizingMacroReplacementList( true );
Token t = helperScanner.nextToken(false);
try {
while (true) {
+ //each # preprocessing token in the replacement list shall be followed
+ //by a parameter as the next reprocessing token in the list
+ if( t.type == tPOUND ){
+ macroReplacementTokens.add( t );
+ t = helperScanner.nextToken(false);
+ int index = parameterIdentifiers.indexOf(t.image);
+ if (index == -1 ) {
+ //not found
+ if (throwExceptionOnBadPreprocessorSyntax)
+ throw new ScannerException(
+ BAD_PP + contextStack.getCurrentContext().getOffset());
+ return;
+ }
+ }
+
macroReplacementTokens.add(t);
t = helperScanner.nextToken(false);
}
@@ -1627,14 +1649,39 @@
buffer.append((char) c);
c = getChar();
}
+
String betweenTheBrackets = buffer.toString().trim();
- StringTokenizer tokenizer =
- new StringTokenizer(betweenTheBrackets, ",");
- Vector parameterValues = new Vector(tokenizer.countTokens());
- while (tokenizer.hasMoreTokens()) {
- parameterValues.add(tokenizer.nextToken().trim());
- }
+ Scanner tokenizer = new Scanner( new StringReader(betweenTheBrackets), TEXT, definitions );
+ Vector parameterValues = new Vector();
+ Token t = null;
+ String str = new String();
+ boolean space = false;
+ try{
+ while (true) {
+ t = tokenizer.nextToken(false);
+ if( t.type == Token.tCOMMA )
+ {
+ parameterValues.add( str );
+ str = "";
+ space = false;
+ continue;
+ }
+
+ if( space )
+ str += ' ';
+
+ if( t.type == Token.tSTRING )
+ str += '\"' + t.image + '\"';
+ else
+ str += t.image;
+
+ space = true;
+ }
+ } catch (Parser.EndOfFile e) {
+ // Good
+ parameterValues.add( str );
+ }
// create a string that represents what needs to be tokenized
buffer = new StringBuffer();
List tokens = macro.getTokenizedExpansion();
@@ -1649,7 +1696,7 @@
int numberOfTokens = tokens.size();
for (int i = 0; i < numberOfTokens; ++i) {
- Token t = (Token) tokens.get(i);
+ t = (Token) tokens.get(i);
if (t.type == Token.tIDENTIFIER) {
String identifierName = t.image;
@@ -1663,6 +1710,39 @@
} else {
buffer.append(
(String) parameterValues.elementAt(index) );
+ }
+ } else if (t.type == tPOUND) {
+ //next token should be a parameter which needs to be turned into
+ //a string literal
+ t = (Token) tokens.get( ++i );
+ int index = parameterNames.indexOf(t.image);
+ if( index == -1 ){
+ if (throwExceptionOnBadMacroExpansion)
+ throw new ScannerException( "Improper use of the # preprocessing token." );
+ } else {
+ buffer.append('\"');
+ String value = (String)parameterValues.elementAt(index);
+ char val [] = value.toCharArray();
+ char ch;
+ int length = value.length();
+ for( int j = 0; j < length; j++ ){
+ ch = val[j];
+ if( ch == ' ' || ch == '\t' || ch == '\r' || ch == '\n' ){
+ //Each occurance of whitespace becomes a single space character
+ while( ch == ' ' || ch == '\t' || ch == '\r' || ch == '\n' ){
+ ch = val[++j];
+ }
+ buffer.append(' ');
+ }
+ //a \ character is inserted before each " and \
+ if( ch == '\"' || ch == '\\' ){
+ buffer.append('\\');
+ buffer.append(ch);
+ } else {
+ buffer.append(ch);
+ }
+ }
+ buffer.append('\"');
}
} else {
buffer.append(t.image);