package railo.runtime.interpreter;
import railo.commons.lang.NumberUtil;
import railo.runtime.exp.PageException;
import railo.runtime.interpreter.ref.Ref;
import railo.runtime.interpreter.ref.literal.LStringBuffer;
public class JSONExpressionInterpreter extends CFMLExpressionInterpreter {
public JSONExpressionInterpreter(){
this(false);
allowNullConstant=true;
}
public JSONExpressionInterpreter(boolean strict){// strict is set to true, it should not be compatible with CFMLExpressionInterpreter
allowNullConstant=true;
}
@Override
protected Ref string() throws PageException {
// Init Parameter
char quoter = cfml.getCurrentLower();
//String str="";
LStringBuffer str=new LStringBuffer();
while(cfml.hasNext()) {
cfml.next();
// check sharp
if(cfml.isCurrent('\\')) {
if(cfml.isNext(quoter)){
cfml.next();
str.append(quoter);
}
else if(cfml.isNext('\\')){
cfml.next();
str.append('\\');
}
else if(cfml.isNext('"')){
cfml.next();
str.append('"');
}
else if(cfml.isNext('\'')){
cfml.next();
str.append('\'');
}
else if(cfml.isNext('t')){
cfml.next();
str.append('\t');
}
else if(cfml.isNext('n')){
cfml.next();
str.append('\n');
}
else if(cfml.isNext('b')){
cfml.next();
str.append('\b');
}
else if(cfml.isNext('f')){
cfml.next();
str.append('\f');
}
else if(cfml.isNext('r')){
cfml.next();
str.append('\r');
}
else if(cfml.isNext('u')){
cfml.next();
StringBuffer sb=new StringBuffer();
int i=0;
for(;i<4 && cfml.hasNext();i++){
cfml.next();
sb.append(cfml.getCurrent());
}
if(i<4){
str.append("\\u");
str.append(sb.toString());
}
else{
int asc = NumberUtil.hexToInt(sb.toString(),-1);
if(asc!=-1)str.append((char)asc);
else {
str.append("\\u");
str.append(sb.toString());
}
}
}
else if(cfml.isNext('/')){
cfml.next();
str.append('/');
}
else {
str.append('\\');
}
}
else if(cfml.isCurrent(quoter)) {
break;
}
// all other character
else {
str.append(cfml.getCurrent());
}
}
if(!cfml.forwardIfCurrent(quoter))
throw new InterpreterException("Invalid String Literal Syntax Closing ["+quoter+"] not found");
cfml.removeSpace();
mode=STATIC;
/*Ref value=null;
if(value!=null) {
if(str.isEmpty()) return value;
return new Concat(pc,value,str);
}*/
return str;
}
}