1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-04 23:55:26 +02:00

Patch by Klaus Falser modified by JohnC - Fix for https://bugs.eclipse.org/bugs/show_bug.cgi?id=60764

This commit is contained in:
John Camelon 2004-05-04 13:03:39 +00:00
parent 87b6836f3a
commit 43e38ae75c
2 changed files with 94 additions and 79 deletions
core
org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests
org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner

View file

@ -1552,15 +1552,15 @@ public class ScannerTestCase extends BaseScannerTest
assertTrue( d.isCircular() ); assertTrue( d.isCircular() );
} }
// public void testBug60764() throws Exception public void testBug60764() throws Exception
// { {
// Writer writer = new StringWriter(); Writer writer = new StringWriter();
// writer.write( "#define P a,b\n"); //$NON-NLS-1$ writer.write( "#define P a,b\n"); //$NON-NLS-1$
// writer.write( "#define M(x) M1(x)\n"); //$NON-NLS-1$ writer.write( "#define M(x) M1(x)\n"); //$NON-NLS-1$
// writer.write( "#define M1(x,y) #x #y\n"); //$NON-NLS-1$ writer.write( "#define M1(x,y) #x #y\n"); //$NON-NLS-1$
// writer.write( "M(P)\n"); //$NON-NLS-1$ writer.write( "M(P)\n"); //$NON-NLS-1$
// initializeScanner( writer.toString() ); initializeScanner( writer.toString() );
// validateString( "ab"); //$NON-NLS-1$ validateString( "ab"); //$NON-NLS-1$
// validateEOF(); validateEOF();
// } }
} }

View file

@ -2850,23 +2850,49 @@ public class Scanner implements IScanner {
protected Vector getMacroParameters (String params, boolean forStringizing) throws ScannerException { protected Vector getMacroParameters (String params, boolean forStringizing) throws ScannerException {
// split params up into single arguments
int nParen = 0;
Vector parameters = new Vector();
StringBuffer parBuffer = new StringBuffer(); //$NON-NLS-1$
for (int i = 0; i < params.length(); i++) {
char c = params.charAt(i);
switch (c) {
case '(' :
nParen++;
break;
case ')' :
nParen--;
break;
case ',' :
if (nParen == 0) {
parameters.add(parBuffer.toString());
parBuffer = new StringBuffer(); //$NON-NLS-1$
continue;
}
break;
default :
break;
}
parBuffer.append( c );
}
parameters.add(parBuffer.toString());
Vector parameterValues = new Vector();
for (int i = 0; i < parameters.size(); i++) {
Scanner tokenizer = new Scanner( Scanner tokenizer = new Scanner(
new StringReader(params), new StringReader((String)parameters.elementAt(i)),
TEXT, TEXT,
scannerData.getPublicDefinitions(), scannerData.getPublicDefinitions(),
scannerData.getIncludePathNames(), EMPTY_LIST,
NULL_REQUESTOR, NULL_REQUESTOR,
scannerData.getParserMode(), scannerData.getParserMode(),
scannerData.getLanguage(), scannerData.getLanguage(),
NULL_LOG_SERVICE, NULL_LOG_SERVICE,
scannerExtension ); scannerExtension );
tokenizer.setThrowExceptionOnBadCharacterRead(false); tokenizer.setThrowExceptionOnBadCharacterRead(false);
Vector parameterValues = new Vector(); IToken t = null;
SimpleToken t = null;
StringBuffer buffer = new StringBuffer(); StringBuffer buffer = new StringBuffer();
boolean space = false; boolean space = false;
int nParen = 0;
try { try {
while (true) { while (true) {
@ -2875,18 +2901,7 @@ public class Scanner implements IScanner {
space = false; space = false;
} }
if (c != NOCHAR) tokenizer.ungetChar(c); if (c != NOCHAR) tokenizer.ungetChar(c);
t = (forStringizing ? tokenizer.nextTokenForStringizing() : tokenizer.nextToken(false));
t = (SimpleToken)(forStringizing ? tokenizer.nextTokenForStringizing() : tokenizer.nextToken(false));
if (t.getType() == IToken.tLPAREN) {
nParen++;
} else if (t.getType() == IToken.tRPAREN) {
nParen--;
} else if (t.getType() == IToken.tCOMMA && nParen == 0) {
parameterValues.add(buffer.toString());
buffer = new StringBuffer();
space = false;
continue;
}
if (space) if (space)
buffer.append( ' ' ); buffer.append( ' ' );
@ -2918,7 +2933,7 @@ public class Scanner implements IScanner {
// Good // Good
parameterValues.add(buffer.toString()); parameterValues.add(buffer.toString());
} }
}
return parameterValues; return parameterValues;
} }