blob: 14c73df0b74001b71627628375bf8240bb601295 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2001, 2005 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jem.internal.proxy.initParser;
/*
*/
public class StringLiteral extends Expression {
protected boolean isComplete;
public String value;
public StringBuffer valueBuffer = new StringBuffer();
protected boolean isEscaped = false;
/**
* constructor
*/
public StringLiteral(){
}
/**
* evaluate method comment.
*/
public Object evaluate() {
return valueBuffer.toString();
}
public boolean isComplete(){
return isComplete;
}
/**
* We must evaluate ourself and return the type of the result
*/
public Class getTypeClass() {
return String.class;
}
protected String getTypeClassName() {
return String.class.getName();
}
/**
*This string might be broken into a few tokens
*so we need a StringBuffer.
*
*/
public Expression push(char[] token , char delimiter){
int appendTokenStart = 0;
int appendTokenLength = token.length;
if (isEscaped) {
isEscaped = false;
if (token.length != 0) {
char c = token[0];
switch (c) {
case 'b':
valueBuffer.append('\b');
appendTokenStart = 1;
appendTokenLength--;
break;
case 't':
valueBuffer.append('\t');
appendTokenStart = 1;
appendTokenLength--;
break;
case 'n':
valueBuffer.append('\n');
appendTokenStart = 1;
appendTokenLength--;
break;
case 'r':
valueBuffer.append('\r');
appendTokenStart = 1;
appendTokenLength--;
break;
case 'u':
// Unicode, next four gather for text;
if (appendTokenLength>=5) {
valueBuffer.append((char) Integer.parseInt(new String(token, 1, 4), 16));
appendTokenStart=5;
appendTokenLength-=5;
}
break;
}
// If we didn't append anything, then not a true escape, so put the escape on.
if (appendTokenStart==0)
valueBuffer.append(DelimiterEscape);
} else {
if (delimiter == DelimiterQuote || delimiter == DelimiterEscape || delimiter == DelimiterSingleQuote)
valueBuffer.append(delimiter); // It was a true escape.
else {
valueBuffer.append(DelimiterEscape); // If wasn't a true escape
valueBuffer.append(delimiter);
}
return this;
}
}
if (appendTokenLength > 0)
valueBuffer.append(token, appendTokenStart, appendTokenLength);
if (delimiter == DelimiterQuote){
isComplete =true;
return this;
}
// If the delimiter is an escape character remember it so we can escape
// the next token, otherwise treat it as a literal
if (delimiter == DelimiterEscape ){
isEscaped = true;
} else {
valueBuffer.append(delimiter);
}
return this;
}
/**
* Strings are not primitives.
*/
public boolean isPrimitive() {
return false;
}
public String toString(){
StringBuffer buffer = new StringBuffer();
buffer.append("String(\""); //$NON-NLS-1$
if ( valueBuffer != null ) {
buffer.append(valueBuffer.toString());
}
buffer.append("\""); //$NON-NLS-1$
return buffer.toString();
}
}