001    /**
002     * Implements the Cold Fusion Function jsstringformat
003     */
004    package railo.runtime.functions.string;
005    
006    import railo.runtime.PageContext;
007    import railo.runtime.ext.function.Function;
008    
009    public final class JSStringFormat implements Function {
010            public static String call(PageContext pc , String str) {
011                    return invoke(str);
012            }
013            public static String invoke(String str) {
014                int len=str.length();
015                    StringBuffer rtn=new StringBuffer(len+10);
016                    //char[] arr=str.toCharArray();
017                    //StringBuffer rtn=new StringBuffer(arr.length);
018                    char c;
019                    for(int i=0;i<len;i++) {
020                        c=str.charAt(i);
021                            switch(c) {
022                                    case '\\': rtn.append("\\\\"); break;
023                                    case '\n': rtn.append("\\n"); break;
024                                    case '\r': rtn.append("\\r"); break;
025                                    case '\f': rtn.append("\\f"); break;
026                                    case '\b': rtn.append("\\b"); break;
027                                    case '\t': rtn.append("\\t"); break;
028                                    case '"' : rtn.append("\\\""); break;
029                                    case '\'': rtn.append("\\\'"); break;
030                                    default : rtn.append(c); break;
031                            }
032                    }
033                    return rtn.toString();
034            }
035            
036            
037            public static String callx(PageContext pc , String jsString) {// MUST ????
038                    int len=jsString.length();
039                    StringBuffer sb=new StringBuffer(len);
040                    int plus=0;
041                    
042                    for(int pos=0;pos<len;pos++) {
043                char chr = jsString.charAt(pos);
044                
045                switch(chr){
046                                    case '\\': 
047                                    case '\n': 
048                                    case '\r': 
049                                    case '\f': 
050                                    case '\b': 
051                                    case '\t': 
052                                    case '"' : 
053                                    case '\'': plus++; break;
054                }
055                    }
056            if(plus==0) return jsString;
057            
058            char[] chars=new char[len+plus];
059            int count=0;
060            
061                    for(int pos=0;pos<len;pos++) {
062                char chr = jsString.charAt(pos);
063                switch(chr){
064                            case '\\': 
065                                chars[count++]='\\';
066                                chars[count++]='\\';
067                            break;
068                            case '\'': 
069                                chars[count++]='\\';
070                                chars[count++]='\'';
071                            break;
072                            case '"': 
073                                chars[count++]='\\';
074                                chars[count++]='"';
075                            break;
076                    case '\n': 
077                        chars[count++]='\\';
078                        chars[count++]='n';
079                    break;
080                    case '\r': 
081                        chars[count++]='\\';
082                        chars[count++]='r';
083                    break;
084                    case '\f': 
085                        chars[count++]='\\';
086                        chars[count++]='f';
087                    break;
088                    case '\b': 
089                        chars[count++]='\\';
090                        chars[count++]='b';
091                    break;
092                    case '\t': 
093                        chars[count++]='\\';
094                        chars[count++]='t';
095                    break;
096                    default: 
097                        chars[count++]=chr;
098                    break;
099                }
100                    }
101            
102            
103                    //if(start<len)sb.append(xmlString.substring(start,len));
104                    return new String(chars);
105            }
106            
107            
108            
109            
110            
111            
112            /*public static void main(String[] args) {
113            long start;
114            int count=1000000;
115            
116    
117            print.ln(call(null,"sasffdf\nfsd\n'ss'"));
118            print.ln(callx(null,"sasffdf\nfsd\n'ss'"));
119    
120            start=System.currentTimeMillis();
121            for(int i=0;i<count;i++) call(null,"sasffdf\nfsd\n'ss'");
122            print.ln(System.currentTimeMillis()-start);
123            
124            start=System.currentTimeMillis();
125            for(int i=0;i<count;i++) call(null,"sasffdf");
126            print.ln(System.currentTimeMillis()-start);
127            
128            start=System.currentTimeMillis();
129            for(int i=0;i<count;i++) callx(null,"sasffdf\nfsd\n'ss'");
130            print.ln(System.currentTimeMillis()-start);
131            
132            start=System.currentTimeMillis();
133            for(int i=0;i<count;i++) callx(null,"sasffdf");
134            print.ln(System.currentTimeMillis()-start);
135        }*/
136            
137            
138            
139            
140            
141            
142            
143            
144            
145            
146            
147    }