/** * * This file is a part of ZOOLA - an extensible BeanShell implementation. * Zoola is based on original BeanShell code created by Pat Niemeyer. * * Original BeanShell code is Copyright (C) 2000 Pat Niemeyer <pat@pat.net>. * * New portions are Copyright 2012 Rafal Lewczuk <rafal.lewczuk@jitlogic.com> * * This is free software. You can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License as published by the Free Software * Foundation, either version 3 of the License, or (at your option) any later * version. * * This software is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. * * You should have received a copy of the GNU Lesser General Public License * along with ZOOLA. If not, see <http://www.gnu.org/licenses/>. * */ package bsh.ast; import bsh.*; public final class BSHLiteral extends SimpleNode { public static volatile boolean internStrings = true; public Object value; public BSHLiteral(int id) { super(id); } private char getEscapeChar(char ch) { switch(ch) { case 'b': ch = '\b'; break; case 't': ch = '\t'; break; case 'n': ch = '\n'; break; case 'f': ch = '\f'; break; case 'r': ch = '\r'; break; // do nothing - ch already contains correct character case '"': case '\'': case '\\': break; } return ch; } public void charSetup(String str) { char ch = str.charAt(0); if(ch == '\\') { // get next character ch = str.charAt(1); if(Character.isDigit(ch)) ch = (char)Integer.parseInt(str.substring(1), 8); else ch = getEscapeChar(ch); } value = new Primitive(new Character(ch).charValue()); } public void stringSetup(String str) { StringBuilder buffer = new StringBuilder(); int len = str.length(); for(int i = 0; i < len; i++) { char ch = str.charAt(i); if(ch == '\\') { // get next character ch = str.charAt(++i); if(Character.isDigit(ch)) { int endPos = i; // check the next two characters int max = Math.min( i + 2, len - 1 ); while(endPos < max) { if(Character.isDigit(str.charAt(endPos + 1))) endPos++; else break; } ch = (char)Integer.parseInt(str.substring(i, endPos + 1), 8); i = endPos; } else ch = getEscapeChar(ch); } buffer.append(ch); } String s = buffer.toString(); if( internStrings ) s = s.intern(); value = s; } public <T> T accept(BshNodeVisitor<T> visitor) { return visitor.visit(this); } }