home *** CD-ROM | disk | FTP | other *** search
/ PC Professionell 2005 July / PCpro_2005_07.ISO / files / wintools / FullSync / FullSyncInstaller.exe / org / apache / regexp / RE.class (.txt) < prev    next >
Encoding:
Java Class File  |  2005-03-08  |  9.8 KB  |  848 lines

  1. package org.apache.regexp;
  2.  
  3. import java.io.Serializable;
  4. import java.util.Vector;
  5.  
  6. // $FF: renamed from: org.apache.regexp.RE
  7. public class class_0 implements Serializable {
  8.    public static final int MATCH_NORMAL = 0;
  9.    public static final int MATCH_CASEINDEPENDENT = 1;
  10.    public static final int MATCH_MULTILINE = 2;
  11.    public static final int MATCH_SINGLELINE = 4;
  12.    static final char OP_END = 'E';
  13.    static final char OP_BOL = '^';
  14.    static final char OP_EOL = '$';
  15.    static final char OP_ANY = '.';
  16.    static final char OP_ANYOF = '[';
  17.    static final char OP_BRANCH = '|';
  18.    static final char OP_ATOM = 'A';
  19.    static final char OP_STAR = '*';
  20.    static final char OP_PLUS = '+';
  21.    static final char OP_MAYBE = '?';
  22.    static final char OP_ESCAPE = '\\';
  23.    static final char OP_OPEN = '(';
  24.    static final char OP_OPEN_CLUSTER = '<';
  25.    static final char OP_CLOSE = ')';
  26.    static final char OP_CLOSE_CLUSTER = '>';
  27.    static final char OP_BACKREF = '#';
  28.    static final char OP_GOTO = 'G';
  29.    static final char OP_NOTHING = 'N';
  30.    static final char OP_RELUCTANTSTAR = '8';
  31.    static final char OP_RELUCTANTPLUS = '=';
  32.    static final char OP_RELUCTANTMAYBE = '/';
  33.    static final char OP_POSIXCLASS = 'P';
  34.    static final char E_ALNUM = 'w';
  35.    static final char E_NALNUM = 'W';
  36.    static final char E_BOUND = 'b';
  37.    static final char E_NBOUND = 'B';
  38.    static final char E_SPACE = 's';
  39.    static final char E_NSPACE = 'S';
  40.    static final char E_DIGIT = 'd';
  41.    static final char E_NDIGIT = 'D';
  42.    static final char POSIX_CLASS_ALNUM = 'w';
  43.    static final char POSIX_CLASS_ALPHA = 'a';
  44.    static final char POSIX_CLASS_BLANK = 'b';
  45.    static final char POSIX_CLASS_CNTRL = 'c';
  46.    static final char POSIX_CLASS_DIGIT = 'd';
  47.    static final char POSIX_CLASS_GRAPH = 'g';
  48.    static final char POSIX_CLASS_LOWER = 'l';
  49.    static final char POSIX_CLASS_PRINT = 'p';
  50.    static final char POSIX_CLASS_PUNCT = '!';
  51.    static final char POSIX_CLASS_SPACE = 's';
  52.    static final char POSIX_CLASS_UPPER = 'u';
  53.    static final char POSIX_CLASS_XDIGIT = 'x';
  54.    static final char POSIX_CLASS_JSTART = 'j';
  55.    static final char POSIX_CLASS_JPART = 'k';
  56.    static final int maxNode = 65536;
  57.    static final int MAX_PAREN = 16;
  58.    static final int offsetOpcode = 0;
  59.    static final int offsetOpdata = 1;
  60.    static final int offsetNext = 2;
  61.    static final int nodeSize = 3;
  62.    static final String NEWLINE = System.getProperty("line.separator");
  63.    REProgram program;
  64.    transient CharacterIterator search;
  65.    int matchFlags;
  66.    int maxParen;
  67.    transient int parenCount;
  68.    transient int start0;
  69.    transient int end0;
  70.    transient int start1;
  71.    transient int end1;
  72.    transient int start2;
  73.    transient int end2;
  74.    transient int[] startn;
  75.    transient int[] endn;
  76.    transient int[] startBackref;
  77.    transient int[] endBackref;
  78.    public static final int REPLACE_ALL = 0;
  79.    public static final int REPLACE_FIRSTONLY = 1;
  80.    public static final int REPLACE_BACKREFERENCES = 2;
  81.  
  82.    public class_0(String var1) throws RESyntaxException {
  83.       this((String)var1, 0);
  84.    }
  85.  
  86.    public class_0(String var1, int var2) throws RESyntaxException {
  87.       this((new RECompiler()).compile(var1));
  88.       this.setMatchFlags(var2);
  89.    }
  90.  
  91.    public class_0(REProgram var1, int var2) {
  92.       this.maxParen = 16;
  93.       this.setProgram(var1);
  94.       this.setMatchFlags(var2);
  95.    }
  96.  
  97.    public class_0(REProgram var1) {
  98.       this((REProgram)var1, 0);
  99.    }
  100.  
  101.    public class_0() {
  102.       this((REProgram)((REProgram)null), 0);
  103.    }
  104.  
  105.    public static String simplePatternToFullRegularExpression(String var0) {
  106.       StringBuffer var1 = new StringBuffer();
  107.  
  108.       for(int var2 = 0; var2 < var0.length(); ++var2) {
  109.          char var3 = var0.charAt(var2);
  110.          switch (var3) {
  111.             case '$':
  112.             case '(':
  113.             case ')':
  114.             case '+':
  115.             case '.':
  116.             case '?':
  117.             case '[':
  118.             case '\\':
  119.             case ']':
  120.             case '^':
  121.             case '{':
  122.             case '|':
  123.             case '}':
  124.                var1.append('\\');
  125.             default:
  126.                var1.append(var3);
  127.                break;
  128.             case '*':
  129.                var1.append(".*");
  130.          }
  131.       }
  132.  
  133.       return var1.toString();
  134.    }
  135.  
  136.    public void setMatchFlags(int var1) {
  137.       this.matchFlags = var1;
  138.    }
  139.  
  140.    public int getMatchFlags() {
  141.       return this.matchFlags;
  142.    }
  143.  
  144.    public void setProgram(REProgram var1) {
  145.       this.program = var1;
  146.       if (var1 != null && var1.maxParens != -1) {
  147.          this.maxParen = var1.maxParens;
  148.       } else {
  149.          this.maxParen = 16;
  150.       }
  151.  
  152.    }
  153.  
  154.    public REProgram getProgram() {
  155.       return this.program;
  156.    }
  157.  
  158.    public int getParenCount() {
  159.       return this.parenCount;
  160.    }
  161.  
  162.    public String getParen(int var1) {
  163.       int var2;
  164.       return var1 < this.parenCount && (var2 = this.getParenStart(var1)) >= 0 ? this.search.substring(var2, this.getParenEnd(var1)) : null;
  165.    }
  166.  
  167.    public final int getParenStart(int var1) {
  168.       if (var1 < this.parenCount) {
  169.          switch (var1) {
  170.             case 0:
  171.                return this.start0;
  172.             case 1:
  173.                return this.start1;
  174.             case 2:
  175.                return this.start2;
  176.             default:
  177.                if (this.startn == null) {
  178.                   this.allocParens();
  179.                }
  180.  
  181.                return this.startn[var1];
  182.          }
  183.       } else {
  184.          return -1;
  185.       }
  186.    }
  187.  
  188.    public final int getParenEnd(int var1) {
  189.       if (var1 < this.parenCount) {
  190.          switch (var1) {
  191.             case 0:
  192.                return this.end0;
  193.             case 1:
  194.                return this.end1;
  195.             case 2:
  196.                return this.end2;
  197.             default:
  198.                if (this.endn == null) {
  199.                   this.allocParens();
  200.                }
  201.  
  202.                return this.endn[var1];
  203.          }
  204.       } else {
  205.          return -1;
  206.       }
  207.    }
  208.  
  209.    public final int getParenLength(int var1) {
  210.       return var1 < this.parenCount ? this.getParenEnd(var1) - this.getParenStart(var1) : -1;
  211.    }
  212.  
  213.    protected final void setParenStart(int var1, int var2) {
  214.       if (var1 < this.parenCount) {
  215.          switch (var1) {
  216.             case 0:
  217.                this.start0 = var2;
  218.                break;
  219.             case 1:
  220.                this.start1 = var2;
  221.                break;
  222.             case 2:
  223.                this.start2 = var2;
  224.                break;
  225.             default:
  226.                if (this.startn == null) {
  227.                   this.allocParens();
  228.                }
  229.  
  230.                this.startn[var1] = var2;
  231.          }
  232.       }
  233.  
  234.    }
  235.  
  236.    protected final void setParenEnd(int var1, int var2) {
  237.       if (var1 < this.parenCount) {
  238.          switch (var1) {
  239.             case 0:
  240.                this.end0 = var2;
  241.                break;
  242.             case 1:
  243.                this.end1 = var2;
  244.                break;
  245.             case 2:
  246.                this.end2 = var2;
  247.                break;
  248.             default:
  249.                if (this.endn == null) {
  250.                   this.allocParens();
  251.                }
  252.  
  253.                this.endn[var1] = var2;
  254.          }
  255.       }
  256.  
  257.    }
  258.  
  259.    protected void internalError(String var1) throws Error {
  260.       throw new Error("RE internal error: " + var1);
  261.    }
  262.  
  263.    private final void allocParens() {
  264.       this.startn = new int[this.maxParen];
  265.       this.endn = new int[this.maxParen];
  266.  
  267.       for(int var1 = 0; var1 < this.maxParen; ++var1) {
  268.          this.startn[var1] = -1;
  269.          this.endn[var1] = -1;
  270.       }
  271.  
  272.    }
  273.  
  274.    protected int matchNodes(int var1, int var2, int var3) {
  275.       int var4 = var3;
  276.       char[] var9 = this.program.instruction;
  277.       int var10 = var1;
  278.  
  279.       while(var10 < var2) {
  280.          int var5;
  281.          char var6 = var9[var10 + 0];
  282.          var5 = var10 + (short)var9[var10 + 2];
  283.          char var7 = var9[var10 + 1];
  284.          label407:
  285.          switch (var6) {
  286.             case '#':
  287.                int var27 = this.startBackref[var7];
  288.                int var33 = this.endBackref[var7];
  289.                if (var27 == -1 || var33 == -1) {
  290.                   return -1;
  291.                }
  292.  
  293.                if (var27 != var33) {
  294.                   int var35 = var33 - var27;
  295.                   if (this.search.isEnd(var4 + var35 - 1)) {
  296.                      return -1;
  297.                   }
  298.  
  299.                   if ((this.matchFlags & 1) != 0) {
  300.                      for(int var38 = 0; var38 < var35; ++var38) {
  301.                         if (Character.toLowerCase(this.search.charAt(var4++)) != Character.toLowerCase(this.search.charAt(var27 + var38))) {
  302.                            return -1;
  303.                         }
  304.                      }
  305.                   } else {
  306.                      for(int var39 = 0; var39 < var35; ++var39) {
  307.                         if (this.search.charAt(var4++) != this.search.charAt(var27 + var39)) {
  308.                            return -1;
  309.                         }
  310.                      }
  311.                   }
  312.                }
  313.                break;
  314.             case '$':
  315.                if (!this.search.isEnd(0) && !this.search.isEnd(var4)) {
  316.                   if ((this.matchFlags & 2) != 2) {
  317.                      return -1;
  318.                   }
  319.  
  320.                   if (!this.isNewline(var4)) {
  321.                      return -1;
  322.                   }
  323.                }
  324.                break;
  325.             case '(':
  326.                if ((this.program.flags & 1) != 0) {
  327.                   this.startBackref[var7] = var4;
  328.                }
  329.  
  330.                int var24;
  331.                if ((var24 = this.matchNodes(var5, 65536, var4)) != -1) {
  332.                   if (var7 + 1 > this.parenCount) {
  333.                      this.parenCount = var7 + 1;
  334.                   }
  335.  
  336.                   if (this.getParenStart(var7) == -1) {
  337.                      this.setParenStart(var7, var4);
  338.                   }
  339.                }
  340.  
  341.                return var24;
  342.             case ')':
  343.                if ((this.program.flags & 1) != 0) {
  344.                   this.endBackref[var7] = var4;
  345.                }
  346.  
  347.                int var23;
  348.                if ((var23 = this.matchNodes(var5, 65536, var4)) != -1) {
  349.                   if (var7 + 1 > this.parenCount) {
  350.                      this.parenCount = var7 + 1;
  351.                   }
  352.  
  353.                   if (this.getParenEnd(var7) == -1) {
  354.                      this.setParenEnd(var7, var4);
  355.                   }
  356.                }
  357.  
  358.                return var23;
  359.             case '.':
  360.                if ((this.matchFlags & 4) == 4) {
  361.                   if (this.search.isEnd(var4)) {
  362.                      return -1;
  363.                   }
  364.  
  365.                   ++var4;
  366.                } else if (this.search.isEnd(var4) || this.search.charAt(var4++) == '\n') {
  367.                   return -1;
  368.                }
  369.                break;
  370.             case '/':
  371.                int var26 = 0;
  372.  
  373.                int var22;
  374.                while((var22 = this.matchNodes(var5, 65536, var4)) == -1) {
  375.                   if (var26++ != 0 || (var4 = this.matchNodes(var10 + 3, var5, var4)) == -1) {
  376.                      return -1;
  377.                   }
  378.                }
  379.  
  380.                return var22;
  381.             case '8':
  382.                int var21;
  383.                while((var21 = this.matchNodes(var5, 65536, var4)) == -1) {
  384.                   if ((var4 = this.matchNodes(var10 + 3, var5, var4)) == -1) {
  385.                      return -1;
  386.                   }
  387.                }
  388.  
  389.                return var21;
  390.             case '<':
  391.             case '>':
  392.                return this.matchNodes(var5, 65536, var4);
  393.             case '=':
  394.                while((var4 = this.matchNodes(var10 + 3, var5, var4)) != -1) {
  395.                   int var20;
  396.                   if ((var20 = this.matchNodes(var5, 65536, var4)) != -1) {
  397.                      return var20;
  398.                   }
  399.                }
  400.  
  401.                return -1;
  402.             case 'A':
  403.                if (this.search.isEnd(var4)) {
  404.                   return -1;
  405.                }
  406.  
  407.                char var32 = var7;
  408.                int var34 = var10 + 3;
  409.                if (this.search.isEnd(var7 + var4 - 1)) {
  410.                   return -1;
  411.                }
  412.  
  413.                if ((this.matchFlags & 1) != 0) {
  414.                   for(int var36 = 0; var36 < var32; ++var36) {
  415.                      if (Character.toLowerCase(this.search.charAt(var4++)) != Character.toLowerCase(var9[var34 + var36])) {
  416.                         return -1;
  417.                      }
  418.                   }
  419.                } else {
  420.                   for(int var37 = 0; var37 < var32; ++var37) {
  421.                      if (this.search.charAt(var4++) != var9[var34 + var37]) {
  422.                         return -1;
  423.                      }
  424.                   }
  425.                }
  426.                break;
  427.             case 'E':
  428.                this.setParenEnd(0, var4);
  429.                return var4;
  430.             case 'G':
  431.             case 'N':
  432.                break;
  433.             case 'P':
  434.                if (this.search.isEnd(var4)) {
  435.                   return -1;
  436.                }
  437.  
  438.                label328:
  439.                switch (var7) {
  440.                   case '!':
  441.                      int var31 = Character.getType(this.search.charAt(var4));
  442.                      switch (var31) {
  443.                         case 20:
  444.                         case 21:
  445.                         case 22:
  446.                         case 23:
  447.                         case 24:
  448.                            break label328;
  449.                         default:
  450.                            return -1;
  451.                      }
  452.                   case 'a':
  453.                      if (!Character.isLetter(this.search.charAt(var4))) {
  454.                         return -1;
  455.                      }
  456.                      break;
  457.                   case 'b':
  458.                      if (!Character.isSpaceChar(this.search.charAt(var4))) {
  459.                         return -1;
  460.                      }
  461.                      break;
  462.                   case 'c':
  463.                      if (Character.getType(this.search.charAt(var4)) != 15) {
  464.                         return -1;
  465.                      }
  466.                      break;
  467.                   case 'd':
  468.                      if (!Character.isDigit(this.search.charAt(var4))) {
  469.                         return -1;
  470.                      }
  471.                      break;
  472.                   case 'g':
  473.                      switch (Character.getType(this.search.charAt(var4))) {
  474.                         case 25:
  475.                         case 26:
  476.                         case 27:
  477.                         case 28:
  478.                            break label328;
  479.                         default:
  480.                            return -1;
  481.                      }
  482.                   case 'j':
  483.                      if (!Character.isJavaIdentifierStart(this.search.charAt(var4))) {
  484.                         return -1;
  485.                      }
  486.                      break;
  487.                   case 'k':
  488.                      if (!Character.isJavaIdentifierPart(this.search.charAt(var4))) {
  489.                         return -1;
  490.                      }
  491.                      break;
  492.                   case 'l':
  493.                      if (Character.getType(this.search.charAt(var4)) != 2) {
  494.                         return -1;
  495.                      }
  496.                      break;
  497.                   case 'p':
  498.                      if (Character.getType(this.search.charAt(var4)) == 15) {
  499.                         return -1;
  500.                      }
  501.                      break;
  502.                   case 's':
  503.                      if (!Character.isWhitespace(this.search.charAt(var4))) {
  504.                         return -1;
  505.                      }
  506.                      break;
  507.                   case 'u':
  508.                      if (Character.getType(this.search.charAt(var4)) != 1) {
  509.                         return -1;
  510.                      }
  511.                      break;
  512.                   case 'w':
  513.                      if (!Character.isLetterOrDigit(this.search.charAt(var4))) {
  514.                         return -1;
  515.                      }
  516.                      break;
  517.                   case 'x':
  518.                      boolean var30 = this.search.charAt(var4) >= '0' && this.search.charAt(var4) <= '9' || this.search.charAt(var4) >= 'a' && this.search.charAt(var4) <= 'f' || this.search.charAt(var4) >= 'A' && this.search.charAt(var4) <= 'F';
  519.                      if (!var30) {
  520.                         return -1;
  521.                      }
  522.                      break;
  523.                   default:
  524.                      this.internalError("Bad posix class");
  525.                }
  526.  
  527.                ++var4;
  528.                break;
  529.             case '[':
  530.                if (this.search.isEnd(var4)) {
  531.                   return -1;
  532.                }
  533.  
  534.                char var29 = this.search.charAt(var4);
  535.                boolean var13 = (this.matchFlags & 1) != 0;
  536.                if (var13) {
  537.                   var29 = Character.toLowerCase(var29);
  538.                }
  539.  
  540.                int var14 = var10 + 3;
  541.                int var15 = var14 + var7 * 2;
  542.                boolean var16 = false;
  543.                int var17 = var14;
  544.  
  545.                while(var17 < var15) {
  546.                   char var18 = var9[var17++];
  547.                   char var19 = var9[var17++];
  548.                   if (var13) {
  549.                      var18 = Character.toLowerCase(var18);
  550.                      var19 = Character.toLowerCase(var19);
  551.                   }
  552.  
  553.                   if (var29 >= var18 && var29 <= var19) {
  554.                      var16 = true;
  555.                      break;
  556.                   }
  557.                }
  558.  
  559.                if (!var16) {
  560.                   return -1;
  561.                }
  562.  
  563.                ++var4;
  564.                break;
  565.             case '\\':
  566.                switch (var7) {
  567.                   case 'B':
  568.                   case 'b':
  569.                      char var25 = var4 == 0 ? 10 : this.search.charAt(var4 - 1);
  570.                      char var28 = this.search.isEnd(var4) ? 10 : this.search.charAt(var4);
  571.                      if (Character.isLetterOrDigit(var25) == Character.isLetterOrDigit(var28) == (var7 == 'b')) {
  572.                         return -1;
  573.                      }
  574.                      break label407;
  575.                   case 'D':
  576.                   case 'S':
  577.                   case 'W':
  578.                   case 'd':
  579.                   case 's':
  580.                   case 'w':
  581.                      if (this.search.isEnd(var4)) {
  582.                         return -1;
  583.                      }
  584.  
  585.                      char var11 = this.search.charAt(var4);
  586.                      switch (var7) {
  587.                         case 'D':
  588.                         case 'd':
  589.                            if (Character.isDigit(var11) != (var7 == 'd')) {
  590.                               return -1;
  591.                            }
  592.                            break;
  593.                         case 'S':
  594.                         case 's':
  595.                            if (Character.isWhitespace(var11) != (var7 == 's')) {
  596.                               return -1;
  597.                            }
  598.                            break;
  599.                         case 'W':
  600.                         case 'w':
  601.                            if ((Character.isLetterOrDigit(var11) || var11 == '_') != (var7 == 'w')) {
  602.                               return -1;
  603.                            }
  604.                      }
  605.  
  606.                      ++var4;
  607.                      break label407;
  608.                   default:
  609.                      this.internalError("Unrecognized escape '" + var7 + "'");
  610.                      break label407;
  611.                }
  612.             case '^':
  613.                if (var4 != 0) {
  614.                   if ((this.matchFlags & 2) != 2) {
  615.                      return -1;
  616.                   }
  617.  
  618.                   if (var4 <= 0 || !this.isNewline(var4 - 1)) {
  619.                      return -1;
  620.                   }
  621.                }
  622.                break;
  623.             case '|':
  624.                if (var9[var5 + 0] == '|') {
  625.                   int var8;
  626.                   while((var8 = this.matchNodes(var10 + 3, 65536, var4)) == -1) {
  627.                      short var12 = (short)var9[var10 + 2];
  628.                      var10 += var12;
  629.                      if (var12 == 0 || var9[var10 + 0] != '|') {
  630.                         return -1;
  631.                      }
  632.                   }
  633.  
  634.                   return var8;
  635.                }
  636.  
  637.                var10 += 3;
  638.                continue;
  639.             default:
  640.                this.internalError("Invalid opcode '" + var6 + "'");
  641.          }
  642.  
  643.          var10 = var5;
  644.       }
  645.  
  646.       this.internalError("Corrupt program");
  647.       return -1;
  648.    }
  649.  
  650.    protected boolean matchAt(int var1) {
  651.       this.start0 = -1;
  652.       this.end0 = -1;
  653.       this.start1 = -1;
  654.       this.end1 = -1;
  655.       this.start2 = -1;
  656.       this.end2 = -1;
  657.       this.startn = null;
  658.       this.endn = null;
  659.       this.parenCount = 1;
  660.       this.setParenStart(0, var1);
  661.       if ((this.program.flags & 1) != 0) {
  662.          this.startBackref = new int[this.maxParen];
  663.          this.endBackref = new int[this.maxParen];
  664.       }
  665.  
  666.       int var2;
  667.       if ((var2 = this.matchNodes(0, 65536, var1)) != -1) {
  668.          this.setParenEnd(0, var2);
  669.          return true;
  670.       } else {
  671.          this.parenCount = 0;
  672.          return false;
  673.       }
  674.    }
  675.  
  676.    public boolean match(String var1, int var2) {
  677.       return this.match((CharacterIterator)(new StringCharacterIterator(var1)), var2);
  678.    }
  679.  
  680.    public boolean match(CharacterIterator var1, int var2) {
  681.       if (this.program == null) {
  682.          this.internalError("No RE program to run!");
  683.       }
  684.  
  685.       this.search = var1;
  686.       if (this.program.prefix == null) {
  687.          while(!var1.isEnd(var2 - 1)) {
  688.             if (this.matchAt(var2)) {
  689.                return true;
  690.             }
  691.  
  692.             ++var2;
  693.          }
  694.  
  695.          return false;
  696.       } else {
  697.          boolean var3 = (this.matchFlags & 1) != 0;
  698.  
  699.          for(char[] var4 = this.program.prefix; !var1.isEnd(var2 + var4.length - 1); ++var2) {
  700.             boolean var5 = false;
  701.             if (var3) {
  702.                var5 = Character.toLowerCase(var1.charAt(var2)) == Character.toLowerCase(var4[0]);
  703.             } else {
  704.                var5 = var1.charAt(var2) == var4[0];
  705.             }
  706.  
  707.             if (var5) {
  708.                int var6 = var2++;
  709.                int var7 = 1;
  710.  
  711.                while(var7 < var4.length) {
  712.                   if (var3) {
  713.                      var5 = Character.toLowerCase(var1.charAt(var2++)) == Character.toLowerCase(var4[var7++]);
  714.                   } else {
  715.                      var5 = var1.charAt(var2++) == var4[var7++];
  716.                   }
  717.  
  718.                   if (!var5) {
  719.                      break;
  720.                   }
  721.                }
  722.  
  723.                if (var7 == var4.length && this.matchAt(var6)) {
  724.                   return true;
  725.                }
  726.  
  727.                var2 = var6;
  728.             }
  729.          }
  730.  
  731.          return false;
  732.       }
  733.    }
  734.  
  735.    public boolean match(String var1) {
  736.       return this.match((String)var1, 0);
  737.    }
  738.  
  739.    public String[] split(String var1) {
  740.       Vector var2 = new Vector();
  741.       int var3 = 0;
  742.  
  743.       int var6;
  744.       for(int var4 = var1.length(); var3 < var4 && this.match(var1, var3); var3 = var6) {
  745.          int var5 = this.getParenStart(0);
  746.          var6 = this.getParenEnd(0);
  747.          if (var6 == var3) {
  748.             var2.addElement(var1.substring(var3, var5 + 1));
  749.             ++var6;
  750.          } else {
  751.             var2.addElement(var1.substring(var3, var5));
  752.          }
  753.       }
  754.  
  755.       String var7 = var1.substring(var3);
  756.       if (var7.length() != 0) {
  757.          var2.addElement(var7);
  758.       }
  759.  
  760.       String[] var8 = new String[var2.size()];
  761.       var2.copyInto(var8);
  762.       return var8;
  763.    }
  764.  
  765.    public String subst(String var1, String var2) {
  766.       return this.subst(var1, var2, 0);
  767.    }
  768.  
  769.    public String subst(String var1, String var2, int var3) {
  770.       StringBuffer var4 = new StringBuffer();
  771.       int var5 = 0;
  772.       int var6 = var1.length();
  773.  
  774.       while(var5 < var6 && this.match(var1, var5)) {
  775.          var4.append(var1.substring(var5, this.getParenStart(0)));
  776.          if ((var3 & 2) != 0) {
  777.             int var11 = 0;
  778.             int var8 = 0;
  779.  
  780.             int var9;
  781.             for(var9 = var2.length(); (var11 = var2.indexOf("$", var11)) >= 0; ++var11) {
  782.                if ((var11 == 0 || var2.charAt(var11 - 1) != '\\') && var11 + 1 < var9) {
  783.                   char var10 = var2.charAt(var11 + 1);
  784.                   if (var10 >= '0' && var10 <= '9') {
  785.                      var4.append(var2.substring(var8 + 2, var11));
  786.                      var4.append(this.getParen(var10 - 48));
  787.                      var8 = var11;
  788.                   }
  789.                }
  790.             }
  791.  
  792.             var4.append(var2.substring(var8 + 2, var9));
  793.          } else {
  794.             var4.append(var2);
  795.          }
  796.  
  797.          int var12 = this.getParenEnd(0);
  798.          if (var12 == var5) {
  799.             ++var12;
  800.          }
  801.  
  802.          var5 = var12;
  803.          if ((var3 & 1) != 0) {
  804.             break;
  805.          }
  806.       }
  807.  
  808.       if (var5 < var6) {
  809.          var4.append(var1.substring(var5));
  810.       }
  811.  
  812.       return var4.toString();
  813.    }
  814.  
  815.    public String[] grep(Object[] var1) {
  816.       Vector var2 = new Vector();
  817.  
  818.       for(int var3 = 0; var3 < var1.length; ++var3) {
  819.          String var4 = var1[var3].toString();
  820.          if (this.match(var4)) {
  821.             var2.addElement(var4);
  822.          }
  823.       }
  824.  
  825.       String[] var5 = new String[var2.size()];
  826.       var2.copyInto(var5);
  827.       return var5;
  828.    }
  829.  
  830.    private boolean isNewline(int var1) {
  831.       if (var1 < NEWLINE.length() - 1) {
  832.          return false;
  833.       } else if (this.search.charAt(var1) == '\n') {
  834.          return true;
  835.       } else {
  836.          for(int var2 = NEWLINE.length() - 1; var2 >= 0; --var1) {
  837.             if (NEWLINE.charAt(var2) != this.search.charAt(var1)) {
  838.                return false;
  839.             }
  840.  
  841.             --var2;
  842.          }
  843.  
  844.          return true;
  845.       }
  846.    }
  847. }
  848.