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 }