Skip to main content

[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);

Back to the top