home *** CD-ROM | disk | FTP | other *** search
- package com.netscape.javascript;
-
- public class NativeRegExp extends RescopeableObject implements Function {
- public static final int GLOB = 1;
- public static final int FOLD = 2;
- private static final boolean debug = false;
- private static final int CCLASS_CHARSET_SIZE = 256;
- private static final int PR_BITS_PER_BYTE = 8;
- private static final byte REOP_EMPTY = 0;
- private static final byte REOP_ALT = 1;
- private static final byte REOP_BOL = 2;
- private static final byte REOP_EOL = 3;
- private static final byte REOP_WBDRY = 4;
- private static final byte REOP_WNONBDRY = 5;
- private static final byte REOP_QUANT = 6;
- private static final byte REOP_STAR = 7;
- private static final byte REOP_PLUS = 8;
- private static final byte REOP_OPT = 9;
- private static final byte REOP_LPAREN = 10;
- private static final byte REOP_RPAREN = 11;
- private static final byte REOP_DOT = 12;
- private static final byte REOP_CCLASS = 13;
- private static final byte REOP_DIGIT = 14;
- private static final byte REOP_NONDIGIT = 15;
- private static final byte REOP_ALNUM = 16;
- private static final byte REOP_NONALNUM = 17;
- private static final byte REOP_SPACE = 18;
- private static final byte REOP_NONSPACE = 19;
- private static final byte REOP_BACKREF = 20;
- private static final byte REOP_FLAT = 21;
- private static final byte REOP_FLAT1 = 22;
- private static final byte REOP_JUMP = 23;
- private static final byte REOP_DOTSTAR = 24;
- private static final byte REOP_ANCHOR = 25;
- private static final byte REOP_EOLONLY = 26;
- private static final byte REOP_UCFLAT = 27;
- private static final byte REOP_UCFLAT1 = 28;
- private static final byte REOP_UCCLASS = 29;
- private static final byte REOP_NUCCLASS = 30;
- private static final byte REOP_BACKREFi = 31;
- private static final byte REOP_FLATi = 32;
- private static final byte REOP_FLAT1i = 33;
- private static final byte REOP_UCFLATi = 34;
- private static final byte REOP_UCFLAT1i = 35;
- private static final byte REOP_ANCHOR1 = 36;
- private static final byte REOP_END = 37;
- private static final byte[] reopsize = new byte[]{1, 3, 1, 1, 1, 1, 7, 1, 1, 1, 3, 3, 1, 33, 1, 1, 1, 1, 1, 1, 2, 2, 2, 3, 1, 1, 1, 2, 3, 3, 3, 2, 2, 2, 2, 3, 1, 0};
- private static final int REOP_FLATLEN_MAX = 255;
- private static int level;
- private static final String[] reopname = new String[]{"empty", "alt", "bol", "eol", "wbdry", "wnonbdry", "quant", "star", "plus", "opt", "lparen", "rparen", "dot", "cclass", "digit", "nondigit", "alnum", "nonalnum", "space", "nonspace", "backref", "flat", "flat1", "jump", "dotstar", "anchor", "eolonly", "ucflat", "ucflat1", "ucclass", "nucclass", "backrefi", "flati", "flat1i", "ucflati", "ucflat1i", "anchor1", "end"};
- static final String metachars = "|^${*+?().[\\";
- static final String closurechars = "{*+?";
- private String source;
- private int lastIndex;
- private int parenCount;
- private byte flags;
- private byte[] program;
- // $FF: synthetic field
- private static Class class$com$netscape$javascript$NativeRegExp;
-
- public boolean getIgnoreCase() {
- return (this.flags & 2) != 0;
- }
-
- public static Object test(Context var0, Scriptable var1, Object[] var2, Function var3) {
- Object var4 = execSub(var0, var1, var2, var3, true, var3);
- if (var4 == null || !var4.equals(Boolean.TRUE)) {
- var4 = Boolean.FALSE;
- }
-
- return var4;
- }
-
- public static Object exec(Context var0, Scriptable var1, Object[] var2, Function var3) {
- return execSub(var0, var1, var2, var3, false, var3);
- }
-
- RENode parseQuantAtom(CompilerState var1) {
- RENode var2 = this.parseAtom(var1);
- if (var2 == null) {
- return null;
- } else {
- char[] var8 = var1.source;
- int var9 = var1.index;
-
- label93:
- while(true) {
- if (var9 < var8.length) {
- switch (var8[var9]) {
- case '*':
- if ((var2.flags & 4) == 0) {
- this.reportError("msg.re.empty", "*");
- return null;
- }
-
- ++var9;
- var2 = new RENode(var1, (byte)7, var2);
- continue;
- case '+':
- if ((var2.flags & 4) == 0) {
- this.reportError("msg.re.empty", "+");
- return null;
- }
-
- ++var9;
- RENode var12 = new RENode(var1, (byte)8, var2);
- if ((var2.flags & 4) != 0) {
- var12.flags = (byte)(var12.flags | 4);
- }
-
- var2 = var12;
- continue;
- case '?':
- ++var9;
- var2 = new RENode(var1, (byte)9, var2);
- continue;
- case '{':
- ++var9;
- char var4;
- if (var9 != var8.length && isDigit(var4 = var8[var9])) {
- int var6 = unDigit(var4);
-
- do {
- ++var9;
- if (var9 >= var8.length || !isDigit(var4 = var8[var9])) {
- int var7;
- if (var8[var9] == ',') {
- ++var9;
- int var3 = var9;
- if (isDigit(var8[var9])) {
- var7 = unDigit(var8[var9]);
-
- while(true) {
- ++var9;
- if (!isDigit(var4 = var8[var9])) {
- if (var7 == 0) {
- this.reportError("msg.zero.quant", this.tail(var8, var1.index));
- return null;
- }
-
- if (var6 > var7) {
- this.reportError("msg.max.lt.min", this.tail(var8, var3));
- return null;
- }
- break;
- }
-
- var7 = 10 * var7 + unDigit(var4);
- if (var7 >> 16 != 0) {
- this.reportError("msg.overlarge.max", String.valueOf(var8[var3]));
- return null;
- }
- }
- } else {
- var7 = 0;
- }
- } else {
- if (var6 == 0) {
- this.reportError("msg.zero.quant", this.tail(var8, var1.index));
- return null;
- }
-
- var7 = var6;
- }
-
- if (var8[var9] != '}') {
- this.reportError("msg.unterm.quant", String.valueOf(var8[var1.index]));
- return null;
- }
-
- ++var9;
- RENode var5 = new RENode(var1, (byte)6, var2);
- if (var6 > 0 && (var2.flags & 4) != 0) {
- var5.flags = (byte)(var5.flags | 4);
- }
-
- var5.min = (short)var6;
- var5.max = (short)var7;
- var2 = var5;
- continue label93;
- }
-
- var6 = 10 * var6 + unDigit(var4);
- } while(var6 >> 16 == 0);
-
- this.reportError("msg.overlarge.max", this.tail(var8, var9));
- return null;
- }
-
- this.reportError("msg.bad.quant", String.valueOf(var8[var1.index]));
- return null;
- }
- }
-
- var1.index = var9;
- return var2;
- }
- }
- }
-
- void matchBit(char var1, int var2, int var3) {
- int var4 = var1 >> 3;
- byte var5 = (byte)(var1 & 7);
- var5 = (byte)(1 << var5);
- if (var2 != 0) {
- byte[] var7 = this.program;
- var7[var3 + var4] = (byte)(var7[var3 + var4] & ~var5);
- } else {
- byte[] var10000 = this.program;
- var10000[var3 + var4] |= var5;
- }
- }
-
- public static boolean isDigit(char var0) {
- return '0' <= var0 && var0 <= '9';
- }
-
- private boolean anchorRegExp(CompilerState var1, RENode var2) {
- int var5 = 0;
- char[] var6 = null;
- byte var7 = 0;
- boolean var8 = false;
- boolean var9 = false;
- int var10 = 0;
-
- RENode var3;
- for(var3 = var2; var3.op == 10; var3 = (RENode)var3.kid) {
- }
-
- switch (var3.op) {
- case 1:
- var5 = this.countFirstChars(var3);
- if (var5 <= 0) {
- var9 = true;
- } else {
- var6 = new char[var5];
- var5 = this.storeFirstChars(var1, var3, var6, 0);
- if (var5 == 1) {
- var7 = 22;
- } else if (var5 == 2 && var6[0] == '\\') {
- switch (var6[1]) {
- case '-':
- case '\\':
- ++var10;
- var7 = 22;
- break;
- case 'D':
- var7 = 15;
- break;
- case 'S':
- var7 = 19;
- break;
- case 'W':
- var7 = 17;
- break;
- case 'd':
- var7 = 14;
- break;
- case 's':
- var7 = 18;
- break;
- case 'w':
- var7 = 16;
- break;
- default:
- var7 = 13;
- }
- } else {
- var7 = 13;
- }
-
- if (var6.length != var5) {
- char[] var11 = new char[var5 - var10];
- System.arraycopy(var6, var10, var11, 0, var5 - var10);
- var6 = var11;
- }
-
- var8 = true;
- }
- break;
- case 21:
- var10 = (Integer)var3.kid;
- var6 = new char[]{(var3.s != null ? var3.s : var1.source)[var10]};
- var7 = 22;
- var8 = true;
- break;
- case 22:
- var6 = new char[]{var3.chr};
- var7 = 22;
- var8 = true;
- case 24:
- break;
- default:
- var9 = true;
- }
-
- if (var8) {
- RENode var4 = new RENode(var1, var7, new Integer(0));
- var4.s = var6;
- var4.flags = 6;
- if (var7 == 22) {
- var4.chr = var6[0];
- } else if (var7 == 13) {
- var4.kid2 = var5;
- }
-
- var3 = new RENode(var1, var2.op, var2.kid);
- var3.flags = (byte)(var2.flags | 8);
- var3.next = var2.next;
- var3.kid2 = var2.kid2;
- var3.num = var2.num;
- var3.chr = var2.chr;
- var3.min = var2.min;
- var3.max = var2.max;
- var2.op = 36;
- var2.flags = 16;
- var2.next = var3;
- var2.kid = var4;
- var2.kid2 = 0;
- }
-
- if (var9) {
- if (var3.op == 25 || (var3.flags & 8) != 0) {
- throw new RuntimeException();
- }
-
- if ((var3.flags & 5) == 4) {
- var3 = new RENode(var1, var2.op, var2.kid);
- var3.flags = (byte)(var2.flags | 8);
- var3.next = var2.next;
- var3.kid2 = var2.kid2;
- var3.num = var2.num;
- var3.chr = var2.chr;
- var3.min = var2.min;
- var3.max = var2.max;
- var2.op = 25;
- var2.flags = 16;
- var2.next = var3;
- var2.kid = null;
- var2.kid2 = 0;
- }
- }
-
- return true;
- }
-
- private void optimizeRegExp(CompilerState var1, RENode var2) {
- RENode var6 = null;
- int var23 = 0;
- char[] var10 = var1.source;
- boolean var11 = false;
- StringBuffer var12 = null;
-
- do {
- switch (var2.op) {
- case 7:
- RENode var20 = (RENode)var2.kid;
- if ((var20.flags & 2) == 0) {
- var2.op = 1;
- var6 = var2.next;
- RENode var22 = new RENode(var1, (byte)23, (Object)null);
- this.fixNext(var1, var20, var22, var6);
- var22.next = var2;
- if ((var2.flags & 8) != 0) {
- var2.flags = (byte)(var2.flags | 32);
- }
-
- this.closeTail(var1, var2, var6);
- }
- break;
- case 8:
- RENode var19 = (RENode)var2.kid;
- if ((var19.flags & 2) == 0) {
- var6 = var2.next;
- int var7 = var2.flags & 16;
- var2.copy(var19);
- RENode var21 = new RENode(var1, (byte)23, (Object)null);
- RENode var5 = new RENode(var1, (byte)1, var21);
- this.fixNext(var1, var2, var5, var6);
- var5.flags = (byte)(var5.flags | var7);
- var21.next = var2;
- if ((var2.flags & 8) != 0) {
- var2.flags = (byte)(var2.flags | 32);
- }
-
- this.closeTail(var1, var5, var6);
- }
- break;
- case 9:
- RENode var3 = (RENode)var2.kid;
- if ((var3.flags & 2) == 0) {
- var2.op = 1;
- var6 = var2.next;
- RENode var4 = new RENode(var1, (byte)23, (Object)null);
- this.fixNext(var1, var3, var4, var6);
- var4.next = var6;
- this.closeTail(var1, var2, var6);
- var6.flags = (byte)(var6.flags | 32);
- }
- break;
- case 22:
- var6 = var2.next;
- if (var6 == null || (var6.flags & 32) != 0 || var6.op != 21 && var6.op != 22) {
- var11 = false;
- break;
- } else {
- var12 = new StringBuffer();
- var12.append(var2.chr);
- if (var6.op == 21) {
- int var13 = (Integer)var6.kid;
- var23 = var6.kid2 - var13;
- var12.append(var10, var13, var23);
- } else {
- var12.append(var6.chr);
- var23 = 1;
- }
-
- ++var23;
- var2.op = 21;
- var2.flags = (byte)(var2.flags | 64);
- var11 = true;
- }
- case 21:
- while(var11 || (var6 = var2.next) != null && (var6.flags & 32) == 0 && (var6.op == 21 || var6.op == 22)) {
- if (!var11) {
- var12 = new StringBuffer();
- int var24 = (Integer)var2.kid;
- var23 = var2.kid2 - var24;
- var12.append(var2.s != null ? var2.s : var10, var24, var23);
- int var8;
- if (var6.op == 21) {
- int var14 = (Integer)var6.kid;
- var8 = var6.kid2 - var14;
- var12.append(var10, var14, var8);
- } else {
- var8 = 1;
- var12.append(var6.chr);
- }
-
- if (var23 + var8 > 255) {
- break;
- }
-
- var23 += var8;
- }
-
- var11 = false;
- var2.kid = new Integer(0);
- if ((var2.flags & 16) == 0) {
- throw new RuntimeException();
- }
-
- if ((var6.flags & 16) == 0) {
- var2.flags &= -17;
- }
-
- var2.kid2 = var23;
- var2.next = var6.next;
- var2.s = var12.toString().toCharArray();
- var6.op = 0;
- }
- }
-
- var2.offset = (short)var1.progLength;
- var1.progLength += reopsize[var2.op];
- switch (var2.op) {
- case 1:
- case 6:
- case 7:
- case 8:
- case 9:
- case 10:
- case 36:
- this.optimizeRegExp(var1, (RENode)var2.kid);
- break;
- case 13:
- int var27 = (Integer)var2.kid;
- int var29 = var2.kid2;
- var23 = var29 - var27;
- char var30 = 0;
- char[] var16 = var2.s != null ? var2.s : var1.source;
-
- while(var27 < var29) {
- char var17 = var16[var27++];
- if (var17 == '\\') {
- if (var27 + 5 > var29 || var16[var27] != 'u' || !isHex(var16[var27 + 1]) || !isHex(var16[var27 + 2]) || !isHex(var16[var27 + 3]) || !isHex(var16[var27 + 4])) {
- continue;
- }
-
- int var18 = (((unHex(var16[var27]) << 4) + unHex(var16[var27 + 1]) << 4) + unHex(var16[var27 + 2]) << 4) + unHex(var16[var27 + 3]);
- var17 = (char)var18;
- var27 += 5;
- }
-
- if ((var1.flags & 2) != 0) {
- char var32;
- if ((var32 = Character.toUpperCase(var17)) > var30) {
- var30 = var32;
- }
-
- if ((var32 = Character.toLowerCase(var32)) > var30) {
- var30 = var32;
- }
- }
-
- if (var17 > var30) {
- var30 = var17;
- }
- }
-
- if (var30 >= 256) {
- var2.op = 29;
- int var31 = (var30 + 8) / 8;
- var2.kidlen = (short)var23;
- var2.bmsize = (short)var31;
- var1.progLength -= reopsize[13];
- var1.progLength += reopsize[29] + var31;
- }
- break;
- case 21:
- int var26 = (Integer)var2.kid;
- int var28 = var2.kid2;
- var23 = var28 - var26;
-
- while(var26 < var28) {
- char var15 = var10[var26++];
- if (var15 >>> 8 != 0) {
- var2.op = 27;
- var23 *= 2;
- break;
- }
- }
-
- var1.progLength += var23;
- break;
- case 22:
- char var25 = var2.chr;
- if (var25 >>> 8 != 0) {
- var2.op = 28;
- ++var1.progLength;
- }
- break;
- case 23:
- while((var6 = var2.next) != null && var6.op == 23) {
- var2.next = var6.next;
- }
- break;
- case 37:
- return;
- }
- } while((var2.flags & 16) != 0 && (var2 = var2.next) != null);
-
- }
-
- private void setNext(CompilerState var1, RENode var2, RENode var3) {
- this.fixNext(var1, var2, var3, (RENode)null);
- }
-
- private int matchRegExp(MatchState var1, byte[] var2, int var3, char[] var4, int var5) {
- boolean var9 = false;
- int var10 = 0;
- Context var12 = Context.getContext();
- RegExpStatics var13 = var12.getRegExpStatics();
- int[] var14 = new int[1];
- int var15 = var1.pcend;
- int var16 = var1.cpbegin;
- int var17 = var1.cpend;
-
- while(var3 < var15) {
- int var19;
- byte var18 = var2[var3];
- var19 = reopsize[var18];
- label511:
- switch (var18) {
- case 0:
- var3 += var19;
- continue;
- case 1:
- short var90 = this.readShort(var2, var3);
- int var42 = var3 + var19;
- if (var3 + var90 < var2.length && var2[var3 + var90] == 1) {
- int var53 = this.matchRegExp(var1, var2, var42, var4, var5);
- if (var53 != -1) {
- return var53;
- }
-
- var3 += var90;
- continue;
- }
-
- var3 = var42;
- continue;
- case 2:
- var9 = var5 == var16;
- if (var13.multiline) {
- if (var1.anchoring) {
- if (!var9) {
- var9 = var4[var5 - 1] == '\n';
- }
- } else {
- var1.anchoring = true;
-
- for(int var52 = var5; var52 < var17; ++var52) {
- if (var52 == var16 || var4[var52 - 1] == '\n') {
- int var60 = this.matchRegExp(var1, var2, var3, var4, var52);
- if (var60 != -1) {
- var1.skipped = var52 - var5;
- var1.anchoring = false;
- return var60;
- }
- }
- }
-
- var1.anchoring = false;
- }
- }
-
- var10 = 0;
- break;
- case 3:
- case 26:
- var9 = var5 == var17;
- if (var18 != 3 && !var1.anchoring) {
- var1.anchoring = true;
-
- for(int var51 = var5; var51 <= var17; ++var51) {
- if (var51 == var17 || var4[var51] == '\n') {
- int var59 = this.matchRegExp(var1, var2, var3, var4, var51);
- if (var59 != -1) {
- var1.anchoring = false;
- var1.skipped = var51 - var5;
- return var59;
- }
- }
- }
-
- var1.anchoring = false;
- } else if (!var9 && var13.multiline) {
- var9 = var4[var5] == '\n';
- }
-
- var10 = 0;
- break;
- case 4:
- var9 = (var5 == var16 || !isWord(var4[var5 - 1])) ^ (var5 >= var4.length || !isWord(var4[var5]));
- var10 = 0;
- break;
- case 5:
- var9 = (var5 == var16 || !isWord(var4[var5 - 1])) ^ (var5 < var4.length && isWord(var4[var5]));
- var10 = 0;
- break;
- case 6:
- var19 = this.readShort(this.program, var3);
- int var39 = var3 + 2;
- short var89 = this.readShort(this.program, var39);
- var39 += 2;
- short var97 = this.readShort(this.program, var39);
- var39 += 3;
- var1.pcend = var3 + var19;
-
- int var69;
- for(var69 = 0; var69 < var89; ++var69) {
- var5 = this.matchRegExp(var1, this.program, var39, var4, var5);
- if (var5 == -1) {
- var1.pcend = var15;
- return -1;
- }
- }
-
- while(var97 == 0 || var69 < var97) {
- int var50 = this.matchRegExp(var1, this.program, var39, var4, var5);
- if (var50 == -1) {
- break;
- }
-
- var5 = var50;
- ++var69;
- }
-
- var1.pcend = var15;
- var9 = var89 <= var69 && (var97 == 0 || var69 <= var97);
- var10 = 0;
- break;
- case 7:
- ++var3;
- var18 = this.program[var3];
- var19 = reopsize[var18];
-
- int var49;
- for(var49 = var5; var5 < var17; ++var5) {
- var14[0] = var19;
- var9 = this.matchSingleCases(var18, var4, var5, var17, this.program, var3, var14);
- var19 = var14[0];
- var10 = 1;
- if (!var9) {
- break;
- }
- }
-
- var3 += var19;
-
- do {
- int var58 = this.matchRegExp(var1, this.program, var3, var4, var5);
- if (var58 != -1) {
- return var58;
- }
-
- --var5;
- } while(var5 >= var49);
-
- return -1;
- case 8:
- ++var3;
- var18 = this.program[var3];
- var19 = reopsize[var18];
-
- int var47;
- for(var47 = var5; var5 < var17; ++var5) {
- var14[0] = var19;
- var9 = this.matchSingleCases(var18, var4, var5, var17, this.program, var3, var14);
- var19 = var14[0];
- var10 = 1;
- if (!var9) {
- break;
- }
- }
-
- if (var5 == var47) {
- return -1;
- }
-
- ++var47;
- var3 += var19;
-
- do {
- int var57 = this.matchRegExp(var1, this.program, var3, var4, var5);
- if (var57 != -1) {
- return var57;
- }
-
- --var5;
- } while(var5 >= var47);
-
- return -1;
- case 9:
- ++var3;
- var18 = this.program[var3];
- var14[0] = reopsize[var18];
- var9 = this.matchSingleCases(var18, var4, var5, var17, this.program, var3, var14);
- var19 = var14[0];
- var10 = 1;
- var3 += var19;
- if (var9) {
- int var46 = this.matchRegExp(var1, this.program, var3, var4, var5 + 1);
- if (var46 != -1) {
- return var46;
- }
- }
- continue;
- case 10:
- short var68 = this.readShort(this.program, var3);
- SubString var87 = var1.maybeParens[var68];
- if (var87 == null) {
- var87 = var1.maybeParens[var68] = new SubString();
- }
-
- int var96 = var87.index;
- var87.charArray = var4;
- var87.index = var5;
- var3 += var19;
- int var56 = this.matchRegExp(var1, this.program, var3, var4, var5);
- if (var56 == -1) {
- var87.index = var96;
- return -1;
- }
-
- var87 = var1.parens[var68];
- if (var87 == null) {
- var87 = var1.parens[var68] = new SubString();
- }
-
- if (var87.index == 0) {
- var87.charArray = var4;
- int var45 = var16 + var1.start + var1.skipped;
- if (var5 < var45) {
- var87.index = var45;
- var87.length -= var45 - var5;
- } else {
- var87.index = var5;
- }
- }
-
- return var56;
- case 11:
- short var67 = this.readShort(this.program, var3);
- SubString var85 = var1.maybeParens[var67];
- if (var85 == null) {
- var85 = var1.maybeParens[var67] = new SubString();
- }
-
- int var95 = var5 - var85.index;
- var85.length = var95;
- var3 += var19;
- var5 = this.matchRegExp(var1, this.program, var3, var4, var5);
- if (var5 != -1) {
- var85 = var1.parens[var67];
- if (var85 == null) {
- var85 = var1.parens[var67] = new SubString();
- }
-
- if (var85.index == 0) {
- var85.length = var95;
- }
-
- if (var67 >= var1.parenCount) {
- var1.parenCount = var67 + 1;
- }
- }
-
- return var5;
- case 12:
- case 13:
- case 14:
- case 15:
- case 16:
- case 17:
- case 18:
- case 19:
- case 22:
- case 28:
- case 29:
- case 30:
- case 33:
- case 35:
- var14[0] = var19;
- var9 = this.matchSingleCases(var18, var4, var5, var17, this.program, var3, var14);
- var19 = var14[0];
- var10 = 1;
- break;
- case 20:
- byte var66 = this.program[var3 + 1];
- SubString var84 = var1.maybeParens[var66];
- if (var84 == null) {
- var84 = var1.maybeParens[var66] = new SubString();
- }
-
- var10 = var84.length;
- var9 = var17 - var5 >= var10;
- if (var9) {
- for(int var94 = 0; var94 < var10; ++var94) {
- if (var4[var5 + var94] != var84.charArray[var84.index + var94]) {
- var9 = false;
- break label511;
- }
- }
- }
- break;
- case 21:
- var10 = this.program[var3 + 1];
- var19 += var10;
- var9 = var5 + var10 <= var17;
- if (var9) {
- for(int var83 = 0; var83 < var10; ++var83) {
- if (var4[var5 + var83] != (char)(this.program[var3 + 2 + var83] & 255)) {
- var9 = false;
- break;
- }
- }
- }
- break;
- case 23:
- var19 = this.readShort(this.program, var3);
- var3 += var19;
- continue;
- case 24:
- int var44;
- for(var44 = var5; var44 < var17 && var4[var44] != '\n'; ++var44) {
- }
-
- for(int var38 = var3 + var19; var44 >= var5; --var44) {
- int var55 = this.matchRegExp(var1, this.program, var38, var4, var44);
- if (var55 != -1) {
- return var55;
- }
- }
-
- return -1;
- case 25:
- int var37 = var3 + var19;
- if (var37 != var15) {
- for(int var43 = var5; var43 < var17; ++var43) {
- int var54 = this.matchRegExp(var1, this.program, var37, var4, var43);
- if (var54 != -1) {
- var1.skipped = var43 - var5;
- return var54;
- }
- }
-
- return -1;
- }
- break;
- case 27:
- var10 = this.program[var3 + 1];
- var19 += 2 * var10;
- var9 = var5 + var10 <= var17;
- if (var9) {
- int var35 = var3 + 2;
-
- for(int var82 = 0; var82 < var10; ++var82) {
- char var93 = var4[var5 + var82];
- char var101 = (char)(this.program[var35++] << 8);
- var101 = (char)(var101 | this.program[var35++] & 255);
- var9 = var93 == var101;
- if (!var9) {
- break;
- }
- }
- }
- break;
- case 31:
- byte var11 = this.program[var3 + 1];
- SubString var81 = var1.maybeParens[var11];
- if (var81 == null) {
- var81 = var1.maybeParens[var11] = new SubString();
- }
-
- var10 = var81.length;
- var9 = var17 - var5 >= var10;
- if (var9) {
- for(int var92 = 0; var92 < var10; ++var92) {
- char var100 = var4[var5 + var92];
- char var23 = var81.charArray[var81.index + var92];
- var9 = var100 == var23 || this.matchCharsIgnoringCase(var100, var23);
- if (!var9) {
- break label511;
- }
- }
- }
- break;
- case 32:
- var10 = this.program[var3 + 1];
- var19 += var10;
- var9 = var5 + var10 <= var17;
- if (var9) {
- for(int var80 = 0; var80 < var10; ++var80) {
- char var91 = var4[var5 + var80];
- char var99 = (char)(this.program[var3 + 2 + var80] & 255);
- var9 = var91 == var99 || this.matchCharsIgnoringCase(var91, var99);
- if (!var9) {
- break;
- }
- }
- }
- break;
- case 34:
- var10 = this.program[var3 + 1];
- var19 += 2 * var10;
- var9 = var5 + var10 <= var17;
- if (var9) {
- int var33 = var3 + 2;
-
- for(int var20 = 0; var20 < var10; ++var20) {
- char var21 = var4[var5 + var20];
- char var22 = (char)(this.program[var33++] << 8);
- var22 = (char)(var22 | this.program[var33++] & 255);
- var9 = var21 == var22 || this.matchCharsIgnoringCase(var21, var22);
- if (!var9) {
- break;
- }
- }
- }
- break;
- case 36:
- ++var3;
- var18 = this.program[var3];
-
- for(int var7 = var5; var5 < var17; ++var5) {
- var19 = reopsize[var18];
- var14[0] = var19;
- var9 = this.matchSingleCases(var18, var4, var5, var17, this.program, var3, var14);
- if (var9) {
- var19 = var14[0];
- int var6 = var3 + var19;
- if (var6 >= var15) {
- throw new RuntimeException();
- }
-
- int var8 = this.matchRegExp(var1, this.program, var6, var4, var5);
- if (var8 != -1) {
- var1.skipped = var5 - var7;
- return var8;
- }
- }
- }
-
- return -1;
- default:
- throw new RuntimeException("Unexpected op");
- }
-
- if (!var9) {
- return -1;
- }
-
- var3 += var19;
- if (var10 != 0) {
- var5 += var10;
- if (var5 > var17) {
- var5 = var17;
- }
- }
- }
-
- return var5;
- }
-
- Object executeRegExp(Scriptable var1, String var2, int[] var3, boolean var4) {
- Context var6 = Context.getContext();
- RegExpStatics var7 = var6.getRegExpStatics();
- MatchState var8 = new MatchState();
- var8.anchoring = false;
- var8.pcend = this.program.length;
- char[] var9 = var2.toCharArray();
- int var10 = var3[0];
- if (var10 > var9.length) {
- var10 = var9.length;
- }
-
- var8.cpbegin = 0;
- var8.cpend = var9.length;
- var8.start = var10;
- var8.skipped = 0;
- var8.parenCount = 0;
- var8.maybeParens = new SubString[this.parenCount];
- var8.parens = new SubString[this.parenCount];
- int var11 = this.matchRegExp(var8, this.program, 0, var9, var10);
- if (var11 == -1) {
- return null;
- } else {
- int var12 = var11 - var8.cpbegin;
- var3[0] = var12;
- int var13 = var12 - (var10 + var8.skipped);
- var11 -= var13;
- Object var15;
- Scriptable var16;
- if (var4) {
- var15 = Boolean.TRUE;
- var16 = null;
- } else {
- Scriptable var17 = ScriptableObject.getTopLevelScope(var1);
- var15 = ScriptRuntime.newObject(var6, var17, "Array", (Object[])null);
- var16 = (Scriptable)var15;
- String var18 = new String(var9, var11, var13);
- var16.put(0, var16, var18);
- }
-
- if (var8.parenCount > this.parenCount) {
- throw new RuntimeException();
- } else {
- if (var8.parenCount == 0) {
- var7.parens.setSize(0);
- var7.lastParen = SubString.emptySubString;
- } else {
- SubString var21 = null;
- var7.parens.setSize(var8.parenCount);
-
- for(int var22 = 0; var22 < var8.parenCount; ++var22) {
- var21 = var8.parens[var22];
- var7.parens.setElementAt(var21, var22);
- if (!var4) {
- String var19 = var21 == null ? "" : var21.toString();
- var16.put(var22 + 1, var16, var19);
- }
- }
-
- var7.lastParen = var21;
- }
-
- if (!var4) {
- var16.put("index", var16, new Integer(var10 + var8.skipped));
- var16.put("input", var16, var2);
- }
-
- if (var7.lastMatch == null) {
- var7.lastMatch = new SubString();
- var7.leftContext = new SubString();
- var7.rightContext = new SubString();
- }
-
- var7.lastMatch.charArray = var9;
- var7.lastMatch.index = var11;
- var7.lastMatch.length = var13;
- var7.leftContext.charArray = var9;
- if (var6.getLanguageVersion() == 120) {
- var7.leftContext.index = var10;
- var7.leftContext.length = var8.skipped;
- } else {
- var7.leftContext.index = 0;
- var7.leftContext.length = var10 + var8.skipped;
- }
-
- var7.rightContext.charArray = var9;
- var7.rightContext.index = var11;
- var7.rightContext.length = var8.cpend - var11;
- return var15;
- }
- }
- }
-
- private boolean matchCharsIgnoringCase(char var1, char var2) {
- var1 = Character.toUpperCase(var1);
- var2 = Character.toUpperCase(var2);
- return var1 == var2 || Character.toLowerCase(var1) == Character.toLowerCase(var2);
- }
-
- private void write(int var1, char var2) {
- this.program[var1 + 1] = (byte)(var2 >>> 8 & 255);
- this.program[var1 + 2] = (byte)(var2 & 255);
- }
-
- private static Object execSub(Context var0, Scriptable var1, Object[] var2, Scriptable var3, boolean var4, Function var5) {
- if (!(var1 instanceof NativeRegExp)) {
- Object[] var11 = new Object[]{((NativeFunction)var5).names[0]};
- throw Context.reportRuntimeError(Context.getMessage("msg.incompat.call", var11));
- } else {
- NativeRegExp var6 = (NativeRegExp)var1;
- String var7;
- if (var2.length == 0) {
- var7 = var0.getRegExpStatics().input;
- if (var7 == null) {
- Object[] var8 = new Object[]{var6.toString()};
- throw Context.reportRuntimeError(Context.getMessage("msg.no.re.input.for", var8));
- }
- } else {
- var7 = ScriptRuntime.toString(var2[0]);
- }
-
- int var12;
- if ((var6.flags & 1) != 0) {
- var12 = var6.lastIndex;
- } else {
- var12 = 0;
- }
-
- int[] var9 = new int[]{var12};
- Object var10 = var6.executeRegExp(var3, var7, var9, var4);
- if ((var6.flags & 1) != 0) {
- var6.lastIndex = var10 == null ? 0 : var9[0];
- }
-
- return var10;
- }
- }
-
- private void write(int var1, short var2) {
- this.program[var1 + 1] = (byte)(var2 >>> 8 & 255);
- this.program[var1 + 2] = (byte)(var2 & 255);
- }
-
- private void reportError(String var1, String var2) {
- Object[] var3 = new Object[]{var2};
- String var4 = Context.getMessage(var1, var3);
- Context.reportRuntimeError(var4);
- }
-
- private RENode parseAltern(CompilerState var1) {
- RENode var2 = this.parseItem(var1);
- if (var2 == null) {
- return null;
- } else {
- RENode var3 = var2;
- int var4 = 0;
- char[] var5 = var1.source;
-
- char var7;
- for(int var6 = var1.index; var6 != var5.length && (var7 = var5[var6]) != '|' && var7 != ')'; var6 = var1.index) {
- RENode var8 = this.parseItem(var1);
- if (var8 == null) {
- return null;
- }
-
- this.setNext(var1, var3, var8);
- var4 |= var8.flags;
- var3 = var8;
- }
-
- var2.flags = (byte)(var2.flags | var4 & 4);
- return var2;
- }
- }
-
- private int storeChar(char[] var1, int var2, char var3, boolean var4) {
- for(int var5 = 0; var5 < var2; ++var5) {
- if (var1[var5] == '\\') {
- ++var5;
- }
-
- if (var1[var5] == var3 && (!var4 || var5 > 0 && var1[var5 - 1] == '\\')) {
- return var2;
- }
- }
-
- if (var4 || var3 == '\\' || var3 == '-') {
- var1[var2++] = '\\';
- }
-
- var1[var2++] = var3;
- return var2;
- }
-
- private boolean matchSingleCases(int var1, char[] var2, int var3, int var4, byte[] var5, int var6, int[] var7) {
- if (var3 >= var2.length) {
- return false;
- } else {
- char var8 = var2[var3];
- switch (var1) {
- case 12:
- if (var3 != var4 && var8 != '\n') {
- return true;
- }
-
- return false;
- case 13:
- int var14 = var8 >> 3;
- int var15 = var8 & 7;
- var15 = 1 << var15;
- if ((var5[var6 + 1 + var14] & var15) == 0) {
- return false;
- }
-
- return true;
- case 14:
- return isDigit(var8);
- case 15:
- if (isDigit(var8)) {
- return false;
- }
-
- return true;
- case 16:
- return isWord(var8);
- case 17:
- if (isWord(var8)) {
- return false;
- }
-
- return true;
- case 18:
- return Character.isWhitespace(var8);
- case 19:
- if (Character.isWhitespace(var8)) {
- return false;
- }
-
- return true;
- case 22:
- if (var8 != (char)(var5[var6 + 1] & 255)) {
- return false;
- }
-
- return true;
- case 28:
- if (var8 != (char)(var5[var6 + 1] << 8 | var5[var6 + 2] & 255)) {
- return false;
- }
-
- return true;
- case 29:
- case 30:
- int var10 = var5[var6 + 1] << 8 | var5[var6 + 2] & 255;
- var7[0] += var10;
- int var11 = var8 >>> 3;
- if (var11 >= var10) {
- if (var1 != 30) {
- return false;
- }
-
- return true;
- } else {
- int var12 = var8 & 7;
- var12 = 1 << var12;
- if ((var5[var6 + 3 + var11] & var12) == 0) {
- return false;
- }
-
- return true;
- }
- case 33:
- char var13 = (char)(var5[var6 + 1] & 255);
- if (var8 != var13 && !this.matchCharsIgnoringCase(var8, var13)) {
- return false;
- }
-
- return true;
- case 35:
- char var9 = (char)(var5[var6 + 1] << 8 | var5[var6 + 2] & 255);
- if (var8 != var9 && !this.matchCharsIgnoringCase(var8, var9)) {
- return false;
- }
-
- return true;
- default:
- throw new RuntimeException("Unexpected op");
- }
- }
- }
-
- RENode parseAtom(CompilerState var1) {
- RENode var4 = null;
- boolean var7 = false;
- boolean var8 = false;
- char[] var9 = var1.source;
- int var28 = var1.index;
- int var11 = var28;
- if (var28 == var9.length) {
- var1.index = var28;
- return new RENode(var1, (byte)0, (Object)null);
- } else {
- label184:
- switch (var9[var28]) {
- case '(':
- int var17 = var1.parenCount++;
- var1.index = var28 + 1;
- RENode var5 = this.parseRegExp(var1);
- if (var5 == null) {
- return null;
- }
-
- var28 = var1.index;
- if (var28 >= var9.length || var9[var28] != ')') {
- this.reportError("msg.unterm.paren", this.tail(var9, var11));
- return null;
- }
-
- ++var28;
- var4 = new RENode(var1, (byte)10, var5);
- var4.flags = (byte)(var5.flags & 5);
- var4.num = var17;
- var5 = new RENode(var1, (byte)11, (Object)null);
- this.setNext(var1, var4, var5);
- var5.num = var17;
- break;
- case '.':
- ++var28;
- if (var28 < var9.length && var9[var28] == '*') {
- ++var28;
- var4 = new RENode(var1, (byte)24, (Object)null);
- } else {
- var4 = new RENode(var1, (byte)12, (Object)null);
- }
-
- if (var4.op == 12) {
- var4.flags = 6;
- }
- break;
- case '[':
- ++var28;
- if (var28 == var9.length) {
- this.reportError("msg.unterm.class", this.tail(var9, var11));
- return null;
- }
-
- char var22 = var9[var28];
- var4 = new RENode(var1, (byte)13, new Integer(var28));
- if (var22 == '^') {
- ++var28;
- if (var28 == var9.length) {
- this.reportError("msg.unterm.class", this.tail(var9, var11));
- return null;
- }
- }
-
- while(true) {
- ++var28;
- if (var28 == var9.length) {
- this.reportError("msg.unterm.paren", this.tail(var9, var11));
- return null;
- }
-
- var22 = var9[var28];
- if (var22 == ']') {
- var4.kid2 = var28++;
- var4.flags = 6;
- break label184;
- }
-
- if (var22 == '\\' && var28 + 1 != var9.length) {
- ++var28;
- }
- }
- case '\\':
- ++var28;
- if (var28 == var9.length) {
- Context.reportError(Context.getMessage("msg.trail.backslash", (Object[])null));
- return null;
- }
-
- char var6;
- var6 = var9[var28];
- label173:
- switch (var6) {
- case '0':
- var1.index = var28;
- int var16 = this.doOctal(var1);
- var28 = var1.index;
- var4 = new RENode(var1, (byte)22, (Object)null);
- var6 = (char)var16;
- break;
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- int var14 = unDigit(var6);
-
- while(true) {
- ++var28;
- if (var28 >= var9.length || !isDigit(var6 = var9[var28])) {
- if (var14 <= 9 && var14 <= var1.parenCount) {
- --var28;
- var4 = new RENode(var1, (byte)20, (Object)null);
- var4.num = var14 - 1;
- var4.flags = 4;
- var7 = true;
- } else {
- var1.index = var11;
- var14 = this.doOctal(var1);
- var28 = var1.index;
- var4 = new RENode(var1, (byte)22, (Object)null);
- var6 = (char)var14;
- }
- break label173;
- }
-
- var14 = 10 * var14 - unDigit(var6);
- }
- case 'D':
- var4 = new RENode(var1, (byte)15, (Object)null);
- break;
- case 'S':
- var4 = new RENode(var1, (byte)19, (Object)null);
- break;
- case 'W':
- var4 = new RENode(var1, (byte)17, (Object)null);
- break;
- case 'c':
- ++var28;
- var6 = var9[var28];
- if ('A' <= var6 && var6 <= 'Z' || 'a' <= var6 && var6 <= 'z') {
- var6 = Character.toUpperCase(var6);
- var6 = (char)(var6 ^ 64);
- var4 = new RENode(var1, (byte)22, (Object)null);
- break;
- }
-
- var28 -= 2;
- var11 = var28;
- var8 = true;
- var7 = true;
- break;
- case 'd':
- var4 = new RENode(var1, (byte)14, (Object)null);
- break;
- case 'f':
- case 'n':
- case 'r':
- case 't':
- case 'v':
- var6 = this.getEscape(var6);
- var4 = new RENode(var1, (byte)22, (Object)null);
- break;
- case 's':
- var4 = new RENode(var1, (byte)18, (Object)null);
- break;
- case 'u':
- if (var28 + 4 < var9.length && isHex(var9[var28 + 1]) && isHex(var9[var28 + 2]) && isHex(var9[var28 + 3]) && isHex(var9[var28 + 4])) {
- int var13 = (((unHex(var9[var28 + 1]) << 4) + unHex(var9[var28 + 2]) << 4) + unHex(var9[var28 + 3]) << 4) + unHex(var9[var28 + 4]);
- var6 = (char)var13;
- var28 += 4;
- var4 = new RENode(var1, (byte)22, (Object)null);
- break;
- }
-
- var11 = var28;
- var8 = true;
- var7 = true;
- break;
- case 'w':
- var4 = new RENode(var1, (byte)16, (Object)null);
- break;
- case 'x':
- var11 = var28++;
- int var2;
- if (var28 < var9.length && isHex(var6 = var9[var28])) {
- var2 = unHex(var6);
- ++var28;
- if (var28 < var9.length && isHex(var6 = var9[var28])) {
- var2 <<= 4;
- var2 += unHex(var6);
- } else {
- --var28;
- }
- } else {
- var28 = var11;
- var2 = 120;
- }
-
- var4 = new RENode(var1, (byte)22, (Object)null);
- var6 = (char)var2;
- break;
- default:
- var11 = var28;
- var8 = true;
- var7 = true;
- }
-
- if (var4 != null && !var7) {
- var4.chr = var6;
- var4.flags = 6;
- }
-
- var7 = false;
- if (!var8) {
- ++var28;
- break;
- } else {
- var8 = false;
- }
- default:
- while(true) {
- ++var28;
- if (var28 == var9.length || "|^${*+?().[\\".indexOf(var9[var28]) != -1) {
- int var3 = var28 - var11;
- if (var28 != var9.length && var3 > 1 && "{*+?".indexOf(var9[var28]) != -1) {
- --var28;
- --var3;
- }
-
- if (var3 > 255) {
- var3 = 255;
- var28 = var11 + var3;
- }
-
- var4 = new RENode(var1, (byte)(var3 == 1 ? 22 : 21), new Integer(var11));
- var4.flags = 4;
- if (var3 > 1) {
- var4.kid2 = var28;
- } else {
- var4.flags = (byte)(var4.flags | 2);
- var4.chr = var9[var11];
- }
- break;
- }
- }
- }
-
- var1.index = var28;
- return var4;
- }
- }
-
- RENode parseItem(CompilerState var1) {
- char[] var4 = var1.source;
- int var5 = var1.index;
- switch (var5 < var4.length ? var4[var5] : '\u0000') {
- case '$':
- var1.index = var5 + 1;
- return new RENode(var1, (byte)(var5 != var1.indexBegin && (var4[var5 - 1] != '(' && var4[var5 - 1] != '|' || var5 - 1 != var1.indexBegin && var4[var5 - 2] == '\\') ? 3 : 26), (Object)null);
- case '\\':
- ++var5;
- byte var3;
- switch (var5 < var4.length ? var4[var5] : '\u0000') {
- case 'B':
- var3 = 5;
- break;
- case 'b':
- var3 = 4;
- break;
- default:
- return this.parseQuantAtom(var1);
- }
-
- var1.index = var5 + 1;
- RENode var6 = new RENode(var1, var3, (Object)null);
- var6.flags = (byte)(var6.flags | 4);
- return var6;
- case '^':
- var1.index = var5 + 1;
- RENode var2 = new RENode(var1, (byte)2, (Object)null);
- var2.flags = (byte)(var2.flags | 1);
- return var2;
- default:
- return this.parseQuantAtom(var1);
- }
- }
-
- private int countFirstChars(RENode var1) {
- int var7 = 0;
-
- while(true) {
- RENode var3;
- for(var3 = (RENode)var1.kid; var3.op == 10; var3 = (RENode)var3.kid) {
- }
-
- switch (var3.op) {
- case 6:
- if (var3.min == 0) {
- return -1;
- }
- case 1:
- case 8:
- int var2 = this.countFirstChars(var3);
- if (var2 < 0) {
- return var2;
- }
-
- var7 += var2;
- break;
- case 13:
- int var5 = (Integer)var3.kid;
- if (this.source.charAt(var5) == '^') {
- return -1;
- }
-
- int var6 = var3.kid2;
- var7 += var6 - var5;
- break;
- case 14:
- case 15:
- case 16:
- case 17:
- case 18:
- case 19:
- var7 += 2;
- break;
- case 21:
- char var8 = this.source.charAt((Integer)var3.kid);
- if (var8 != '\\' && var8 != '-') {
- ++var7;
- } else {
- var7 += 2;
- }
- break;
- case 22:
- char var4 = var3.chr;
- if (var4 != '\\' && var4 != '-') {
- ++var7;
- } else {
- var7 += 2;
- }
- break;
- default:
- return -1;
- }
-
- if (var1.op == 1) {
- var1 = var1.next;
- if (var1 != null && var1.op == 1) {
- continue;
- }
- }
-
- return var7;
- }
- }
-
- public boolean getGlobal() {
- return (this.flags & 1) != 0;
- }
-
- static int unHex(char var0) {
- return '0' <= var0 && var0 <= '9' ? var0 - 48 : 10 + Character.toLowerCase(var0) - 97;
- }
-
- public String getSource() {
- return this.source;
- }
-
- private char getEscape(char var1) {
- switch (var1) {
- case 'b':
- return '\b';
- case 'f':
- return '\f';
- case 'n':
- return '\n';
- case 'r':
- return '\r';
- case 't':
- return '\t';
- case 'v':
- return '\u000b';
- default:
- throw new RuntimeException();
- }
- }
-
- public Scriptable construct(Context var1, Scriptable var2, Object[] var3) {
- return (Scriptable)this.call(var1, var2, (Scriptable)null, var3);
- }
-
- private int doOctal(CompilerState var1) {
- char[] var2 = var1.source;
- int var3 = var1.index;
- int var4 = 0;
-
- while(true) {
- ++var3;
- char var5;
- if (var3 >= var2.length || '0' > (var5 = var2[var3]) || var5 > '7') {
- break;
- }
-
- var4 = 8 * var4 + (var5 - 48);
- if (var4 > 255) {
- this.reportError("msg.overlarge.octal", this.tail(var2, var1.index));
- var4 = 0;
- break;
- }
- }
-
- --var3;
- var1.index = var3;
- return var4;
- }
-
- public String toString() {
- StringBuffer var1 = new StringBuffer();
- var1.append('/');
- var1.append(this.source);
- var1.append('/');
- if ((this.flags & 1) != 0) {
- var1.append('g');
- }
-
- if ((this.flags & 2) != 0) {
- var1.append('i');
- }
-
- return var1.toString();
- }
-
- public NativeRegExp(Scriptable var1, String var2, String var3) {
- this.init(var1, var2, var3);
- }
-
- public NativeRegExp() {
- }
-
- private void dumpRegExp(CompilerState var1, RENode var2) {
- }
-
- private RENode parseRegExp(CompilerState var1) {
- RENode var2 = this.parseAltern(var1);
- if (var2 == null) {
- return null;
- } else {
- char[] var3 = var1.source;
- int var4 = var1.index;
- if (var4 < var3.length && var3[var4] == '|') {
- RENode var5 = var2;
- var2 = new RENode(var1, (byte)1, var2);
- if (var2 == null) {
- return null;
- }
-
- var2.flags = (byte)(var5.flags & 5);
- RENode var6 = var2;
-
- do {
- ++var4;
- var1.index = var4;
- if (var4 >= var3.length || var3[var4] != '|' && var3[var4] != ')') {
- var5 = this.parseAltern(var1);
- var4 = var1.index;
- } else {
- var5 = new RENode(var1, (byte)0, (Object)null);
- }
-
- if (var5 == null) {
- return null;
- }
-
- RENode var7 = new RENode(var1, (byte)1, var5);
- if (var7 == null) {
- return null;
- }
-
- var6.next = var7;
- var6.flags = (byte)(var6.flags | 16);
- var7.flags = (byte)(var5.flags & 5 | 8);
- var6 = var7;
- } while(var4 < var3.length && var3[var4] == '|');
- }
-
- return var2;
- }
- }
-
- public static Scriptable compile(Context var0, Scriptable var1, Object[] var2, Function var3) {
- NativeRegExp var4 = (NativeRegExp)var1;
- String var5 = var2.length == 0 ? "" : ScriptRuntime.toString(var2[0]);
- String var6 = var2.length > 1 ? ScriptRuntime.toString(var2[1]) : null;
- var4.init(var3, var5, var6);
- return var4;
- }
-
- private short readShort(byte[] var1, int var2) {
- return (short)(var1[var2 + 1] << 8 | var1[var2 + 2] & 255);
- }
-
- static boolean isWord(char var0) {
- return Character.isLetter(var0) || isDigit(var0) || var0 == '_';
- }
-
- private void checkRange(char var1, int var2, int var3) {
- this.matchBit(var1, var2, var3);
- this.matchBit('-', var2, var3);
- }
-
- static int unDigit(char var0) {
- return var0 - 48;
- }
-
- private RENode closeTail(CompilerState var1, RENode var2, RENode var3) {
- RENode var4 = new RENode(var1, (byte)0, (Object)null);
- RENode var5 = new RENode(var1, (byte)1, var4);
- var2.next = var5;
- var5.next = var4.next = var3;
- if ((var2.flags & 16) != 0) {
- var5.flags = (byte)(var5.flags | 16);
- } else {
- var2.flags = (byte)(var2.flags | 16);
- }
-
- var5.flags = (byte)(var5.flags | 8);
- return var5;
- }
-
- private String tail(char[] var1, int var2) {
- return new String(var1, var2, var1.length - var2);
- }
-
- String getPrintableString(String var1) {
- return "";
- }
-
- public int getLastIndex() {
- return this.lastIndex;
- }
-
- public void setLastIndex(int var1) {
- this.lastIndex = var1;
- }
-
- private void fixNext(CompilerState var1, RENode var2, RENode var3, RENode var4) {
- boolean var5;
- RENode var6;
- for(var5 = var3 != null && (var3.flags & 8) == 0; (var6 = var2.next) != null && var6 != var4; var2 = var6) {
- if (var2.op == 1) {
- RENode var7 = (RENode)var2.kid;
- if (var7.op != 23) {
- RENode var8;
- for(var8 = var7; var8.next != null; var8 = var8.next) {
- if (var8.op == 1) {
- throw new RuntimeException("REOP_ALT not expected");
- }
- }
-
- var8.next = new RENode(var1, (byte)23, (Object)null);
- RENode var10000 = var8.next;
- var10000.flags = (byte)(var10000.flags | 8);
- var8.flags = (byte)(var8.flags | 16);
- this.fixNext(var1, var7, var3, var4);
- }
- }
- }
-
- if (var3 != null) {
- if ((var3.flags & 8) == 0) {
- var3.flags = (byte)(var3.flags | 8);
- } else {
- var3.flags = (byte)(var3.flags | 32);
- }
- }
-
- var2.next = var3;
- if (var5) {
- var2.flags = (byte)(var2.flags | 16);
- }
-
- switch (var2.op) {
- case 1:
- case 6:
- case 7:
- case 8:
- case 9:
- case 10:
- this.fixNext(var1, (RENode)var2.kid, var3, var4);
- return;
- case 2:
- case 3:
- case 4:
- case 5:
- default:
- }
- }
-
- static boolean isHex(char var0) {
- return '0' <= var0 && var0 <= '9' || 'a' <= var0 && var0 <= 'f' || 'A' <= var0 && var0 <= 'F';
- }
-
- public Object call(Context var1, Scriptable var2, Scriptable var3, Object[] var4) {
- return execSub(var1, this, var4, var2, false, this);
- }
-
- // $FF: synthetic method
- private static Class class$(String var0) {
- try {
- return Class.forName(var0);
- } catch (ClassNotFoundException var2) {
- throw new NoClassDefFoundError(((Throwable)var2).getMessage());
- }
- }
-
- private int storeFirstChars(CompilerState var1, RENode var2, char[] var3, int var4) {
- while(true) {
- RENode var5;
- for(var5 = (RENode)var2.kid; var5.op == 10; var5 = (RENode)var5.kid) {
- }
-
- switch (var5.op) {
- case 6:
- if (var5.min == 0) {
- throw new RuntimeException();
- }
- case 1:
- case 8:
- var4 = this.storeFirstChars(var1, var5, var3, var4);
- break;
- case 13:
- int var7 = var5.kid2;
- char[] var9 = var5.s != null ? var5.s : var1.source;
-
- for(int var6 = (Integer)var5.kid; var6 < var7; ++var6) {
- var3[var4++] = var9[var6];
- }
- break;
- case 14:
- var4 = this.storeChar(var3, var4, 'd', true);
- break;
- case 15:
- var4 = this.storeChar(var3, var4, 'D', true);
- break;
- case 16:
- var4 = this.storeChar(var3, var4, 'w', true);
- break;
- case 17:
- var4 = this.storeChar(var3, var4, 'W', true);
- break;
- case 18:
- var4 = this.storeChar(var3, var4, 's', true);
- break;
- case 19:
- var4 = this.storeChar(var3, var4, 'S', true);
- break;
- case 21:
- char[] var8 = var5.s != null ? var5.s : var1.source;
- var4 = this.storeChar(var3, var4, var8[(Integer)var5.kid], false);
- break;
- case 22:
- var4 = this.storeChar(var3, var4, var5.chr, false);
- break;
- default:
- throw new RuntimeException();
- }
-
- if (var2.op == 1) {
- var2 = var2.next;
- if (var2 != null && var2.op == 1) {
- continue;
- }
- }
-
- return var4;
- }
- }
-
- public static void init(Scriptable var0) throws PropertyException {
- NativeRegExp var1 = new NativeRegExp();
- ((ScriptableObject)var1).setParentScope(var0);
- ((ScriptableObject)var1).setPrototype(ScriptableObject.getObjectPrototype(var0));
- String[] var2 = new String[]{"compile", "toString", "exec", "test"};
- ((ScriptableObject)var1).defineFunctionProperties(var2, class$com$netscape$javascript$NativeRegExp != null ? class$com$netscape$javascript$NativeRegExp : (class$com$netscape$javascript$NativeRegExp = class$("com.netscape.javascript.NativeRegExp")), 2);
- String[] var3 = new String[]{"lastIndex", "source", "global", "ignoreCase"};
- int[] var4 = new int[]{4, 5, 5, 5};
-
- for(int var5 = 0; var5 < var3.length; ++var5) {
- ((ScriptableObject)var1).defineProperty(var3[var5], class$com$netscape$javascript$NativeRegExp != null ? class$com$netscape$javascript$NativeRegExp : (class$com$netscape$javascript$NativeRegExp = class$("com.netscape.javascript.NativeRegExp")), var4[var5]);
- }
-
- Scriptable var6 = NativeRegExpCtor.init(var0);
- var6.put("prototype", var6, var1);
- }
-
- public void init(Scriptable var1, String var2, String var3) {
- this.source = var2;
- this.flags = 0;
- if (var3 != null) {
- for(int var4 = 0; var4 < var3.length(); ++var4) {
- char var5 = var3.charAt(var4);
- if (var5 == 'g') {
- this.flags = (byte)(this.flags | 1);
- } else {
- if (var5 != 'i') {
- Object[] var6 = new Object[]{new Character(var5)};
- throw Context.reportRuntimeError(Context.getMessage("msg.invalid.re.flag", var6));
- }
-
- this.flags = (byte)(this.flags | 2);
- }
- }
- }
-
- CompilerState var10 = new CompilerState(var2, this.flags);
- RENode var11 = this.parseRegExp(var10);
- if (var11 != null) {
- RENode var12 = new RENode(var10, (byte)37, (Object)null);
- this.setNext(var10, var11, var12);
- this.anchorRegExp(var10, var11);
- this.optimizeRegExp(var10, var11);
- this.program = new byte[var10.progLength];
- this.lastIndex = 0;
- this.parenCount = var10.parenCount;
- this.flags = this.flags;
- var10.progLength = 0;
- this.emitRegExp(var10, var11);
- var1 = ScriptableObject.getTopLevelScope(var1);
- ((ScriptableObject)this).setPrototype(ScriptableObject.getClassPrototype(var1, "RegExp"));
- ((ScriptableObject)this).setParentScope(var1);
- }
- }
-
- private void emitRegExp(CompilerState var1, RENode var2) {
- NativeRegExp var12 = this;
-
- while(true) {
- byte var17 = var2.op;
- if (var17 == 37) {
- return;
- }
-
- int var18 = var1.progLength;
- var1.progLength += reopsize[var2.op];
- var12.program[var18] = var2.op;
- RENode var4 = var2.next;
- char[] var19 = var2.s != null ? var2.s : var1.source;
- switch (var17) {
- case 1:
- int var23 = var4.offset - var2.offset;
- this.write(var18, (short)var23);
- this.emitRegExp(var1, (RENode)var2.kid);
- break;
- case 6:
- int var22 = var4.offset - var2.offset;
- this.write(var18, (short)var22);
- var18 += 2;
- this.write(var18, var2.min);
- var18 += 2;
- this.write(var18, var2.max);
- this.emitRegExp(var1, (RENode)var2.kid);
- break;
- case 7:
- case 8:
- case 9:
- case 36:
- this.emitRegExp(var1, (RENode)var2.kid);
- break;
- case 10:
- this.write(var18, (short)var2.num);
- this.emitRegExp(var1, (RENode)var2.kid);
- break;
- case 11:
- this.write(var18, (short)var2.num);
- break;
- case 13:
- case 29:
- int var24 = (Integer)var2.kid;
- byte var3;
- if (var19[var24] == '^') {
- if (var17 == 29) {
- this.program[var18] = 30;
- }
-
- var3 = -1;
- ++var24;
- } else {
- var3 = 0;
- }
-
- ++var18;
- int var7;
- int var16;
- if (var17 == 13) {
- var7 = var2.kid2;
- int var27 = 0;
-
- do {
- this.program[var18 + var27] = var3;
- ++var27;
- } while(var27 < 32);
-
- var16 = 256;
- } else {
- var7 = var24 + var2.kidlen;
- short var10 = var2.bmsize;
- this.program[var18++] = (byte)(var10 >>> 8);
- this.program[var18++] = (byte)var10;
- var1.progLength += var10;
-
- for(int var26 = 0; var26 < var10; ++var26) {
- this.program[var18 + var26] = var3;
- }
-
- var16 = var10 * 8;
- }
-
- char var14 = (char)var16;
- boolean var11 = false;
-
- label267:
- while(var24 < var7) {
- char var34 = var19[var24++];
- if (var34 == '\\') {
- var34 = var19[var24++];
- switch (var34) {
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- int var32 = unDigit(var34);
- int var25 = var24 - 2;
- var34 = var19[var24];
- if ('0' <= var34 && var34 <= '7') {
- ++var24;
- var32 = 8 * var32 + unDigit(var34);
- var34 = var19[var24];
- if ('0' <= var34 && var34 <= '7') {
- ++var24;
- int var28 = 8 * var32 + unDigit(var34);
- if (var28 <= 255) {
- var32 = var28;
- } else {
- --var24;
- }
- }
- }
-
- var34 = (char)var32;
- break;
- case 'D':
- if (var11) {
- this.checkRange(var14, var3, var18);
- }
-
- var14 = (char)var16;
-
- for(char var44 = 0; var44 < '0'; ++var44) {
- this.matchBit(var44, var3, var18);
- }
-
- var34 = ':';
-
- while(true) {
- if (var34 >= var16) {
- continue label267;
- }
-
- this.matchBit(var34, var3, var18);
- ++var34;
- }
- case 'S':
- if (var11) {
- this.checkRange(var14, var3, var18);
- }
-
- var14 = (char)var16;
- var34 = '\u0000';
-
- while(true) {
- if (var34 >= var16) {
- continue label267;
- }
-
- if (!Character.isWhitespace(var34)) {
- this.matchBit(var34, var3, var18);
- }
-
- ++var34;
- }
- case 'W':
- if (var11) {
- this.checkRange(var14, var3, var18);
- }
-
- var14 = (char)var16;
- var34 = '\u0000';
-
- while(true) {
- if (var34 >= var16) {
- continue label267;
- }
-
- if (!isWord(var34)) {
- this.matchBit(var34, var3, var18);
- }
-
- ++var34;
- }
- case 'b':
- case 'f':
- case 'n':
- case 'r':
- case 't':
- case 'v':
- var34 = this.getEscape(var34);
- break;
- case 'c':
- var34 = var19[var24++];
- var34 = Character.toUpperCase(var34);
- var34 = (char)(var34 ^ 64);
- break;
- case 'd':
- if (var11) {
- this.checkRange(var14, var3, var18);
- }
-
- var14 = (char)var16;
- var34 = '0';
-
- while(true) {
- if (var34 > '9') {
- continue label267;
- }
-
- this.matchBit(var34, var3, var18);
- ++var34;
- }
- case 's':
- if (var11) {
- this.checkRange(var14, var3, var18);
- }
-
- var14 = (char)var16;
- var34 = '\u0000';
-
- while(true) {
- if (var34 >= var16) {
- continue label267;
- }
-
- if (Character.isWhitespace(var34)) {
- this.matchBit(var34, var3, var18);
- }
-
- ++var34;
- }
- case 'u':
- if (var19.length > var24 + 3 && isHex(var19[var24]) && isHex(var19[var24 + 1]) && isHex(var19[var24 + 2]) && isHex(var19[var24 + 3])) {
- int var31 = (((unHex(var19[var24]) << 4) + unHex(var19[var24 + 1]) << 4) + unHex(var19[var24 + 2]) << 4) + unHex(var19[var24 + 3]);
- var34 = (char)var31;
- var24 += 4;
- }
- break;
- case 'w':
- if (var11) {
- this.checkRange(var14, var3, var18);
- }
-
- var14 = (char)var16;
-
- for(char var37 = 0; var37 < var16; ++var37) {
- if (isWord(var37)) {
- this.matchBit(var37, var3, var18);
- }
- }
- continue;
- case 'x':
- int var8 = var24;
- int var29;
- if (var24 < var19.length && isHex(var34 = var19[var24++])) {
- var29 = unHex(var34);
- if (var24 < var19.length && isHex(var34 = var19[var24++])) {
- var29 <<= 4;
- var29 += unHex(var34);
- }
- } else {
- var24 = var8;
- var29 = 120;
- }
-
- var34 = (char)var29;
- }
- }
-
- if (var11) {
- if (var14 > var34) {
- throw Context.reportRuntimeError(Context.getMessage("msg.bad.range", (Object[])null));
- }
-
- var11 = false;
- } else {
- var14 = var34;
- if (var24 + 1 < var7 && var19[var24] == '-' && var19[var24 + 1] != ']') {
- ++var24;
- var11 = true;
- continue;
- }
- }
-
- for(; var14 <= var34; ++var14) {
- this.matchBit(var14, var3, var18);
- if ((var1.flags & 2) != 0) {
- char var15 = Character.toUpperCase(var14);
- this.matchBit(var15, var3, var18);
- var15 = Character.toLowerCase(var15);
- this.matchBit(var15, var3, var18);
- }
- }
-
- var14 = var34;
- }
- break;
- case 20:
- if ((var1.flags & 2) != 0) {
- this.program[var18] = 31;
- }
-
- this.program[var18 + 1] = (byte)var2.num;
- break;
- case 21:
- case 27:
- if ((var1.flags & 2) != 0) {
- this.program[var18] = (byte)(var17 == 21 ? 32 : 34);
- }
-
- int var6 = (Integer)var2.kid;
- int var21 = var2.kid2 - var6;
- this.program[var18 + 1] = (byte)var21;
- var18 += 2;
- var1.progLength += var21;
- if (var17 == 27) {
- var1.progLength += var21;
- }
-
- int var20 = 0;
-
- for(int var9 = 0; var9 < var21; ++var20) {
- char var33 = var19[var6 + var9];
- if (var17 == 27) {
- this.program[var18 + var20] = (byte)(var33 >> 8);
- ++var20;
- this.program[var18 + var20] = (byte)var33;
- } else {
- this.program[var18 + var20] = (byte)var33;
- }
-
- ++var9;
- }
- break;
- case 22:
- if ((var1.flags & 2) != 0) {
- this.program[var18] = 33;
- }
-
- this.program[var18 + 1] = (byte)var2.chr;
- break;
- case 23:
- int var5 = var4.offset - var2.offset;
- this.write(var18, (short)var5);
- break;
- case 28:
- if ((var1.flags & 2) != 0) {
- this.program[var18] = 35;
- }
-
- char var13 = var2.chr;
- this.program[var18 + 1] = (byte)(var13 >> 8);
- this.program[var18 + 2] = (byte)var13;
- }
-
- if ((var2.flags & 16) != 0) {
- var2 = var4;
- if (var4 != null) {
- continue;
- }
- }
-
- return;
- }
- }
-
- public byte getFlags() {
- return this.flags;
- }
-
- public String getClassName() {
- return "RegExp";
- }
- }
-