package org.ibex.util;
+import gnu.regexp.*;
import java.util.*;
import java.io.*;
*/
public class Preprocessor {
+ public static String replaceAll(String source, String regexp, String replaceWith) {
+ try {
+ RE re = new RE(regexp, 0, RESyntax.RE_SYNTAX_PERL5);
+ return (String)re.substituteAll(source, replaceWith);
+ } catch (Exception e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
+
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
private PrintWriter out;
private Hashtable replace = new Hashtable();
- private Hashtable repeatreplace = null;
+ private Hashtable[] repeatreplaces = null;
private Vector sinceLastRepeat = null;
private Vector err = new Vector();
out.print("\n"); // preserve line numbers
}
StringTokenizer st = new StringTokenizer(trimmed, " ");
- repeatreplace = (Hashtable)replace.clone();
+ repeatreplaces = null;
while (st.hasMoreTokens()) {
String tok = st.nextToken().trim();
String key = tok.substring(0, tok.indexOf('/'));
- String val = tok.substring(tok.indexOf('/') + 1);
- repeatreplace.put(key, val);
+ String vals = tok.substring(tok.indexOf('/') + 1);
+ StringTokenizer st2 = new StringTokenizer(vals,"/");
+ if(repeatreplaces == null) {
+ repeatreplaces = new Hashtable[st2.countTokens()];
+ for(int i=0;i<repeatreplaces.length;i++) repeatreplaces[i] = (Hashtable) replace.clone();
+ }
+ for(int i=0;st2.hasMoreTokens() && i<repeatreplaces.length;i++)
+ repeatreplaces[i].put(key, st2.nextToken());
}
sinceLastRepeat = new Vector();
out.print("\n"); // preserve line numbers
} else if (trimmed.startsWith("//#end")) {
if (sinceLastRepeat == null) { err.add(new Warning("#end orphaned")); continue PROCESS; }
Hashtable save = replace;
- replace = repeatreplace;
out.print("\n");
- for(int i=0; i<sinceLastRepeat.size() - 1; i++) out.print(processLine((String)sinceLastRepeat.elementAt(i), true));
+ for(int i=0;i<repeatreplaces.length;i++) {
+ replace = repeatreplaces[i];
+ for(int j=0; j<sinceLastRepeat.size() - 1; j++) out.print(processLine((String)sinceLastRepeat.elementAt(j), true));
+ }
sinceLastRepeat = null;
replace = save;
- } else if (trimmed.startsWith("//#switch")) {
+ } else if (trimmed.startsWith("//#switch") || trimmed.startsWith("//#jswitch")) {
+ boolean jswitch = trimmed.startsWith("//#jswitch");
int expStart = trimmed.indexOf('(') +1;
if (expStart < 1) { err.add(new Error("expected ( in #switch")); continue PROCESS; }
int expEnd = trimmed.lastIndexOf(')');
if (expEnd - expStart <= 1) { err.add(new Error("badly formed #switch statement")); continue PROCESS; }
String expr = trimmed.substring(expStart, expEnd);
- out.print("final String ccSwitch"+enumSwitch+" = (String)("+expr+"); ");
+ if(jswitch) {
+ out.print("final org.ibex.js.JS ccSwitchExpr"+enumSwitch+" = " + expr + ";");
+ out.print("if(org.ibex.js.JS.isString(ccSwitchExpr"+enumSwitch+")) {");
+ out.print("final String ccSwitch"+enumSwitch+" = org.ibex.js.JS.toString(ccSwitchExpr"+enumSwitch+");");
+ } else {
+ out.print("final String ccSwitch"+enumSwitch+" = "+expr+"; ");
+ }
out.print("SUCCESS:do { switch(ccSwitch"+enumSwitch+".length()) {\n");
Hashtable[] byLength = new Hashtable[255];
if (key != null) {
Hashtable hash = byLength[key.length()];
- hash.put(key, (String)hash.get(key) + processLine(trimmed, false).replaceAll("//[^\"]*$", "").trim() + "\n");
+ hash.put(key, (String)hash.get(key) + replaceAll(processLine(trimmed, false), "//[^\"]*$", "").trim() + "\n");
} else {
out.print(processLine(trimmed, false));
}
buildTrie("", byLength[i]);
out.print("}; break; } ");
}
- out.print("} /* switch */ ");
+ out.print("} "); /* switch */
if (Default != null) out.print(" " + Default);
- out.print(" } while(false); /* OUTER */\n");
+ out.print(" } while(false);\n"); /* OUTER */
+ if(jswitch) out.print("}");
enumSwitch++;
} else {
ret += tok;
i = j - 1;
} else if (val instanceof JSFunctionMacro) {
- if (s.charAt(j) != '(') { err.add(new Error("open paren must follow macro binding for macro " + tok)); continue; }
+ if (s.charAt(j) != '(') { ret += tok; i = j - 1; continue; }
ret += ((JSFunctionMacro)val).process(s.substring(j+1, s.indexOf(')', j)));
i = s.indexOf(')', j);
} else {
String bound2 = null;
if (unbound2 == null) {
bound1 = args;
- return expression.replaceAll(unbound1, bound1);
+ return replaceAll(expression, unbound1, bound1);
} else {
bound1 = args.substring(0, args.indexOf(','));
bound2 = args.substring(args.indexOf(',') + 1);
- return (expression.replaceAll(unbound1, bound1).replaceAll(unbound2, bound2));
+ return replaceAll(replaceAll(expression, unbound1, bound1), unbound2, bound2);
}
}
}