Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohn Camelon2004-05-19 15:35:06 +0000
committerJohn Camelon2004-05-19 15:35:06 +0000
commit9ebf2c99093949be13d33b05a6695fc9d76e14fc (patch)
treea04346bd9f8cea00db85c8e794875eb14eaee3c6
parent823cb6c7552ae4d6a2f7a293b72c3f8addd6b9be (diff)
downloadorg.eclipse.cdt-9ebf2c99093949be13d33b05a6695fc9d76e14fc.tar.gz
org.eclipse.cdt-9ebf2c99093949be13d33b05a6695fc9d76e14fc.tar.xz
org.eclipse.cdt-9ebf2c99093949be13d33b05a6695fc9d76e14fc.zip
Patch for David Daoust: Removed extraneous StringBuffer objects from the Scanner.
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/Scanner.java428
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/ScannerStringBuffer.java51
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/ScannerUtility.java32
3 files changed, 291 insertions, 220 deletions
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/Scanner.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/Scanner.java
index e8b93aa3e4f..ab48aeaca64 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/Scanner.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/Scanner.java
@@ -68,6 +68,7 @@ import org.eclipse.cdt.internal.core.parser.util.TraceUtil;
public class Scanner implements IScanner {
+ static ScannerStringBuffer strbuff = new ScannerStringBuffer(100);
protected static final String HEX_PREFIX = "0x"; //$NON-NLS-1$
private static final ObjectMacroDescriptor CPLUSPLUS_MACRO = new ObjectMacroDescriptor( __CPLUSPLUS, "199711L"); //$NON-NLS-1$
private static final ObjectMacroDescriptor STDC_VERSION_MACRO = new ObjectMacroDescriptor( __STDC_VERSION__, "199001L"); //$NON-NLS-1$
@@ -314,11 +315,11 @@ public class Scanner implements IScanner {
if( !file.exists() && path.indexOf('\"') != -1 )
{
StringTokenizer tokenizer = new StringTokenizer(path, "\"" ); //$NON-NLS-1$
- StringBuffer buffer = new StringBuffer(path.length() );
+ strbuff.startString();
while( tokenizer.hasMoreTokens() ){
- buffer.append( tokenizer.nextToken() );
+ strbuff.append( tokenizer.nextToken() );
}
- file = new File( buffer.toString() );
+ file = new File( strbuff.toString() );
}
if( file.exists() && file.isDirectory() )
@@ -366,7 +367,7 @@ public class Scanner implements IScanner {
int c = getChar();
if (c == '\n')
return ""; //$NON-NLS-1$
- StringBuffer buffer = new StringBuffer();
+ strbuff.startString();
boolean inString = false;
boolean inChar = false;
while (true) {
@@ -377,14 +378,14 @@ public class Scanner implements IScanner {
&& (c != '"' || ( c == '"' && inChar ) )
&& (c != '\'' || ( c == '\'' && inString ) )
&& (c != NOCHAR)) {
- buffer.append((char) c);
+ strbuff.append(c);
c = getChar( true );
}
if (c == '/') {
//only care about comments outside of a quote
if( inString || inChar ){
- buffer.append( (char) c );
+ strbuff.append( c );
c = getChar( true );
continue;
}
@@ -404,18 +405,18 @@ public class Scanner implements IScanner {
continue;
} else {
// we are not in a comment
- buffer.append((char) c);
+ strbuff.append(c);
c = next;
continue;
}
} else if( c == '"' ){
inString = !inString;
- buffer.append((char) c);
+ strbuff.append(c);
c = getChar( true );
continue;
} else if( c == '\'' ){
inChar = !inChar;
- buffer.append((char) c);
+ strbuff.append(c);
c = getChar( true );
continue;
} else if( c == '\\' ){
@@ -428,9 +429,9 @@ public class Scanner implements IScanner {
} else if( c == '\n' ){
c = getChar(true);
} else {
- buffer.append('\\');
+ strbuff.append('\\');
if( c == '"' || c == '\'' ){
- buffer.append((char)c);
+ strbuff.append(c);
c = getChar( true );
}
}
@@ -441,7 +442,7 @@ public class Scanner implements IScanner {
}
}
- return buffer.toString();
+ return strbuff.toString();
}
protected void skipOverTextUntilNewline() throws ScannerException {
@@ -481,26 +482,26 @@ public class Scanner implements IScanner {
}
protected String getNextIdentifier() throws ScannerException {
- StringBuffer buffer = new StringBuffer();
+ strbuff.startString();
skipOverWhitespace();
int c = getChar();
if (((c >= 'a') && (c <= 'z'))
|| ((c >= 'A') && (c <= 'Z')) | (c == '_')) {
- buffer.append((char) c);
+ strbuff.append(c);
c = getChar();
while (((c >= 'a') && (c <= 'z'))
|| ((c >= 'A') && (c <= 'Z'))
|| ((c >= '0') && (c <= '9'))
|| (c == '_')) {
- buffer.append((char) c);
+ strbuff.append(c);
c = getChar();
}
}
ungetChar(c);
- return buffer.toString();
+ return strbuff.toString();
}
protected void handleInclusion(String fileName, boolean useIncludePaths, int beginOffset, int startLine, int nameOffset, int nameLine, int endOffset, int endLine ) throws ScannerException {
@@ -863,15 +864,15 @@ public class Scanner implements IScanner {
return nextToken( true );
}
- public boolean pasteIntoInputStream(StringBuffer buff) throws ScannerException, EndOfFileException
+ public boolean pasteIntoInputStream(String buff) throws ScannerException, EndOfFileException
{
// we have found ## in the input stream -- so save the results
if( lookAheadForTokenPasting() )
{
if( storageBuffer == null )
- storageBuffer = buff;
+ storageBuffer = new StringBuffer(buff);
else
- storageBuffer.append( buff.toString() );
+ storageBuffer.append( buff );
return true;
}
@@ -928,7 +929,7 @@ public class Scanner implements IScanner {
public IToken processStringLiteral(boolean wideLiteral) throws ScannerException, EndOfFileException
{
int beginOffset = getCurrentOffset();
- StringBuffer buff = new StringBuffer();
+ strbuff.startString();
int beforePrevious = NOCHAR;
int previous = '"';
int c = getChar(true);
@@ -947,7 +948,7 @@ public class Scanner implements IScanner {
return null;
}
- buff.append((char) c);
+ strbuff.append(c);
beforePrevious = previous;
previous = c;
c = getChar(true);
@@ -958,7 +959,8 @@ public class Scanner implements IScanner {
//If the next token is going to be a string as well, we need to concatenate
//it with this token. This will be recursive for as many strings as need to be concatenated
- IToken returnToken = newToken( type, buff.toString());
+ String result = strbuff.toString();
+ IToken returnToken = newToken( type, result );
IToken next = null;
try{
@@ -966,7 +968,7 @@ public class Scanner implements IScanner {
if ( next != null &&
(next.getType() == IToken.tSTRING ||
next.getType() == IToken.tLSTRING )) {
- buff.append( next.getImage() );
+ returnToken.setImage(result + next.getImage());
}
else
cachedToken = next;
@@ -974,8 +976,6 @@ public class Scanner implements IScanner {
next = null;
}
- returnToken.setImage(buff.toString());
-
currentToken = returnToken;
returnToken.setNext( null );
return returnToken;
@@ -991,19 +991,20 @@ public class Scanner implements IScanner {
// int x = F2;
int beginOffset = getCurrentOffset();
- StringBuffer buff = new StringBuffer();
+ strbuff.startString();
boolean hex = false;
boolean floatingPoint = ( c == '.' ) ? true : false;
boolean firstCharZero = ( c== '0' )? true : false;
- buff.append((char) c);
+ strbuff.append(c);
+ int firstChar = c;
c = getChar();
if( ! firstCharZero && floatingPoint && !(c >= '0' && c <= '9') ){
//if pasting, there could actually be a float here instead of just a .
- if( buff.toString().equals( "." ) ){ //$NON-NLS-1$
+ if( firstChar == '.' ) {
if( c == '*' ){
return newConstantToken( IToken.tDOTSTAR );
} else if( c == '.' ){
@@ -1023,7 +1024,7 @@ public class Scanner implements IScanner {
// c = getChar();
// continue;
}
- buff.append( (char)c );
+ strbuff.append(c);
hex = true;
c = getChar();
}
@@ -1031,13 +1032,13 @@ public class Scanner implements IScanner {
while ((c >= '0' && c <= '9')
|| (hex
&& ((c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F')))) {
- buff.append((char) c);
+ strbuff.append(c);
c = getChar();
}
if( c == '.' )
{
- buff.append( (char)c);
+ strbuff.append(c);
floatingPoint = true;
c= getChar();
@@ -1045,7 +1046,7 @@ public class Scanner implements IScanner {
|| (hex
&& ((c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F'))))
{
- buff.append((char) c);
+ strbuff.append(c);
c = getChar();
}
}
@@ -1055,27 +1056,27 @@ public class Scanner implements IScanner {
{
if( ! floatingPoint ) floatingPoint = true;
// exponent type for floating point
- buff.append((char)c);
+ strbuff.append(c);
c = getChar();
// optional + or -
if( c == '+' || c == '-' )
{
- buff.append( (char)c );
+ strbuff.append(c );
c = getChar();
}
// digit sequence of exponent part
while ((c >= '0' && c <= '9') )
{
- buff.append((char) c);
+ strbuff.append(c);
c = getChar();
}
// optional suffix
if( c == 'l' || c == 'L' || c == 'f' || c == 'F' )
{
- buff.append( (char)c );
+ strbuff.append(c );
c = getChar();
}
} else {
@@ -1103,13 +1104,12 @@ public class Scanner implements IScanner {
}
ungetChar( c );
+
+ String result = strbuff.toString();
- if( pasting && pasteIntoInputStream(buff))
+ if( pasting && pasteIntoInputStream(result))
return null;
-
-
- String result = buff.toString();
-
+
if( floatingPoint && result.equals(".") ) //$NON-NLS-1$
return newConstantToken( IToken.tDOT );
@@ -1149,17 +1149,17 @@ public class Scanner implements IScanner {
return newConstantToken( tPOUND ); //$NON-NLS-1$
}
- StringBuffer buff = new StringBuffer();
- buff.append('#');
+ strbuff.startString();
+ strbuff.append('#');
while (((c >= 'a') && (c <= 'z'))
|| ((c >= 'A') && (c <= 'Z')) || (c == '_') ) {
- buff.append((char) c);
+ strbuff.append(c);
c = getChar();
}
ungetChar(c);
- String token = buff.toString();
+ String token = strbuff.toString();
if( isLimitReached() )
handleCompletionOnPreprocessorDirective(token);
@@ -1254,9 +1254,10 @@ public class Scanner implements IScanner {
if( ! restOfLine.equals( "" ) ) //$NON-NLS-1$
{
- StringBuffer buffer = new StringBuffer("#endif "); //$NON-NLS-1$
- buffer.append( restOfLine );
- handleProblem( IProblem.PREPROCESSOR_INVALID_DIRECTIVE, buffer.toString(), beginningOffset, false, true );
+ strbuff.startString();
+ strbuff.append("#endif "); //$NON-NLS-1$
+ strbuff.append( restOfLine );
+ handleProblem( IProblem.PREPROCESSOR_INVALID_DIRECTIVE, strbuff.toString(), beginningOffset, false, true );
}
try{
passOnToClient = scannerData.getBranchTracker().poundEndif();
@@ -1328,11 +1329,12 @@ public class Scanner implements IScanner {
}
catch( EmptyStackException ese )
{
- StringBuffer buffer = new StringBuffer( token );
- buffer.append( ' ' );
- buffer.append( elifExpression );
+ strbuff.startString();
+ strbuff.append( token );
+ strbuff.append( ' ' );
+ strbuff.append( elifExpression );
handleProblem( IProblem.PREPROCESSOR_UNBALANCE_CONDITION,
- buffer.toString(),
+ strbuff.toString(),
beginningOffset,
false, true );
}
@@ -1368,30 +1370,32 @@ public class Scanner implements IScanner {
String remainderOfLine =
getRestOfPreprocessorLine().trim();
if (!remainderOfLine.equals("")) { //$NON-NLS-1$
- StringBuffer buffer = new StringBuffer( "# "); //$NON-NLS-1$
- buffer.append( remainderOfLine );
- handleProblem( IProblem.PREPROCESSOR_INVALID_DIRECTIVE, buffer.toString(), beginningOffset, false, true);
+ strbuff.startString();
+ strbuff.append( "# "); //$NON-NLS-1$
+ strbuff.append( remainderOfLine );
+ handleProblem( IProblem.PREPROCESSOR_INVALID_DIRECTIVE, strbuff.toString(), beginningOffset, false, true);
}
return null;
default :
- StringBuffer buffer = new StringBuffer( "# "); //$NON-NLS-1$
- buffer.append( token );
- handleProblem( IProblem.PREPROCESSOR_INVALID_DIRECTIVE, buffer.toString(), beginningOffset, false, true );
+ strbuff.startString();
+ strbuff.append( "# "); //$NON-NLS-1$
+ strbuff.append( token );
+ handleProblem( IProblem.PREPROCESSOR_INVALID_DIRECTIVE, strbuff.toString(), beginningOffset, false, true );
return null;
}
}
// buff contains \\u or \\U
- protected StringBuffer processUniversalCharacterName( StringBuffer buff ) throws ScannerException
+ protected boolean processUniversalCharacterName() throws ScannerException
{
// first octet is mandatory
for( int i = 0; i < 4; ++i )
{
int c = getChar();
if( ! isHex( c ))
- return null;
- buff.append( (char) c );
+ return false;
+ strbuff.append( c );
}
Vector v = new Vector();
@@ -1409,14 +1413,14 @@ public class Scanner implements IScanner {
if( v.size() == 4 )
{
for( int i = 0; i < 4; ++i )
- buff.append( ((Character)v.get(i)).charValue());
+ strbuff.append( ((Character)v.get(i)).charValue());
}
else
{
for( int i = v.size() - 1; i >= 0; --i )
ungetChar( ((Character)v.get(i)).charValue() );
}
- return buff;
+ return true;
}
/**
@@ -1455,7 +1459,7 @@ public class Scanner implements IScanner {
}
}
- protected IToken processKeywordOrIdentifier(StringBuffer buff, boolean pasting) throws ScannerException, EndOfFileException
+ protected IToken processKeywordOrIdentifier(boolean pasting) throws ScannerException, EndOfFileException
{
int baseOffset = lastContext.getOffset() - 1;
@@ -1468,7 +1472,7 @@ public class Scanner implements IScanner {
while ( ( scannerExtension.offersDifferentIdentifierCharacters() &&
scannerExtension.isValidIdentifierCharacter(c) ) ||
isValidIdentifierCharacter(c) ) {
- buff.append((char) c);
+ strbuff.append(c);
c = getChar();
if (c == '\\') {
c = consumeNewlineAfterSlash();
@@ -1479,10 +1483,10 @@ public class Scanner implements IScanner {
int next = getChar();
if( next == 'u' || next == 'U')
{
- buff.append( '\\');
- buff.append( (char)next );
- buff = processUniversalCharacterName(buff);
- if( buff == null ) return null;
+ strbuff.append( '\\');
+ strbuff.append( next );
+ if( !processUniversalCharacterName() )
+ return null;
continue; // back to top of loop
}
ungetChar( next );
@@ -1492,7 +1496,7 @@ public class Scanner implements IScanner {
ungetChar(c);
- String ident = buff. toString();
+ String ident = strbuff. toString();
if (ident.equals(DEFINED))
return newToken(IToken.tINTEGER, handleDefinedMacro());
@@ -1511,7 +1515,7 @@ public class Scanner implements IScanner {
return null;
}
- if( pasting && pasteIntoInputStream(buff))
+ if( pasting && pasteIntoInputStream(ident))
return null;
Object tokenTypeObject;
@@ -1761,9 +1765,10 @@ public class Scanner implements IScanner {
case ':' : return newConstantToken(IToken.tLBRACKET);
default :
- StringBuffer buff = new StringBuffer( "<"); //$NON-NLS-1$
- buff.append( (char)c);
- String query =buff.toString();
+ strbuff.startString();
+ strbuff.append('<');
+ strbuff.append(c);
+ String query = strbuff.toString();
if( scannerExtension.isExtensionOperator( scannerData.getLanguage(), query ) )
return newExtensionToken( scannerExtension.createExtensionToken( scannerData, query ));
ungetChar(c);
@@ -1784,9 +1789,10 @@ public class Scanner implements IScanner {
}
case '=' : return newConstantToken(IToken.tGTEQUAL);
default :
- StringBuffer buff = new StringBuffer( ">"); //$NON-NLS-1$
- buff.append( (char)c);
- String query =buff.toString();
+ strbuff.startString();
+ strbuff.append('>');
+ strbuff.append( (char)c);
+ String query = strbuff.toString();
if( scannerExtension.isExtensionOperator( scannerData.getLanguage(), query ) )
return newExtensionToken( scannerExtension.createExtensionToken( scannerData, query ));
ungetChar(c);
@@ -1880,7 +1886,9 @@ public class Scanner implements IScanner {
{
// This is not a wide literal -- it must be a token or keyword
ungetChar(c);
- token = processKeywordOrIdentifier(new StringBuffer( "L"), pasting);//$NON-NLS-1$
+ strbuff.startString();
+ strbuff.append('L');
+ token = processKeywordOrIdentifier(pasting);
}
if (token == null)
{
@@ -1941,9 +1949,9 @@ public class Scanner implements IScanner {
case 'Y':
case 'Z':
case '_':
- StringBuffer sBuffer = new StringBuffer( );
- sBuffer.append( (char) c );
- token = processKeywordOrIdentifier(sBuffer, pasting);
+ strbuff.startString();
+ strbuff.append( c );
+ token = processKeywordOrIdentifier(pasting);
if (token == null)
{
c = getChar();
@@ -1977,9 +1985,9 @@ public class Scanner implements IScanner {
scannerExtension.isValidIdentifierStartCharacter(c) ) ||
isValidIdentifierStartCharacter(c) )
{
- StringBuffer startBuffer = new StringBuffer( );
- startBuffer.append( (char) c );
- token = processKeywordOrIdentifier(startBuffer, pasting);
+ strbuff.startString();
+ strbuff.append( c );
+ token = processKeywordOrIdentifier(pasting);
if (token == null)
{
c = getChar();
@@ -1990,19 +1998,19 @@ public class Scanner implements IScanner {
else if( c == '\\' )
{
int next = getChar();
- StringBuffer ucnBuffer = new StringBuffer( "\\");//$NON-NLS-1$
- ucnBuffer.append( (char) next );
+ strbuff.startString();
+ strbuff.append( '\\');
+ strbuff.append( next );
if( next == 'u' || next =='U' )
{
- StringBuffer secondBuffer = processUniversalCharacterName(ucnBuffer);
- if( secondBuffer == null )
+ if( !processUniversalCharacterName() )
{
- handleProblem( IProblem.SCANNER_BAD_CHARACTER, ucnBuffer.toString(), getCurrentOffset(), false, true, throwExceptionOnBadCharacterRead );
+ handleProblem( IProblem.SCANNER_BAD_CHARACTER, strbuff.toString(), getCurrentOffset(), false, true, throwExceptionOnBadCharacterRead );
c = getChar();
continue;
}
- token = processKeywordOrIdentifier( secondBuffer, pasting );
+ token = processKeywordOrIdentifier( pasting );
if (token == null)
{
c = getChar();
@@ -2011,7 +2019,7 @@ public class Scanner implements IScanner {
return token;
}
ungetChar( next );
- handleProblem( IProblem.SCANNER_BAD_CHARACTER, ucnBuffer.toString(), getCurrentOffset(), false, true, throwExceptionOnBadCharacterRead );
+ handleProblem( IProblem.SCANNER_BAD_CHARACTER, strbuff.toString(), getCurrentOffset(), false, true, throwExceptionOnBadCharacterRead );
}
handleProblem( IProblem.SCANNER_BAD_CHARACTER, new Character( (char)c ).toString(), getCurrentOffset(), false, true, throwExceptionOnBadCharacterRead );
@@ -2153,7 +2161,7 @@ public class Scanner implements IScanner {
int beginOffset = getCurrentOffset();
int type = wideLiteral ? IToken.tLCHAR : IToken.tCHAR;
- StringBuffer buffer = new StringBuffer();
+ strbuff.startString();
int prev = c;
int prevPrev = c;
c = getChar(true);
@@ -2171,13 +2179,13 @@ public class Scanner implements IScanner {
// exit condition
if ( ( c =='\'' ) && ( prev != '\\' || prevPrev == '\\' ) ) break;
- buffer.append( (char)c);
+ strbuff.append(c);
prevPrev = prev;
prev = c;
c = getChar(true);
}
- return newToken( type, buffer.toString());
+ return newToken( type, strbuff.toString());
}
@@ -2202,57 +2210,56 @@ public class Scanner implements IScanner {
{
int beginOffset = getCurrentOffset();
int c = getChar();
- StringBuffer tokenImage = new StringBuffer();
+ strbuff.startString();
try {
- while (c != NOCHAR) {
-
- if ((c == ' ') || (c == '\r') || (c == '\t') || (c == '\n')) {
-
- if (tokenImage.length() > 0) throw endOfMacroToken;
- c = getChar();
- continue;
- } else if (c == '"') {
-
- if (tokenImage.length() > 0) throw endOfMacroToken;
-
- // string
- StringBuffer buff = new StringBuffer();
- c = getChar(true);
-
- for( ; ; )
- {
- if ( c =='"' ) break;
- if( c == NOCHAR) break;
- buff.append((char) c);
- c = getChar(true);
- }
-
- if (c != NOCHAR )
- {
- return newToken( IToken.tSTRING, buff.toString());
-
- }
- handleProblem( IProblem.SCANNER_UNBOUNDED_STRING, null, beginOffset, false, true );
- c = getChar();
- continue;
-
- } else {
+ while (c != NOCHAR) {
switch (c) {
+ case ' ' :
+ case '\r' :
+ case '\t' :
+ case '\n' :
+ if (strbuff.length() > 0) throw endOfMacroToken;
+ c = getChar();
+ continue;
+ case '"' :
+ if (strbuff.length() > 0) throw endOfMacroToken;
+
+ // string
+ strbuff.startString();
+ c = getChar(true);
+
+ for( ; ; )
+ {
+ if ( c =='"' ) break;
+ if( c == NOCHAR) break;
+ strbuff.append(c);
+ c = getChar(true);
+ }
+
+ if (c != NOCHAR )
+ {
+ return newToken( IToken.tSTRING, strbuff.toString());
+
+ }
+ handleProblem( IProblem.SCANNER_UNBOUNDED_STRING, null, beginOffset, false, true );
+ c = getChar();
+ continue;
+
case '\'' :
- if (tokenImage.length() > 0) throw endOfMacroToken;
+ if (strbuff.length() > 0) throw endOfMacroToken;
return processCharacterLiteral( c, false );
case ',' :
- if (tokenImage.length() > 0) throw endOfMacroToken;
+ if (strbuff.length() > 0) throw endOfMacroToken;
return newToken(IToken.tCOMMA, ","); //$NON-NLS-1$
case '(' :
- if (tokenImage.length() > 0) throw endOfMacroToken;
+ if (strbuff.length() > 0) throw endOfMacroToken;
return newToken(IToken.tLPAREN, "("); //$NON-NLS-1$
case ')' :
- if (tokenImage.length() > 0) throw endOfMacroToken;
+ if (strbuff.length() > 0) throw endOfMacroToken;
return newToken(IToken.tRPAREN, ")"); //$NON-NLS-1$
case '/' :
- if (tokenImage.length() > 0) throw endOfMacroToken;
+ if (strbuff.length() > 0) throw endOfMacroToken;
c = getChar();
switch (c) {
case '/' :
@@ -2264,23 +2271,22 @@ public class Scanner implements IScanner {
c = getChar();
continue;
default:
- tokenImage.append('/');
+ strbuff.append('/');
continue;
}
default :
- tokenImage.append((char)c);
+ strbuff.append(c);
c = getChar();
}
}
- }
} catch (endOfMacroTokenException e) {
// unget the first character after the end of token
ungetChar(c);
}
// return completed token
- if (tokenImage.length() > 0) {
- return newToken(IToken.tIDENTIFIER, tokenImage.toString());
+ if (strbuff.length() > 0) {
+ return newToken(IToken.tIDENTIFIER, strbuff.toString());
}
// we're done
@@ -2465,11 +2471,12 @@ public class Scanner implements IScanner {
throws ScannerException {
IExpressionParser parser = null;
- StringBuffer expressionBuffer = new StringBuffer( expression );
- expressionBuffer.append( ';');
+ strbuff.startString();
+ strbuff.append(expression);
+ strbuff.append(';');
IScanner trial = new Scanner(
- new StringReader(expressionBuffer.toString()),
+ new StringReader(strbuff.toString()),
EXPRESSION,
scannerData.getPublicDefinitions(),
scannerData.getIncludePathNames(),
@@ -2579,9 +2586,10 @@ public class Scanner implements IScanner {
}
catch( ScannerUtility.InclusionParseException ipe )
{
- StringBuffer potentialErrorLine = new StringBuffer( "#include "); //$NON-NLS-1$
- potentialErrorLine.append( includeLine );
- handleProblem( IProblem.PREPROCESSOR_INVALID_DIRECTIVE, potentialErrorLine.toString(), beginningOffset, false, true );
+ strbuff.startString();
+ strbuff.append( "#include "); //$NON-NLS-1$
+ strbuff.append( includeLine );
+ handleProblem( IProblem.PREPROCESSOR_INVALID_DIRECTIVE, strbuff.toString(), beginningOffset, false, true );
return;
}
@@ -2686,11 +2694,12 @@ public class Scanner implements IScanner {
if( beginning != NO_OFFSET_LIMIT )
{
- StringBuffer buffer = new StringBuffer( POUND_DEFINE );
- buffer.append( key );
- buffer.append( ' ' );
- buffer.append( replacementString );
- handleProblem( IProblem.PREPROCESSOR_MACRO_PASTING_ERROR, buffer.toString(),
+ strbuff.startString();
+ strbuff.append( POUND_DEFINE );
+ strbuff.append( key );
+ strbuff.append( ' ' );
+ strbuff.append( replacementString );
+ handleProblem( IProblem.PREPROCESSOR_MACRO_PASTING_ERROR, strbuff.toString(),
beginning, false, true );
return null;
}
@@ -2737,7 +2746,7 @@ public class Scanner implements IScanner {
// identifier and the opening parenthesis
int c = getChar();
if (c == '(') {
- StringBuffer buffer = new StringBuffer();
+ strbuff.startString();
c = getChar(true);
while (c != ')') {
if( c == '\\' ){
@@ -2749,27 +2758,31 @@ public class Scanner implements IScanner {
c = getChar();
continue;
}
- StringBuffer potentialErrorMessage = new StringBuffer( POUND_DEFINE );
ungetChar( c );
- potentialErrorMessage.append( buffer );
- potentialErrorMessage.append( '\\');
- potentialErrorMessage.append( (char)c );
- handleProblem( IProblem.PREPROCESSOR_INVALID_MACRO_DEFN, potentialErrorMessage.toString(), beginning, false, true);
+ String line = strbuff.toString();
+ strbuff.startString();
+ strbuff.append( POUND_DEFINE );
+ strbuff.append( line );
+ strbuff.append( '\\');
+ strbuff.append( c );
+ handleProblem( IProblem.PREPROCESSOR_INVALID_MACRO_DEFN, strbuff.toString(), beginning, false, true);
return;
} else if( c == '\r' || c == '\n' || c == NOCHAR ){
- StringBuffer potentialErrorMessage = new StringBuffer( POUND_DEFINE );
- potentialErrorMessage.append( buffer );
- potentialErrorMessage.append( '\\');
- potentialErrorMessage.append( (char)c );
- handleProblem( IProblem.PREPROCESSOR_INVALID_MACRO_DEFN, potentialErrorMessage.toString(), beginning, false, true );
+ String line = strbuff.toString();
+ strbuff.startString();
+ strbuff.append( POUND_DEFINE );
+ strbuff.append( line );
+ strbuff.append( '\\');
+ strbuff.append( c );
+ handleProblem( IProblem.PREPROCESSOR_INVALID_MACRO_DEFN, strbuff.toString(), beginning, false, true );
return;
}
- buffer.append((char) c);
+ strbuff.append(c);
c = getChar(true);
}
- String parameters = buffer.toString();
+ String parameters = strbuff.toString();
// replace StringTokenizer later -- not performant
StringTokenizer tokenizer = new StringTokenizer(parameters, ","); //$NON-NLS-1$
@@ -2897,7 +2910,7 @@ public class Scanner implements IScanner {
// split params up into single arguments
int nParen = 0;
Vector parameters = new Vector();
- StringBuffer parBuffer = new StringBuffer(); //$NON-NLS-1$
+ strbuff.startString();
for (int i = 0; i < params.length(); i++) {
char c = params.charAt(i);
switch (c) {
@@ -2909,17 +2922,17 @@ public class Scanner implements IScanner {
break;
case ',' :
if (nParen == 0) {
- parameters.add(parBuffer.toString());
- parBuffer = new StringBuffer(); //$NON-NLS-1$
+ parameters.add(strbuff.toString());
+ strbuff.startString();
continue;
}
break;
default :
break;
}
- parBuffer.append( c );
+ strbuff.append( c );
}
- parameters.add(parBuffer.toString());
+ parameters.add(strbuff.toString());
Vector parameterValues = new Vector();
for (int i = 0; i < parameters.size(); i++) {
@@ -2935,7 +2948,7 @@ public class Scanner implements IScanner {
scannerExtension );
tokenizer.setThrowExceptionOnBadCharacterRead(false);
IToken t = null;
- StringBuffer buffer = new StringBuffer();
+ StringBuffer strbuff = new StringBuffer();
boolean space = false;
try {
@@ -2948,26 +2961,26 @@ public class Scanner implements IScanner {
t = (forStringizing ? tokenizer.nextTokenForStringizing() : tokenizer.nextToken(false));
if (space)
- buffer.append( ' ' );
+ strbuff.append( ' ' );
switch (t.getType()) {
case IToken.tSTRING :
- buffer.append('\"');
- buffer.append(t.getImage());
- buffer.append('\"');
+ strbuff.append('\"');
+ strbuff.append(t.getImage());
+ strbuff.append('\"');
break;
case IToken.tLSTRING :
- buffer.append( "L\""); //$NON-NLS-1$
- buffer.append(t.getImage());
- buffer.append('\"');
+ strbuff.append( "L\""); //$NON-NLS-1$
+ strbuff.append(t.getImage());
+ strbuff.append('\"');
break;
case IToken.tCHAR :
- buffer.append('\'');
- buffer.append(t.getImage());
- buffer.append('\'');
+ strbuff.append('\'');
+ strbuff.append(t.getImage());
+ strbuff.append('\'');
break;
default :
- buffer.append( t.getImage());
+ strbuff.append( t.getImage());
break;
}
space = true;
@@ -2975,7 +2988,7 @@ public class Scanner implements IScanner {
}
catch (EndOfFileException e) {
// Good
- parameterValues.add(buffer.toString());
+ parameterValues.add(strbuff.toString());
}
}
@@ -3017,7 +3030,7 @@ public class Scanner implements IScanner {
int c = getChar();
if (c == '(') {
- StringBuffer buffer = new StringBuffer();
+ strbuff.startString();
int bracketCount = 1;
c = getChar();
@@ -3029,21 +3042,21 @@ public class Scanner implements IScanner {
if(bracketCount == 0 || c == NOCHAR)
break;
- buffer.append((char) c);
+ strbuff.append(c);
c = getChar( true );
}
// Position of the closing ')'
int endMacroOffset = lastContext.getOffset() - 1;
- String betweenTheBrackets = buffer.toString().trim();
+ String betweenTheBrackets = strbuff.toString().trim();
Vector parameterValues = getMacroParameters(betweenTheBrackets, false);
Vector parameterValuesForStringizing = null;
SimpleToken t = null;
// create a string that represents what needs to be tokenized
- buffer = new StringBuffer();
+
List tokens = expansion.getTokenizedExpansion();
List parameterNames = expansion.getParameters();
@@ -3054,6 +3067,8 @@ public class Scanner implements IScanner {
return;
}
+ strbuff.startString();
+
int numberOfTokens = tokens.size();
for (int i = 0; i < numberOfTokens; ++i) {
@@ -3066,23 +3081,28 @@ public class Scanner implements IScanner {
if (index == -1 ) {
// not found
// just add image to buffer
- buffer.append(t.getImage() );
+ strbuff.append(t.getImage() );
} else {
- buffer.append(
+ strbuff.append(
(String) parameterValues.elementAt(index) );
}
} else if (t.getType() == tPOUND) {
//next token should be a parameter which needs to be turned into
//a string literal
if( parameterValuesForStringizing == null)
+ {
+ String cache = strbuff.toString();
parameterValuesForStringizing = getMacroParameters(betweenTheBrackets, true);
+ strbuff.startString();
+ strbuff.append(cache);
+ }
t = (SimpleToken) tokens.get( ++i );
int index = parameterNames.indexOf(t.getImage());
if( index == -1 ){
handleProblem( IProblem.PREPROCESSOR_MACRO_USAGE_ERROR, expansion.getName(), getCurrentOffset(), false, true );
return;
}
- buffer.append('\"');
+ strbuff.append('\"');
String value = (String)parameterValuesForStringizing.elementAt(index);
char val [] = value.toCharArray();
char ch;
@@ -3094,39 +3114,39 @@ public class Scanner implements IScanner {
while( ch == ' ' || ch == '\t' || ch == '\r' || ch == '\n' ){
ch = val[++j];
}
- buffer.append(' ');
+ strbuff.append(' ');
}
//a \ character is inserted before each " and \
if( ch == '\"' || ch == '\\' ){
- buffer.append('\\');
- buffer.append(ch);
+ strbuff.append('\\');
+ strbuff.append(ch);
} else {
- buffer.append(ch);
+ strbuff.append(ch);
}
}
- buffer.append('\"');
+ strbuff.append('\"');
} else {
switch( t.getType() )
{
case IToken.tSTRING:
- buffer.append('\"');
- buffer.append(t.getImage());
- buffer.append('\"');
+ strbuff.append('\"');
+ strbuff.append(t.getImage());
+ strbuff.append('\"');
break;
case IToken.tLSTRING:
- buffer.append("L\""); //$NON-NLS-1$
- buffer.append(t.getImage());
- buffer.append('\"');
+ strbuff.append("L\""); //$NON-NLS-1$
+ strbuff.append(t.getImage());
+ strbuff.append('\"');
break;
case IToken.tCHAR:
- buffer.append('\'');
- buffer.append(t.getImage());
- buffer.append('\'');
+ strbuff.append('\'');
+ strbuff.append(t.getImage());
+ strbuff.append('\'');
break;
default:
- buffer.append(t.getImage());
+ strbuff.append(t.getImage());
break;
}
}
@@ -3144,9 +3164,9 @@ public class Scanner implements IScanner {
if( t.getType() != tPOUNDPOUND && ! pastingNext )
if (i < (numberOfTokens-1)) // Do not append to the last one
- buffer.append( " " ); //$NON-NLS-1$
+ strbuff.append( ' ' );
}
- String finalString = buffer.toString();
+ String finalString = strbuff.toString();
try
{
scannerData.getContextStack().updateMacroContext(
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/ScannerStringBuffer.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/ScannerStringBuffer.java
new file mode 100644
index 00000000000..c3dedcaa26d
--- /dev/null
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/ScannerStringBuffer.java
@@ -0,0 +1,51 @@
+package org.eclipse.cdt.internal.core.parser.scanner;
+
+import org.eclipse.cdt.core.parser.IToken;
+
+/**
+ * @author ddaoust
+ *
+ */
+public class ScannerStringBuffer {
+ private int current_size;
+ private char [] s_buff;
+ private int s_pos;
+
+ public ScannerStringBuffer(int initialSize) {
+ current_size = initialSize;
+ s_buff = new char[current_size];
+ int s_pos = 0;
+ }
+ public final void startString(){
+ s_pos = 0;
+ }
+ public final void append(int c) {
+ try {
+ s_buff[s_pos++]= (char)c;
+ }
+ catch (ArrayIndexOutOfBoundsException a)
+ {
+ int new_size = current_size*2;
+ char [] new_sbuf = new char[new_size];
+ for (int i = 0; i < current_size; i++)
+ new_sbuf[i] = s_buff[i];
+ new_sbuf[current_size] = (char)c;
+ current_size = new_size;
+ s_buff = new_sbuf;
+ }
+ }
+ public final void append(String s) {
+ int len = s.length();
+ for(int i=0; i < len; i++)
+ append(s.charAt(i));
+ }
+ public final void append(IToken t) {
+ append(t.getImage());
+ }
+ public final int length() {
+ return s_pos;
+ }
+ public final String toString() {
+ return String.valueOf(s_buff, 0, s_pos);
+ }
+}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/ScannerUtility.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/ScannerUtility.java
index 7ec11af2640..87968ea05d7 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/ScannerUtility.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/ScannerUtility.java
@@ -30,10 +30,7 @@ import org.eclipse.cdt.core.parser.extension.IScannerExtension;
*/
public class ScannerUtility {
- /**
- * @param string
- * @return
- */
+ static ScannerStringBuffer strbuff = new ScannerStringBuffer(100);
static String reconcilePath(String originalPath ) {
if( originalPath == null ) return null;
originalPath = removeQuotes( originalPath );
@@ -53,15 +50,15 @@ public class ScannerUtility {
else
results.add( segment );
}
- StringBuffer buffer = new StringBuffer();
+ strbuff.startString();
Iterator i = results.iterator();
while( i.hasNext() )
{
- buffer.append( (String)i.next() );
+ strbuff.append( (String)i.next() );
if( i.hasNext() )
- buffer.append( File.separatorChar );
+ strbuff.append( File.separatorChar );
}
- return buffer.toString();
+ return strbuff.toString();
}
@@ -72,11 +69,11 @@ public class ScannerUtility {
private static String removeQuotes(String originalPath) {
String [] segments = originalPath.split( "\""); //$NON-NLS-1$
if( segments.length == 1 ) return originalPath;
- StringBuffer result = new StringBuffer();
+ strbuff.startString();
for( int i = 0; i < segments.length; ++ i )
if( segments[i] != null )
- result.append( segments[i]);
- return result.toString();
+ strbuff.append( segments[i]);
+ return strbuff.toString();
}
@@ -152,7 +149,7 @@ public class ScannerUtility {
try
{
boolean useIncludePath = true;
- StringBuffer fileNameBuffer = new StringBuffer();
+ strbuff.startString();
int startOffset = baseOffset, endOffset = baseOffset;
if (! includeLine.equals("")) { //$NON-NLS-1$
@@ -174,7 +171,7 @@ public class ScannerUtility {
try {
if (t.getType() == IToken.tSTRING) {
- fileNameBuffer.append(t.getImage());
+ strbuff.append(t.getImage());
startOffset = baseOffset + t.getOffset();
endOffset = baseOffset + t.getEndOffset();
useIncludePath = false;
@@ -190,10 +187,13 @@ public class ScannerUtility {
startOffset = baseOffset + t.getOffset();
while (t.getType() != IToken.tGT) {
- fileNameBuffer.append(t.getImage());
+ strbuff.append(t.getImage());
helperScanner.skipOverWhitespace();
int c = helperScanner.getChar();
- if (c == '\\') fileNameBuffer.append('\\'); else helperScanner.ungetChar(c);
+ if (c == '\\')
+ strbuff.append('\\');
+ else
+ helperScanner.ungetChar(c);
t = helperScanner.nextToken(false);
}
@@ -218,7 +218,7 @@ public class ScannerUtility {
} else
throw INCLUSION_PARSE_EXCEPTION ;
- return new InclusionDirective( fileNameBuffer.toString(), useIncludePath, startOffset, endOffset );
+ return new InclusionDirective( strbuff.toString(), useIncludePath, startOffset, endOffset );
}
catch( ScannerException se )
{

Back to the top