2cf6a47d8dd5b98b3fc37f5489d0948dc6603538
[jalviewjs.git] / unused / com / stevesoft / pat / DotMulti.java
1 //\r
2 // This software is now distributed according to\r
3 // the Lesser Gnu Public License.  Please see\r
4 // http://www.gnu.org/copyleft/lesser.txt for\r
5 // the details.\r
6 //    -- Happy Computing!\r
7 //\r
8 package com.stevesoft.pat;\r
9 \r
10 import java.util.*;\r
11 \r
12 /**\r
13  * A special optimization of multi that is used when the common subpattern ".*"\r
14  * is encountered.\r
15  */\r
16 class DotMulti extends PatternSub\r
17 {\r
18   patInt fewestMatches, mostMatches;\r
19 \r
20   public patInt minChars()\r
21   {\r
22     return fewestMatches;\r
23   }\r
24 \r
25   public patInt maxChars()\r
26   {\r
27     return mostMatches;\r
28   }\r
29 \r
30   public boolean matchFewest = false;\r
31 \r
32   StringLike src = null;\r
33 \r
34   int srclength = 0;\r
35 \r
36   boolean dotDoesntMatchCR = true;\r
37 \r
38   DotMulti(patInt a, patInt b)\r
39   {\r
40     fewestMatches = a;\r
41     mostMatches = b;\r
42   }\r
43 \r
44   public String toString()\r
45   {\r
46     return ".{" + fewestMatches + "," + mostMatches + "}"\r
47             + (matchFewest ? "?" : "") + "(?# <= dot multi)" + nextString();\r
48   }\r
49 \r
50   final int submatchInternal(int pos, Pthings pt)\r
51   {\r
52     if (pos < srclength)\r
53     {\r
54       if (dotDoesntMatchCR)\r
55       {\r
56         if (src.charAt(pos) != '\n')\r
57         {\r
58           return 1 + pos;\r
59         }\r
60       }\r
61       else\r
62       {\r
63         return 1 + pos;\r
64       }\r
65     }\r
66     return -1;\r
67   }\r
68 \r
69   final static int step = 1;\r
70 \r
71   static int idcount = 1;\r
72 \r
73   public int matchInternal(int pos, Pthings pt)\r
74   {\r
75     int m = -1;\r
76     int i = pos;\r
77     src = pt.src;\r
78     srclength = src.length();\r
79     dotDoesntMatchCR = pt.dotDoesntMatchCR;\r
80     if (matchFewest)\r
81     {\r
82       int nMatches = 0;\r
83       while (fewestMatches.intValue() > nMatches)\r
84       {\r
85         i = submatchInternal(i, pt);\r
86         if (i < 0)\r
87         {\r
88           return -1;\r
89         }\r
90         nMatches++;\r
91       }\r
92       if (i < 0)\r
93       {\r
94         return -1;\r
95       }\r
96       int ii = nextMatch(i, pt);\r
97       if (ii >= 0)\r
98       {\r
99         return ii;\r
100       }\r
101       if (!mostMatches.finite())\r
102       {\r
103         while (i >= 0)\r
104         {\r
105           i = submatchInternal(i, pt);\r
106           if (i < 0)\r
107           {\r
108             return -1;\r
109           }\r
110           ii = nextMatch(i, pt);\r
111           if (ii >= 0)\r
112           {\r
113             return ii;\r
114           }\r
115         }\r
116       }\r
117       else\r
118       {\r
119         while (i > 0)\r
120         {\r
121           i = submatchInternal(i, pt);\r
122           if (i < 0)\r
123           {\r
124             return -1;\r
125           }\r
126           nMatches++;\r
127           if (nMatches > mostMatches.intValue())\r
128           {\r
129             return -1;\r
130           }\r
131           ii = nextMatch(i, pt);\r
132           if (ii >= 0)\r
133           {\r
134             return ii;\r
135           }\r
136         }\r
137       }\r
138       return -1;\r
139     }\r
140     int nMatches = 0;\r
141     while (fewestMatches.intValue() > nMatches)\r
142     {\r
143       i = submatchInternal(i, pt);\r
144       if (i >= 0)\r
145       {\r
146         nMatches++;\r
147       }\r
148       else\r
149       {\r
150         return -1;\r
151       }\r
152     }\r
153     m = i;\r
154     if (mostMatches.finite())\r
155     {\r
156       while (nMatches < mostMatches.intValue())\r
157       {\r
158         i = submatchInternal(i, pt);\r
159         if (i >= 0)\r
160         {\r
161           m = i;\r
162           nMatches++;\r
163         }\r
164         else\r
165         {\r
166           break;\r
167         }\r
168       }\r
169     }\r
170     else\r
171     {\r
172       while (true)\r
173       {\r
174         i = submatchInternal(i, pt);\r
175         if (i >= 0)\r
176         {\r
177           m = i;\r
178           nMatches++;\r
179         }\r
180         else\r
181         {\r
182           break;\r
183         }\r
184       }\r
185     }\r
186     while (m >= pos)\r
187     {\r
188       int r = nextMatch(m, pt);\r
189       if (r >= 0)\r
190       {\r
191         return r;\r
192       }\r
193       m -= step;\r
194       nMatches--;\r
195       if (nMatches < fewestMatches.intValue())\r
196       {\r
197         return -1;\r
198       }\r
199     }\r
200     return -1;\r
201   }\r
202 \r
203   Pattern clone1(Hashtable h)\r
204   {\r
205     DotMulti dm = new DotMulti(fewestMatches, mostMatches);\r
206     dm.matchFewest = matchFewest;\r
207     return dm;\r
208   }\r
209 }\r