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 }