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