// Decompiled by DJ v3.12.12.96 Copyright 2011 Atanas Neshkov Date: 30/11/2011 9:07:52 PM // Home Page: http://members.fortunecity.com/neshkov/dj.html http://www.neshkov.com/dj.html - Check often for new version! // Decompiler options: packimports(3) package com.iambookmaster.client.iurq; import java.io.UnsupportedEncodingException; import java.util.List; import java.util.Vector; import com.iambookmaster.client.iurq.logic.Btn; import com.iambookmaster.client.iurq.logic.CLS; import com.iambookmaster.client.iurq.logic.Comment; import com.iambookmaster.client.iurq.logic.End; import com.iambookmaster.client.iurq.logic.Goto; import com.iambookmaster.client.iurq.logic.GotoEnd; import com.iambookmaster.client.iurq.logic.If; import com.iambookmaster.client.iurq.logic.Input; import com.iambookmaster.client.iurq.logic.Instr; import com.iambookmaster.client.iurq.logic.InvAdd; import com.iambookmaster.client.iurq.logic.InvKill; import com.iambookmaster.client.iurq.logic.InvSub; import com.iambookmaster.client.iurq.logic.Location; import com.iambookmaster.client.iurq.logic.Pause; import com.iambookmaster.client.iurq.logic.PerKill; import com.iambookmaster.client.iurq.logic.Play; import com.iambookmaster.client.iurq.logic.Print; import com.iambookmaster.client.iurq.logic.Proc; import com.iambookmaster.client.iurq.logic.Quit; import com.iambookmaster.client.iurq.logic.Save; import com.iambookmaster.client.iurq.logic.URQAnykey; import com.iambookmaster.client.iurq.logic.URQImage; import com.iambookmaster.client.iurq.logic.Unknown; import com.iambookmaster.client.iurq.logic.VarAction; // Referenced classes of package tge.core: // Core, BugTrack, Property public class URQParser { // private static final String[] PATTERN = new String[0]; public static final int STAGE_TOKENIZING = 0; public static final int STAGE_PARSING = 1; private static String charset = "\u0430\u0431\u0432\u0433\u0434\u0435\u0451\u0436\u0437\u0438\u0439\u043A\u043B\u043C\u043D\u043E\u043F\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044A\u044B\u044C\u044D\u044E\u044F" + "\u0410\u0411\u0412\u0413\u0414\u0415\u0401\u0416\u0417\u0418\u0419\u041A\u041B\u041C\u041D\u041E\u041F\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042A\u042B\u042C\u042D\u042E\u042F" + "\u2116\246\247\251\254\266\u2122" + "\260\u0404\u045E\240\u0454\u0457"; private static String encoding[] = { "cp1251", "cp866" }; private List lines; private String[] questLines; private int lineCounter; private Core core; // public void loadFile(Core core, String s) // { // try // { // FileInputStream fileinputstream = new FileInputStream(s); // FileChannel filechannel = fileinputstream.getChannel(); // MappedByteBuffer mappedbytebuffer = filechannel.map(java.nio.channels.FileChannel.MapMode.READ_ONLY, 0L, filechannel.size()); // byte abyte0[] = new byte[(int)filechannel.size()]; // for(int i = 0; i < abyte0.length; i++) // abyte0[i] = mappedbytebuffer.get(); // // filechannel.close(); // fileinputstream.close(); // startParse(core.loadFileAsBytes(s), core); // } // catch(FileNotFoundException filenotfoundexception) // { // filenotfoundexception.printStackTrace(); // } // catch(IOException ioexception) // { // ioexception.printStackTrace(); // } // } // public void parseFile(Core core, String s) // { // try // { // boolean flag = false; // if(s.endsWith(".qs1")) // flag = true; // if(s.endsWith(".qs2")) // flag = true; // FileInputStream fileinputstream = new FileInputStream(s); // FileChannel filechannel = fileinputstream.getChannel(); // MappedByteBuffer mappedbytebuffer = filechannel.map(java.nio.channels.FileChannel.MapMode.READ_ONLY, 0L, filechannel.size()); // byte abyte0[] = new byte[(int)filechannel.size()]; // for(int i = 0; i < abyte0.length; i++) // { // abyte0[i] = mappedbytebuffer.get(); // if(flag) // { // int j = abyte0[i] & 0xff; // if(j >= 32) // abyte0[i] = (byte)(287 - j); // } // } // // filechannel.close(); // fileinputstream.close(); // core.clear(); // startParse(core.loadFileAsBytes(s), core); // } // catch(FileNotFoundException filenotfoundexception) // { // filenotfoundexception.printStackTrace(); // } // catch(IOException ioexception) // { // ioexception.printStackTrace(); // } // } public boolean startParse(String questText, Core core) { this.core = core; return lineTokenizer(questText); } private void lineLoad(String s, Core core) { if (isSpaceChar(s.charAt(0))) { int i = 1; while (i<s.length() && isSpaceChar(s.charAt(i))) { i++; } s = s.substring(i); } String s1 = s.toLowerCase(); if(s.startsWith(";")) core.add(new Comment(core, s)); else if(s.startsWith("/*")) core.add(new Comment(core, s)); else if(s.startsWith(":")) core.add(new Location(core, s.trim())); else if(s1.startsWith("println ") || s1.startsWith("pln ")) core.add(new Print(core, s + "\n")); else if(s1.equals("println") || s1.equals("pln")) core.add(new Print(core, "\n")); else if(s1.startsWith("print ") || s1.startsWith("p ")) core.add(new Print(core, s)); else if(s1.startsWith("include ")) { //TODO // loadFile(core, Property.lastDir + "/" + s.substring(8)); } else if(s1.startsWith("proc ")) core.add(new Proc(core, s)); else if(s1.startsWith("goto ")) core.add(new Goto(core, s)); else if(s1.startsWith("quit")) core.add(new Quit()); else if(s1.startsWith("end")) core.add(new End(core)); else if(s1.startsWith("cls")) core.add(new CLS(core)); else if(s1.startsWith("play ")) core.add(new Play(core, s.substring(5).trim(),false)); else if(s1.startsWith("music stop")) core.add(new Play(core, null,true)); else if(s1.startsWith("image ")) core.add(new URQImage(core, s.substring(6).trim())); else if(s1.startsWith("music ")) core.add(new Play(core, s.substring(6).trim(), true)); else if(s1.startsWith("pause")) core.add(new Pause(core, s)); else if(s1.startsWith("save ") || s1.equals("save")) core.add(new Save(core, s)); else if(s1.startsWith("perkill")) core.add(new PerKill(core)); else if(s1.startsWith("invkill")) core.add(new InvKill(core, s1)); else if(s1.startsWith("inv+")) core.add(new InvAdd(core, s1)); else if(s1.startsWith("inv-")) core.add(new InvSub(core, s1)); else if(s1.startsWith("btn ")) core.add(new Btn(core, s)); else if(s1.startsWith("instr ")) core.add(new Instr(core, s)); else if(s1.startsWith("inv_visible false")) core.add(new Instr(core, "instr inv_visible=0")); else if(s1.startsWith("inv_visible true")) core.add(new Instr(core, "instr inv_visible=1")); else if(s1.startsWith("input ")) core.add(new Input(core, s)); else if(s1.equals("anykey")) core.add(new URQAnykey(core)); else if(s1.startsWith("if ")) ifLoad(s, s1, core); else if(s1.indexOf("=") > 0) core.add(new VarAction(core, s)); else core.add(new Unknown(core, s)); } private boolean isSpaceChar(char c) { switch(c) { case ' ': case '\t': return true; } return false; } private void ifLoad(String s, String s1, Core core) { int thenPosition = findToken(s1,"then",0); if(thenPosition > 0) { If if1 = new If(core); core.add(if1); int elsePosition = findToken(s1,"else",thenPosition); if1.setExp(s1.substring(3, thenPosition).trim()); if1.setGoIf(core.getStack().size()); Vector lns = new Vector(); String afterThen = s.substring(thenPosition + 5); if(elsePosition < 0) { //only if parseLine(afterThen, lns); for (int k = 0; k < lns.size(); k++) { lineLoad((String)lns.get(k), core); } if1.setGoElse(core.getStack().size()); } else { //if ... else ... int subIfPosition = findToken(s1,"if",thenPosition); int subThenPosition = subIfPosition >0 ? findToken(s1,"then",subIfPosition) : -1; if (subThenPosition<0) { //no inner if parseLine(s.substring(thenPosition + 5, elsePosition), lns); for (int k = 0; k < lns.size(); k++) { lineLoad((String)lns.get(k), core); } lns.clear(); if1.setGoElse(core.getStack().size()); parseLine(s.substring(elsePosition + 5), lns); for (int k = 0; k < lns.size(); k++) { lineLoad((String)lns.get(k), core); } } else if (elsePosition<subIfPosition) { //else before second if parseLine(s.substring(thenPosition + 5, elsePosition), lns); for (int k = 0; k < lns.size(); k++) { lineLoad((String)lns.get(k), core); } lns.clear(); if1.setGoElse(core.getStack().size()); parseLine(s.substring(elsePosition + 5,subIfPosition), lns); for (int k = 0; k < lns.size(); k++) { lineLoad((String)lns.get(k), core); } //load inline if String subIf = s.substring(subIfPosition); ifLoad(subIf,subIf.toLowerCase(),core); } else { //inner if int i = subIfPosition; int j = elsePosition; while (i>0 && j>0 && i<j) { i = findToken(s1,"if",i+1); j = findToken(s1,"else",j+1); } parseLine(s.substring(thenPosition + 5, subIfPosition), lns); for (int k = 0; k < lns.size(); k++) { lineLoad((String)lns.get(k), core); } lns.clear(); if (j>0) { //use the last else as our String subIf = s.substring(subIfPosition,j); ifLoad(subIf,subIf.toLowerCase(),core); //add go-to our end before our else GotoEnd gotoEnd = new GotoEnd(); core.add(gotoEnd); //process ELSE if1.setGoElse(core.getStack().size()); subIf = s.substring(j+5); parseLine(subIf, lns); for (int k = 0; k < lns.size(); k++) { lineLoad((String)lns.get(k), core); } //set position of the go_end gotoEnd.setEndIf(core.getStack().size()); } else { //no our else String subIf = s.substring(subIfPosition); ifLoad(subIf,subIf.toLowerCase(),core); if1.setGoElse(core.getStack().size()); } } } if1.setGoEnd(core.getStack().size()); } } private int findToken(String s1, String pattern,int from) { int i=s1.indexOf(pattern,from); int good = i; while (i>0) { if (Character.isLetterOrDigit(s1.charAt(i-1)) || Character.isLetterOrDigit(s1.charAt(i+pattern.length()))) { //go next i = s1.indexOf(pattern,i+1); } else { good = i; //first occurrence break; } } return good; } private boolean lineTokenizer(String questText) { if ((int)questText.charAt(0)==65279) { //BOM character in UTF questText=questText.substring(1); } if (questText.indexOf("\r\n")<0) { questLines = questText.split("\n"); } else { questLines = questText.split("\r\n"); } questText = null;//release memory lines = new Vector(questLines.length); //start processing lines lineCounter = 0; return countinueLineTokinizing(); } protected boolean countinueLineTokinizing() { if (questLines==null) { //stage 2 for(lineCounter = 0; lineCounter < lines.size(); lineCounter++) { if (canContinue(lineCounter,lines.size(),STAGE_PARSING)==false) { return false; } lineLoad((String)lines.get(lineCounter), core); } done(); return true; } else { //stage 1 for(; lineCounter < questLines.length; lineCounter++) { if (canContinue(lineCounter,questLines.length,STAGE_TOKENIZING)==false) { return false; } String s1 = questLines[lineCounter]; int i; if((i = s1.indexOf("/*")) >= 0) { int k = -1; StringBuffer stringbuffer = (new StringBuffer()).append(s1); while(lineCounter < questLines.length && (k = s1.indexOf("*/", i)) < i) { lineCounter++; stringbuffer.append("\n").append(questLines[lineCounter].trim()); s1 = stringbuffer.toString(); } if(k > i) { parseLine(s1.substring(0, i),lines); parseLine(s1.substring(i, k + 2),lines); parseLine(s1.substring(k + 2),lines); } else { parseLine(s1.substring(0, i),lines); parseLine(s1.substring(i),lines); } } else { parseLine(s1,lines); } } questLines = null; lineCounter = 0; return countinueLineTokinizing(); } } protected void done() { } /** * For showing progress of processing * @param counter * @param max * @param stage * @return */ protected boolean canContinue(int counter, int max, int stage) { return true; } private static void parseLine(String s,List lines) { int i; if((i = s.indexOf(";")) >= 0) { parseLine(s.substring(0, i).trim(),lines); lines.add(s.substring(i).trim()); } else if((i = s.indexOf("/* ")) == 0) lines.add(s.substring(i).trim()); else if((i = s.indexOf("if ")) >= 0) { parseLine(s.substring(0, i).trim(),lines); lines.add(s.substring(i).trim()); } else if((i = s.indexOf("&")) > 0) { lines.add(s.substring(0, i).trim()); parseLine(s.substring(i + 1).trim(),lines); } else if(s.length() != 0) lines.add(s); } private static String getDecoded(byte abyte0[]) { label0: for(int i = 0; i < encoding.length; i++) try { String s = new String(abyte0, encoding[i]); s = s.replace('\u2013', '-').replace('\u2014', '-').replace('\u2019', '\'').replace('\273', '"').replace('\u201C', '"').replace('\u201D', '"').replace('\253', '"').replaceAll("\u2026", "..."); for(int j = 0; j < s.length(); j++) { char c = s.charAt(j); if(c < '\200' || charset.indexOf(c) >= 0) continue; System.out.println(c + "->>" + (int)c + " _-_ " + j); continue label0; } return s; } catch(UnsupportedEncodingException unsupportedencodingexception) { return unsupportedencodingexception.getMessage(); } return "null"; } }