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    }