-//\r
-// This software is now distributed according to\r
-// the Lesser Gnu Public License. Please see\r
-// http://www.gnu.org/copyleft/lesser.txt for\r
-// the details.\r
-// -- Happy Computing!\r
-//\r
-package com.stevesoft.pat;\r
-\r
-/** This class provides a method for parsing the "s/.../.../" constructs\r
- of Regex.perlCode.\r
- @see Regex#perlCode\r
- */\r
-class parsePerl\r
-{\r
- final static char close(char c)\r
- {\r
- // This switch statement does not behave\r
- // properly when compiled with jdk1.1.5\r
- // and the -O flag.\r
- /*\r
- switch(c) {\r
- case '[':\r
- return ']';\r
- case '(':\r
- return ')';\r
- case '{':\r
- return '}';\r
- }\r
- return c;*/\r
- if (c == '<')\r
- {\r
- return '>';\r
- }\r
- if (c == '[')\r
- {\r
- return ']';\r
- }\r
- if (c == '(')\r
- {\r
- return ')';\r
- }\r
- if (c == '{')\r
- {\r
- return '}';\r
- }\r
- return c;\r
- }\r
-\r
- final public static String codify(String s, boolean keepbs)\r
- {\r
- return codify(s, 0, s.length(), keepbs);\r
- }\r
-\r
- final public static String codify(String s, int i0, int iN, boolean keepbs)\r
- {\r
- StringBuffer sb = new StringBuffer();\r
- boolean ucmode = false, lcmode = false, litmode = false;\r
- boolean uc1 = false, lc1 = false;\r
- boolean modified = false;\r
- for (int i = i0; i < iN; i++)\r
- {\r
- char c = s.charAt(i);\r
- boolean mf = true, app = true;\r
- if (c == '\\')\r
- {\r
- app = false;\r
- i++;\r
- if (i < s.length())\r
- {\r
- char c2 = s.charAt(i);\r
- switch (c2)\r
- {\r
- case 'Q':\r
- litmode = true;\r
- break;\r
- case 'U':\r
- ucmode = true;\r
- break;\r
- case 'L':\r
- lcmode = true;\r
- break;\r
- case 'u':\r
- uc1 = true;\r
- break;\r
- case 'l':\r
- lc1 = true;\r
- break;\r
- case 'E':\r
- uc1 = lc1 = ucmode = lcmode = litmode = false;\r
- break;\r
- default:\r
- if (keepbs)\r
- {\r
- sb.append('\\');\r
- }\r
- c = c2;\r
- if (keepbs)\r
- {\r
- mf = false;\r
- }\r
- app = true;\r
- break;\r
- }\r
- modified |= mf;\r
- }\r
- }\r
- if (app)\r
- {\r
- if (lc1)\r
- {\r
- c = lc(c);\r
- lc1 = false;\r
- }\r
- else if (uc1)\r
- {\r
- c = uc(c);\r
- uc1 = false;\r
- }\r
- else if (ucmode)\r
- {\r
- c = uc(c);\r
- }\r
- else if (lcmode)\r
- {\r
- c = lc(c);\r
- }\r
- if (litmode && needbs(c))\r
- {\r
- sb.append('\\');\r
- }\r
- sb.append(c);\r
- }\r
- }\r
- return modified ? sb.toString() : s;\r
- }\r
-\r
- final static char uc(char c)\r
- {\r
- return CaseMgr.toUpperCase(c);\r
- }\r
-\r
- final static char lc(char c)\r
- {\r
- return CaseMgr.toLowerCase(c);\r
- }\r
-\r
- final static boolean needbs(char c)\r
- {\r
- if (c >= 'a' && c <= 'z')\r
- {\r
- return false;\r
- }\r
- if (c >= 'A' && c <= 'Z')\r
- {\r
- return false;\r
- }\r
- if (c >= '0' && c <= '9')\r
- {\r
- return false;\r
- }\r
- if (c == '_')\r
- {\r
- return false;\r
- }\r
- return true;\r
- }\r
-\r
- final static Regex parse(String s)\r
- {\r
- boolean igncase = false, optim = false, gFlag = false;\r
- boolean sFlag = false, mFlag = false, xFlag = false;\r
-\r
- StringBuffer s1 = new StringBuffer();\r
- StringBuffer s2 = new StringBuffer();\r
- int i = 0, count = 0;\r
- char mode, delim = '/', cdelim = '/';\r
- if (s.length() >= 3 && s.charAt(0) == 's')\r
- {\r
- mode = 's';\r
- delim = s.charAt(1);\r
- cdelim = close(delim);\r
- i = 2;\r
- }\r
- else if (s.length() >= 2 && s.charAt(0) == 'm')\r
- {\r
- mode = 'm';\r
- delim = s.charAt(1);\r
- cdelim = close(delim);\r
- i = 2;\r
- }\r
- else if (s.length() >= 1 && s.charAt(0) == '/')\r
- {\r
- mode = 'm';\r
- i = 1;\r
- }\r
- else\r
- {\r
- try\r
- {\r
- RegSyntaxError.endItAll(\r
- "Regex.perlCode should be of the " +\r
- "form s/// or m// or //");\r
- }\r
- catch (RegSyntax rs)\r
- {}\r
- return null;\r
- }\r
- for (; i < s.length(); i++)\r
- {\r
- if (s.charAt(i) == '\\')\r
- {\r
- s1.append('\\');\r
- i++;\r
- }\r
- else if (s.charAt(i) == cdelim && count == 0)\r
- {\r
- i++;\r
- break;\r
- }\r
- else if (s.charAt(i) == delim && cdelim != delim)\r
- {\r
- count++;\r
- }\r
- else if (s.charAt(i) == cdelim && cdelim != delim)\r
- {\r
- count--;\r
- }\r
- s1.append(s.charAt(i));\r
- }\r
- if (mode == 's' && cdelim != delim)\r
- {\r
- while (i < s.length() && Prop.isWhite(s.charAt(i)))\r
- {\r
- i++;\r
- }\r
- if (i >= s.length())\r
- {\r
- try\r
- {\r
- RegSyntaxError.endItAll("" + mode + delim + " needs " + cdelim);\r
- }\r
- catch (RegSyntax rs)\r
- {}\r
- return null;\r
- }\r
- cdelim = close(delim = s.charAt(i));\r
- i++;\r
- }\r
- count = 0;\r
- if (mode == 's')\r
- {\r
- for (; i < s.length(); i++)\r
- {\r
- if (s.charAt(i) == '\\')\r
- {\r
- s2.append('\\');\r
- i++;\r
- }\r
- else if (s.charAt(i) == cdelim && count == 0)\r
- {\r
- i++;\r
- break;\r
- }\r
- else if (s.charAt(i) == delim && cdelim != delim)\r
- {\r
- count++;\r
- }\r
- else if (s.charAt(i) == cdelim && cdelim != delim)\r
- {\r
- count--;\r
- }\r
- s2.append(s.charAt(i));\r
- }\r
- }\r
- for (; i < s.length(); i++)\r
- {\r
- char c = s.charAt(i);\r
- switch (c)\r
- {\r
- case 'x':\r
- xFlag = true;\r
- break;\r
- case 'i':\r
- igncase = true;\r
- break;\r
- case 'o':\r
- optim = true;\r
- break;\r
- case 's':\r
- sFlag = true;\r
- break;\r
- case 'm':\r
- mFlag = true;\r
- break;\r
- case 'g':\r
- gFlag = true;\r
- break;\r
- default:\r
-\r
- // syntax error!\r
- try\r
- {\r
- RegSyntaxError.endItAll("Illegal flag to pattern: " + c);\r
- }\r
- catch (RegSyntax rs)\r
- {}\r
- return null;\r
- }\r
- }\r
- Regex r = new Regex();\r
- try\r
- {\r
- String pat = s1.toString(), reprul = s2.toString();\r
- if (xFlag)\r
- {\r
- pat = strip(pat);\r
- reprul = strip(reprul);\r
- }\r
- r.compile(pat);\r
- r.ignoreCase |= igncase;\r
- r.gFlag |= gFlag;\r
- r.sFlag |= sFlag;\r
- r.mFlag |= mFlag;\r
- if (optim)\r
- {\r
- r.optimize();\r
- }\r
- if (delim == '\'')\r
- {\r
- r.setReplaceRule(new StringRule(reprul));\r
- }\r
- else\r
- {\r
- r.setReplaceRule(ReplaceRule.perlCode(reprul));\r
- }\r
- }\r
- catch (RegSyntax rs)\r
- {\r
- r = null;\r
- }\r
- return r;\r
- }\r
-\r
- static String strip(String s)\r
- {\r
- StringBuffer sb = new StringBuffer();\r
- for (int i = 0; i < s.length(); i++)\r
- {\r
- char c = s.charAt(i);\r
- if (Prop.isWhite(c))\r
- {\r
- ;\r
- }\r
- else if (c == '#')\r
- {\r
- i++;\r
- while (i < s.length())\r
- {\r
- if (s.charAt(i) == '\n')\r
- {\r
- break;\r
- }\r
- i++;\r
- }\r
- }\r
- else if (c == '\\')\r
- {\r
- sb.append(c);\r
- sb.append(s.charAt(++i));\r
- }\r
- else\r
- {\r
- sb.append(c);\r
- }\r
- }\r
- return sb.toString();\r
- }\r
-}\r
+//
+// This software is now distributed according to
+// the Lesser Gnu Public License. Please see
+// http://www.gnu.org/copyleft/lesser.txt for
+// the details.
+// -- Happy Computing!
+//
+package com.stevesoft.pat;
+
+/**
+ * This class provides a method for parsing the "s/.../.../" constructs of
+ * Regex.perlCode.
+ *
+ * @see Regex#perlCode
+ */
+class parsePerl
+{
+ final static char close(char c)
+ {
+ // This switch statement does not behave
+ // properly when compiled with jdk1.1.5
+ // and the -O flag.
+ /*
+ * switch(c) { case '[': return ']'; case '(': return ')'; case '{': return
+ * '}'; } return c;
+ */
+ if (c == '<')
+ {
+ return '>';
+ }
+ if (c == '[')
+ {
+ return ']';
+ }
+ if (c == '(')
+ {
+ return ')';
+ }
+ if (c == '{')
+ {
+ return '}';
+ }
+ return c;
+ }
+
+ final public static String codify(String s, boolean keepbs)
+ {
+ return codify(s, 0, s.length(), keepbs);
+ }
+
+ final public static String codify(String s, int i0, int iN, boolean keepbs)
+ {
+ StringBuffer sb = new StringBuffer();
+ boolean ucmode = false, lcmode = false, litmode = false;
+ boolean uc1 = false, lc1 = false;
+ boolean modified = false;
+ for (int i = i0; i < iN; i++)
+ {
+ char c = s.charAt(i);
+ boolean mf = true, app = true;
+ if (c == '\\')
+ {
+ app = false;
+ i++;
+ if (i < s.length())
+ {
+ char c2 = s.charAt(i);
+ switch (c2)
+ {
+ case 'Q':
+ litmode = true;
+ break;
+ case 'U':
+ ucmode = true;
+ break;
+ case 'L':
+ lcmode = true;
+ break;
+ case 'u':
+ uc1 = true;
+ break;
+ case 'l':
+ lc1 = true;
+ break;
+ case 'E':
+ uc1 = lc1 = ucmode = lcmode = litmode = false;
+ break;
+ default:
+ if (keepbs)
+ {
+ sb.append('\\');
+ }
+ c = c2;
+ if (keepbs)
+ {
+ mf = false;
+ }
+ app = true;
+ break;
+ }
+ modified |= mf;
+ }
+ }
+ if (app)
+ {
+ if (lc1)
+ {
+ c = lc(c);
+ lc1 = false;
+ }
+ else if (uc1)
+ {
+ c = uc(c);
+ uc1 = false;
+ }
+ else if (ucmode)
+ {
+ c = uc(c);
+ }
+ else if (lcmode)
+ {
+ c = lc(c);
+ }
+ if (litmode && needbs(c))
+ {
+ sb.append('\\');
+ }
+ sb.append(c);
+ }
+ }
+ return modified ? sb.toString() : s;
+ }
+
+ final static char uc(char c)
+ {
+ return CaseMgr.toUpperCase(c);
+ }
+
+ final static char lc(char c)
+ {
+ return CaseMgr.toLowerCase(c);
+ }
+
+ final static boolean needbs(char c)
+ {
+ if (c >= 'a' && c <= 'z')
+ {
+ return false;
+ }
+ if (c >= 'A' && c <= 'Z')
+ {
+ return false;
+ }
+ if (c >= '0' && c <= '9')
+ {
+ return false;
+ }
+ if (c == '_')
+ {
+ return false;
+ }
+ return true;
+ }
+
+ final static Regex parse(String s)
+ {
+ boolean igncase = false, optim = false, gFlag = false;
+ boolean sFlag = false, mFlag = false, xFlag = false;
+
+ StringBuffer s1 = new StringBuffer();
+ StringBuffer s2 = new StringBuffer();
+ int i = 0, count = 0;
+ char mode, delim = '/', cdelim = '/';
+ if (s.length() >= 3 && s.charAt(0) == 's')
+ {
+ mode = 's';
+ delim = s.charAt(1);
+ cdelim = close(delim);
+ i = 2;
+ }
+ else if (s.length() >= 2 && s.charAt(0) == 'm')
+ {
+ mode = 'm';
+ delim = s.charAt(1);
+ cdelim = close(delim);
+ i = 2;
+ }
+ else if (s.length() >= 1 && s.charAt(0) == '/')
+ {
+ mode = 'm';
+ i = 1;
+ }
+ else
+ {
+ try
+ {
+ RegSyntaxError.endItAll("Regex.perlCode should be of the "
+ + "form s/// or m// or //");
+ } catch (RegSyntax rs)
+ {
+ }
+ return null;
+ }
+ for (; i < s.length(); i++)
+ {
+ if (s.charAt(i) == '\\')
+ {
+ s1.append('\\');
+ i++;
+ }
+ else if (s.charAt(i) == cdelim && count == 0)
+ {
+ i++;
+ break;
+ }
+ else if (s.charAt(i) == delim && cdelim != delim)
+ {
+ count++;
+ }
+ else if (s.charAt(i) == cdelim && cdelim != delim)
+ {
+ count--;
+ }
+ s1.append(s.charAt(i));
+ }
+ if (mode == 's' && cdelim != delim)
+ {
+ while (i < s.length() && Prop.isWhite(s.charAt(i)))
+ {
+ i++;
+ }
+ if (i >= s.length())
+ {
+ try
+ {
+ RegSyntaxError.endItAll("" + mode + delim + " needs " + cdelim);
+ } catch (RegSyntax rs)
+ {
+ }
+ return null;
+ }
+ cdelim = close(delim = s.charAt(i));
+ i++;
+ }
+ count = 0;
+ if (mode == 's')
+ {
+ for (; i < s.length(); i++)
+ {
+ if (s.charAt(i) == '\\')
+ {
+ s2.append('\\');
+ i++;
+ }
+ else if (s.charAt(i) == cdelim && count == 0)
+ {
+ i++;
+ break;
+ }
+ else if (s.charAt(i) == delim && cdelim != delim)
+ {
+ count++;
+ }
+ else if (s.charAt(i) == cdelim && cdelim != delim)
+ {
+ count--;
+ }
+ s2.append(s.charAt(i));
+ }
+ }
+ for (; i < s.length(); i++)
+ {
+ char c = s.charAt(i);
+ switch (c)
+ {
+ case 'x':
+ xFlag = true;
+ break;
+ case 'i':
+ igncase = true;
+ break;
+ case 'o':
+ optim = true;
+ break;
+ case 's':
+ sFlag = true;
+ break;
+ case 'm':
+ mFlag = true;
+ break;
+ case 'g':
+ gFlag = true;
+ break;
+ default:
+
+ // syntax error!
+ try
+ {
+ RegSyntaxError.endItAll("Illegal flag to pattern: " + c);
+ } catch (RegSyntax rs)
+ {
+ }
+ return null;
+ }
+ }
+ Regex r = new Regex();
+ try
+ {
+ String pat = s1.toString(), reprul = s2.toString();
+ if (xFlag)
+ {
+ pat = strip(pat);
+ reprul = strip(reprul);
+ }
+ r.compile(pat);
+ r.ignoreCase |= igncase;
+ r.gFlag |= gFlag;
+ r.sFlag |= sFlag;
+ r.mFlag |= mFlag;
+ if (optim)
+ {
+ r.optimize();
+ }
+ if (delim == '\'')
+ {
+ r.setReplaceRule(new StringRule(reprul));
+ }
+ else
+ {
+ r.setReplaceRule(ReplaceRule.perlCode(reprul));
+ }
+ } catch (RegSyntax rs)
+ {
+ r = null;
+ }
+ return r;
+ }
+
+ static String strip(String s)
+ {
+ StringBuffer sb = new StringBuffer();
+ for (int i = 0; i < s.length(); i++)
+ {
+ char c = s.charAt(i);
+ if (Prop.isWhite(c))
+ {
+ ;
+ }
+ else if (c == '#')
+ {
+ i++;
+ while (i < s.length())
+ {
+ if (s.charAt(i) == '\n')
+ {
+ break;
+ }
+ i++;
+ }
+ }
+ else if (c == '\\')
+ {
+ sb.append(c);
+ sb.append(s.charAt(++i));
+ }
+ else
+ {
+ sb.append(c);
+ }
+ }
+ return sb.toString();
+ }
+}