JAL-1807 Bob's first commit -- Applet loaded; needs image
[jalview.git] / src / com / stevesoft / pat / parsePerl.java
index 5de9f07..db842c3 100755 (executable)
-//\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 codifyRange(s, 0, s.length(), keepbs);
+  }
+
+  final public static String codifyRange(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.toUpperCaseC(c);
+  }
+
+  final static char lc(char c)
+  {
+    return CaseMgr.toLowerCaseC(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(null, "");
+    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();
+  }
+}