/******************************************************************************* * 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(); } }