2 // This software is now distributed according to
3 // the Lesser Gnu Public License. Please see
4 // http://www.gnu.org/copyleft/lesser.txt for
8 package com.stevesoft.pat;
11 * This class provides a method for parsing the "s/.../.../" constructs of
18 final static char close(char c)
20 // This switch statement does not behave
21 // properly when compiled with jdk1.1.5
24 * switch(c) { case '[': return ']'; case '(': return ')'; case '{': return
46 final public static String codify(String s, boolean keepbs)
48 return codify(s, 0, s.length(), keepbs);
51 final public static String codify(String s, int i0, int iN,
54 StringBuffer sb = new StringBuffer();
55 boolean ucmode = false, lcmode = false, litmode = false;
56 boolean uc1 = false, lc1 = false;
57 boolean modified = false;
58 for (int i = i0; i < iN; i++)
61 boolean mf = true, app = true;
68 char c2 = s.charAt(i);
87 uc1 = lc1 = ucmode = lcmode = litmode = false;
125 if (litmode && needbs(c))
132 return modified ? sb.toString() : s;
135 final static char uc(char c)
137 return CaseMgr.toUpperCase(c);
140 final static char lc(char c)
142 return CaseMgr.toLowerCase(c);
145 final static boolean needbs(char c)
147 if (c >= 'a' && c <= 'z')
151 if (c >= 'A' && c <= 'Z')
155 if (c >= '0' && c <= '9')
166 final static Regex parse(String s)
168 boolean igncase = false, optim = false, gFlag = false;
169 boolean sFlag = false, mFlag = false, xFlag = false;
171 StringBuffer s1 = new StringBuffer();
172 StringBuffer s2 = new StringBuffer();
173 int i = 0, count = 0;
174 char mode, delim = '/', cdelim = '/';
175 if (s.length() >= 3 && s.charAt(0) == 's')
179 cdelim = close(delim);
182 else if (s.length() >= 2 && s.charAt(0) == 'm')
186 cdelim = close(delim);
189 else if (s.length() >= 1 && s.charAt(0) == '/')
198 RegSyntaxError.endItAll("Regex.perlCode should be of the "
199 + "form s/// or m// or //");
200 } catch (RegSyntax rs)
205 for (; i < s.length(); i++)
207 if (s.charAt(i) == '\\')
212 else if (s.charAt(i) == cdelim && count == 0)
217 else if (s.charAt(i) == delim && cdelim != delim)
221 else if (s.charAt(i) == cdelim && cdelim != delim)
225 s1.append(s.charAt(i));
227 if (mode == 's' && cdelim != delim)
229 while (i < s.length() && Prop.isWhite(s.charAt(i)))
237 RegSyntaxError.endItAll("" + mode + delim + " needs " + cdelim);
238 } catch (RegSyntax rs)
243 cdelim = close(delim = s.charAt(i));
249 for (; i < s.length(); i++)
251 if (s.charAt(i) == '\\')
256 else if (s.charAt(i) == cdelim && count == 0)
261 else if (s.charAt(i) == delim && cdelim != delim)
265 else if (s.charAt(i) == cdelim && cdelim != delim)
269 s2.append(s.charAt(i));
272 for (; i < s.length(); i++)
274 char c = s.charAt(i);
300 RegSyntaxError.endItAll("Illegal flag to pattern: " + c);
301 } catch (RegSyntax rs)
307 Regex r = new Regex();
310 String pat = s1.toString(), reprul = s2.toString();
314 reprul = strip(reprul);
317 r.ignoreCase |= igncase;
327 r.setReplaceRule(new StringRule(reprul));
331 r.setReplaceRule(ReplaceRule.perlCode(reprul));
333 } catch (RegSyntax rs)
340 static String strip(String s)
342 StringBuffer sb = new StringBuffer();
343 for (int i = 0; i < s.length(); i++)
345 char c = s.charAt(i);
353 while (i < s.length())
355 if (s.charAt(i) == '\n')
365 sb.append(s.charAt(++i));
372 return sb.toString();