Clover icon

Coverage Report

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

File FastMulti.java

 

Coverage histogram

../../../img/srcFileCovDistChart7.png
27% of files have more coverage

Code metrics

38
64
6
1
169
147
27
0.42
10.67
6
4.5

Classes

Class Line # Actions
FastMulti 17 64 27
0.638888963.9%
 

Contributing tests

This file is covered by 31 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    import java.util.Hashtable;
11   
12    /**
13    * A special case of Multi, implemented when minChars().equals(maxChars()), and
14    * some other conditions spelled out in RegOpt.safe4fm "Safe for FastMulti." It
15    * avoids stack growth problems as well as being slightly faster.
16    */
 
17    class FastMulti extends PatternSub
18    {
19    patInt fewestMatches, mostMatches;
20   
 
21  298 toggle public patInt minChars()
22    {
23  298 return sub.countMinChars().mul(fewestMatches);
24    }
25   
 
26  298 toggle public patInt maxChars()
27    {
28  298 return sub.countMaxChars().mul(mostMatches);
29    }
30   
31    public boolean matchFewest = false;
32   
 
33  3429 toggle FastMulti(patInt a, patInt b, Pattern p) throws RegSyntax
34    {
35  3429 if (p == null)
36    {
37  0 RegSyntaxError.endItAll("Null length pattern "
38    + "followed by *, +, or other Multi.");
39    }
40  3429 fewestMatches = a;
41  3429 mostMatches = b;
42  3429 sub = p;
43  3429 step = p.countMinChars().intValue();
44  3429 sub.setParent(null);
45    }
46   
 
47  0 toggle public String toString()
48    {
49  0 return sub.toString() + "{" + fewestMatches + "," + mostMatches + "}"
50  0 + (matchFewest ? "?" : "") + "(?# <= fast multi)"
51    + nextString();
52    }
53   
54    int step = -1;
55   
 
56  33771 toggle public int matchInternal(int pos, Pthings pt)
57    {
58  33771 int m = -1;
59  33771 int i = pos;
60  33771 int endstr = pt.src.length() - step;
61  33771 patInt matches = new patInt(0);
62  33771 if (matchFewest)
63    {
64  0 if (fewestMatches.lessEq(matches))
65    {
66  0 int ii = nextMatch(i, pt);
67  0 if (ii >= 0)
68    {
69  0 return ii;
70    }
71    }
72  0 while (i >= 0 && i <= endstr)
73    {
74  0 i = sub.matchInternal(i, pt);
75  0 if (i >= 0)
76    {
77  0 matches.inc();
78  0 if (fewestMatches.lessEq(matches))
79    {
80  0 int ii = nextMatch(i, pt);
81  0 if (ii >= 0)
82    {
83  0 return ii;
84    }
85    }
86  0 if (matches.equals(mostMatches))
87    {
88  0 return -1;
89    }
90    }
91    }
92  0 return -1;
93    }
94  33771 int nMatches = 0;
95  49826 while (fewestMatches.intValue() > nMatches)
96    {
97  18890 i = sub.matchInternal(i, pt);
98  18890 if (i >= 0)
99    {
100  16055 nMatches++;
101    }
102    else
103    {
104  2835 return -1;
105    }
106    }
107  30936 m = i;
108  30936 if (mostMatches.finite())
109    {
110  3110 while (nMatches < mostMatches.intValue())
111    {
112  1538 i = sub.matchInternal(i, pt);
113  1538 if (i >= 0)
114    {
115  1522 m = i;
116  1522 nMatches++;
117    }
118    else
119    {
120  16 break;
121    }
122    }
123    }
124    else
125    {
126  29348 while (true)
127    {
128  223390 i = sub.matchInternal(i, pt);
129  223390 if (i >= 0)
130    {
131  194042 m = i;
132  194042 nMatches++;
133    }
134    else
135    {
136  29348 break;
137    }
138    }
139    }
140  60094 while (m >= pos)
141    {
142  60094 int r = nextMatch(m, pt);
143  60094 if (r >= 0)
144    {
145  14380 return r;
146    }
147  45714 m -= step;
148  45714 nMatches--;
149  45714 if (nMatches < fewestMatches.intValue())
150    {
151  16556 return -1;
152    }
153    }
154  0 return -1;
155    }
156   
 
157  966 toggle public Pattern clone1(Hashtable h)
158    {
159  966 try
160    {
161  966 FastMulti fm = new FastMulti(fewestMatches, mostMatches, sub.clone(h));
162  966 fm.matchFewest = matchFewest;
163  966 return fm;
164    } catch (RegSyntax rs)
165    {
166  0 return null;
167    }
168    }
169    }