Clover icon

Coverage Report

  1. Project Clover database Thu Aug 13 2020 12:04:21 BST
  2. Package com.stevesoft.pat

File parsePerl.java

 

Coverage histogram

../../../img/srcFileCovDistChart5.png
39% of files have more coverage

Code metrics

94
192
8
1
373
342
86
0.45
24
8
10.75

Classes

Class Line # Actions
parsePerl 16 192 86
0.4693877746.9%
 

Contributing tests

This file is covered by 41 tests. .

Source view

1    //
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
5    // the details.
6    // -- Happy Computing!
7    //
8    package com.stevesoft.pat;
9   
10    /**
11    * This class provides a method for parsing the "s/.../.../" constructs of
12    * Regex.perlCode.
13    *
14    * @see Regex#perlCode
15    */
 
16    class parsePerl
17    {
 
18  68 toggle final static char close(char c)
19    {
20    // This switch statement does not behave
21    // properly when compiled with jdk1.1.5
22    // and the -O flag.
23    /*
24    * switch(c) { case '[': return ']'; case '(': return ')'; case '{': return
25    * '}'; } return c;
26    */
27  68 if (c == '<')
28    {
29  0 return '>';
30    }
31  68 if (c == '[')
32    {
33  0 return ']';
34    }
35  68 if (c == '(')
36    {
37  0 return ')';
38    }
39  68 if (c == '{')
40    {
41  0 return '}';
42    }
43  68 return c;
44    }
45   
 
46  1508 toggle final public static String codify(String s, boolean keepbs)
47    {
48  1508 return codify(s, 0, s.length(), keepbs);
49    }
50   
 
51  1508 toggle final public static String codify(String s, int i0, int iN, boolean keepbs)
52    {
53  1508 StringBuffer sb = new StringBuffer();
54  1508 boolean ucmode = false, lcmode = false, litmode = false;
55  1508 boolean uc1 = false, lc1 = false;
56  1508 boolean modified = false;
57  21601 for (int i = i0; i < iN; i++)
58    {
59  20093 char c = s.charAt(i);
60  20093 boolean mf = true, app = true;
61  20093 if (c == '\\')
62    {
63  2342 app = false;
64  2342 i++;
65  2342 if (i < s.length())
66    {
67  2342 char c2 = s.charAt(i);
68  2342 switch (c2)
69    {
70  0 case 'Q':
71  0 litmode = true;
72  0 break;
73  0 case 'U':
74  0 ucmode = true;
75  0 break;
76  0 case 'L':
77  0 lcmode = true;
78  0 break;
79  0 case 'u':
80  0 uc1 = true;
81  0 break;
82  0 case 'l':
83  0 lc1 = true;
84  0 break;
85  0 case 'E':
86  0 uc1 = lc1 = ucmode = lcmode = litmode = false;
87  0 break;
88  2342 default:
89  2342 if (keepbs)
90    {
91  2342 sb.append('\\');
92    }
93  2342 c = c2;
94  2342 if (keepbs)
95    {
96  2342 mf = false;
97    }
98  2342 app = true;
99  2342 break;
100    }
101  2342 modified |= mf;
102    }
103    }
104  20093 if (app)
105    {
106  20093 if (lc1)
107    {
108  0 c = lc(c);
109  0 lc1 = false;
110    }
111  20093 else if (uc1)
112    {
113  0 c = uc(c);
114  0 uc1 = false;
115    }
116  20093 else if (ucmode)
117    {
118  0 c = uc(c);
119    }
120  20093 else if (lcmode)
121    {
122  0 c = lc(c);
123    }
124  20093 if (litmode && needbs(c))
125    {
126  0 sb.append('\\');
127    }
128  20093 sb.append(c);
129    }
130    }
131  1508 return modified ? sb.toString() : s;
132    }
133   
 
134  0 toggle final static char uc(char c)
135    {
136  0 return CaseMgr.toUpperCase(c);
137    }
138   
 
139  0 toggle final static char lc(char c)
140    {
141  0 return CaseMgr.toLowerCase(c);
142    }
143   
 
144  0 toggle final static boolean needbs(char c)
145    {
146  0 if (c >= 'a' && c <= 'z')
147    {
148  0 return false;
149    }
150  0 if (c >= 'A' && c <= 'Z')
151    {
152  0 return false;
153    }
154  0 if (c >= '0' && c <= '9')
155    {
156  0 return false;
157    }
158  0 if (c == '_')
159    {
160  0 return false;
161    }
162  0 return true;
163    }
164   
 
165  80 toggle final static Regex parse(String s)
166    {
167  80 boolean igncase = false, optim = false, gFlag = false;
168  80 boolean sFlag = false, mFlag = false, xFlag = false;
169   
170  80 StringBuffer s1 = new StringBuffer();
171  80 StringBuffer s2 = new StringBuffer();
172  80 int i = 0, count = 0;
173  80 char mode, delim = '/', cdelim = '/';
174  80 if (s.length() >= 3 && s.charAt(0) == 's')
175    {
176  48 mode = 's';
177  48 delim = s.charAt(1);
178  48 cdelim = close(delim);
179  48 i = 2;
180    }
181  32 else if (s.length() >= 2 && s.charAt(0) == 'm')
182    {
183  20 mode = 'm';
184  20 delim = s.charAt(1);
185  20 cdelim = close(delim);
186  20 i = 2;
187    }
188  12 else if (s.length() >= 1 && s.charAt(0) == '/')
189    {
190  12 mode = 'm';
191  12 i = 1;
192    }
193    else
194    {
195  0 try
196    {
197  0 RegSyntaxError.endItAll("Regex.perlCode should be of the "
198    + "form s/// or m// or //");
199    } catch (RegSyntax rs)
200    {
201    }
202  0 return null;
203    }
204  708 for (; i < s.length(); i++)
205    {
206  708 if (s.charAt(i) == '\\')
207    {
208  62 s1.append('\\');
209  62 i++;
210    }
211  646 else if (s.charAt(i) == cdelim && count == 0)
212    {
213  80 i++;
214  80 break;
215    }
216  566 else if (s.charAt(i) == delim && cdelim != delim)
217    {
218  0 count++;
219    }
220  566 else if (s.charAt(i) == cdelim && cdelim != delim)
221    {
222  0 count--;
223    }
224  628 s1.append(s.charAt(i));
225    }
226  80 if (mode == 's' && cdelim != delim)
227    {
228  0 while (i < s.length() && Prop.isWhite(s.charAt(i)))
229    {
230  0 i++;
231    }
232  0 if (i >= s.length())
233    {
234  0 try
235    {
236  0 RegSyntaxError.endItAll("" + mode + delim + " needs " + cdelim);
237    } catch (RegSyntax rs)
238    {
239    }
240  0 return null;
241    }
242  0 cdelim = close(delim = s.charAt(i));
243  0 i++;
244    }
245  80 count = 0;
246  80 if (mode == 's')
247    {
248  116 for (; i < s.length(); i++)
249    {
250  116 if (s.charAt(i) == '\\')
251    {
252  0 s2.append('\\');
253  0 i++;
254    }
255  116 else if (s.charAt(i) == cdelim && count == 0)
256    {
257  48 i++;
258  48 break;
259    }
260  68 else if (s.charAt(i) == delim && cdelim != delim)
261    {
262  0 count++;
263    }
264  68 else if (s.charAt(i) == cdelim && cdelim != delim)
265    {
266  0 count--;
267    }
268  68 s2.append(s.charAt(i));
269    }
270    }
271  80 for (; i < s.length(); i++)
272    {
273  0 char c = s.charAt(i);
274  0 switch (c)
275    {
276  0 case 'x':
277  0 xFlag = true;
278  0 break;
279  0 case 'i':
280  0 igncase = true;
281  0 break;
282  0 case 'o':
283  0 optim = true;
284  0 break;
285  0 case 's':
286  0 sFlag = true;
287  0 break;
288  0 case 'm':
289  0 mFlag = true;
290  0 break;
291  0 case 'g':
292  0 gFlag = true;
293  0 break;
294  0 default:
295   
296    // syntax error!
297  0 try
298    {
299  0 RegSyntaxError.endItAll("Illegal flag to pattern: " + c);
300    } catch (RegSyntax rs)
301    {
302    }
303  0 return null;
304    }
305    }
306  80 Regex r = new Regex();
307  80 try
308    {
309  80 String pat = s1.toString(), reprul = s2.toString();
310  80 if (xFlag)
311    {
312  0 pat = strip(pat);
313  0 reprul = strip(reprul);
314    }
315  80 r.compile(pat);
316  79 r.ignoreCase |= igncase;
317  79 r.gFlag |= gFlag;
318  79 r.sFlag |= sFlag;
319  79 r.mFlag |= mFlag;
320  79 if (optim)
321    {
322  0 r.optimize();
323    }
324  79 if (delim == '\'')
325    {
326  0 r.setReplaceRule(new StringRule(reprul));
327    }
328    else
329    {
330  79 r.setReplaceRule(ReplaceRule.perlCode(reprul));
331    }
332    } catch (RegSyntax rs)
333    {
334  1 r = null;
335    }
336  80 return r;
337    }
338   
 
339  0 toggle static String strip(String s)
340    {
341  0 StringBuffer sb = new StringBuffer();
342  0 for (int i = 0; i < s.length(); i++)
343    {
344  0 char c = s.charAt(i);
345  0 if (Prop.isWhite(c))
346    {
347  0 ;
348    }
349  0 else if (c == '#')
350    {
351  0 i++;
352  0 while (i < s.length())
353    {
354  0 if (s.charAt(i) == '\n')
355    {
356  0 break;
357    }
358  0 i++;
359    }
360    }
361  0 else if (c == '\\')
362    {
363  0 sb.append(c);
364  0 sb.append(s.charAt(++i));
365    }
366    else
367    {
368  0 sb.append(c);
369    }
370    }
371  0 return sb.toString();
372    }
373    }