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:
parent
87b6836f3a
commit
43e38ae75c
2 changed files with 94 additions and 79 deletions
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue