001 /* Generated By:JJTree: Do not edit this line. ASTstring.java */
002
003 package net.sourceforge.javajson.parser;
004
005 import java.util.HashMap;
006 import java.util.Map;
007
008 public class ASTstring extends SimpleNode {
009 private static Map<Character, String> escapeMap = new HashMap<Character, String>();
010 static {
011 escapeMap.put('\\', "\\");
012 escapeMap.put('b', "\b");
013 escapeMap.put('f', "\f");
014 escapeMap.put('n', "\n");
015 escapeMap.put('r', "\r");
016 escapeMap.put('t', "\t");
017 escapeMap.put('/', "/");
018 escapeMap.put('\"', "\"");
019 escapeMap.put('\'', "\'");
020 }
021
022 String val;
023
024 public ASTstring(int id) {
025 super(id);
026 }
027
028 public ASTstring(JsonParser p, int id) {
029 super(p, id);
030 }
031
032 @Override
033 protected void interpret() {
034 ((SimpleNode) parent).push(ASTstring.fixString(val));
035 }
036
037 /** Removes escapes from string and returns normal string */
038 protected static String fixString(String s) {
039 s = s.substring(1, s.length() - 1);
040 StringBuffer ret = new StringBuffer();
041 boolean escape = false;
042 for (int i = 0; i < s.length(); i++) {
043 char c = s.charAt(i);
044 if (!escape) {
045 if (c == '\\')
046 escape = true;
047 else
048 ret.append(c);
049 } else {
050 if (escapeMap.containsKey(c))
051 ret.append(escapeMap.get(c));
052 else if (c == 'u' && s.length() >= i + 4) {
053 // handle unicode numbers... read 4 more chars (number)
054 String ucode = s.substring(i + 1, i + 5);
055 int ucoden = Integer.parseInt(ucode, 16);
056 char uc = (char) ucoden;
057 i += 4;
058 ret.append(uc);
059 } else {
060 // put escape back in, error, but parser missed it(?)
061 ret.append("\\");
062 ret.append(c);
063 }
064 escape = false;
065 }
066 }
067 return ret.toString();
068 }
069
070 protected static String fixString_(String s) {
071 String ret = s.substring(1, s.length() - 1);
072 // String t = ret;
073 ret = ret.replace("\\\"", "\"");
074 ret = ret.replace("\\'", "'");
075
076 ret = ret.replace("\\b", "\b");
077 ret = ret.replace("\\f", "\f");
078 ret = ret.replace("\\n", "\n");
079 ret = ret.replace("\\r", "\r");
080 ret = ret.replace("\\t", "\t");
081 ret = ret.replace("\\/", "/");
082 ret = ret.replace("\\\\", "\\");
083
084 // System.out.println(s + " " + ret);
085 return ret;
086 }
087 }