1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +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

View file

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

View file

@ -2850,75 +2850,90 @@ public class Scanner implements IScanner {
protected Vector getMacroParameters (String params, boolean forStringizing) throws ScannerException {
Scanner tokenizer = new Scanner(
new StringReader(params),
TEXT,
scannerData.getPublicDefinitions(),
scannerData.getIncludePathNames(),
NULL_REQUESTOR,
scannerData.getParserMode(),
scannerData.getLanguage(),
NULL_LOG_SERVICE,
scannerExtension );
tokenizer.setThrowExceptionOnBadCharacterRead(false);
Vector parameterValues = new Vector();
SimpleToken t = null;
StringBuffer buffer = new StringBuffer();
boolean space = false;
// split params up into single arguments
int nParen = 0;
try {
while (true) {
int c = tokenizer.getCharacter();
if ((c != ' ') && (c != '\t') && (c != '\r') && (c != '\n')) {
space = false;
}
if (c != NOCHAR) tokenizer.ungetChar(c);
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)
buffer.append( ' ' );
switch (t.getType()) {
case IToken.tSTRING :
buffer.append('\"');
buffer.append(t.getImage());
buffer.append('\"');
break;
case IToken.tLSTRING :
buffer.append( "L\""); //$NON-NLS-1$
buffer.append(t.getImage());
buffer.append('\"');
break;
case IToken.tCHAR :
buffer.append('\'');
buffer.append(t.getImage());
buffer.append('\'');
break;
default :
buffer.append( t.getImage());
break;
}
space = true;
}
}
catch (EndOfFileException e) {
// Good
parameterValues.add(buffer.toString());
}
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(
new StringReader((String)parameters.elementAt(i)),
TEXT,
scannerData.getPublicDefinitions(),
EMPTY_LIST,
NULL_REQUESTOR,
scannerData.getParserMode(),
scannerData.getLanguage(),
NULL_LOG_SERVICE,
scannerExtension );
tokenizer.setThrowExceptionOnBadCharacterRead(false);
IToken t = null;
StringBuffer buffer = new StringBuffer();
boolean space = false;
try {
while (true) {
int c = tokenizer.getCharacter();
if ((c != ' ') && (c != '\t') && (c != '\r') && (c != '\n')) {
space = false;
}
if (c != NOCHAR) tokenizer.ungetChar(c);
t = (forStringizing ? tokenizer.nextTokenForStringizing() : tokenizer.nextToken(false));
if (space)
buffer.append( ' ' );
switch (t.getType()) {
case IToken.tSTRING :
buffer.append('\"');
buffer.append(t.getImage());
buffer.append('\"');
break;
case IToken.tLSTRING :
buffer.append( "L\""); //$NON-NLS-1$
buffer.append(t.getImage());
buffer.append('\"');
break;
case IToken.tCHAR :
buffer.append('\'');
buffer.append(t.getImage());
buffer.append('\'');
break;
default :
buffer.append( t.getImage());
break;
}
space = true;
}
}
catch (EndOfFileException e) {
// Good
parameterValues.add(buffer.toString());
}
}
return parameterValues;
}