1
2 package zeus.concepts;
3
4 /***
5 * An implementation of interface CharStream, where the stream is assumed to
6 * contain only ASCII characters (without unicode processing).
7 */
8
9 public final class ASCII_CharStream
10 {
11 public static final boolean staticFlag = false;
12 int bufsize;
13 int available;
14 int tokenBegin;
15 public int bufpos = -1;
16 private int bufline[];
17 private int bufcolumn[];
18
19 private int column = 0;
20 private int line = 1;
21
22 private boolean prevCharIsCR = false;
23 private boolean prevCharIsLF = false;
24
25 private java.io.Reader inputStream;
26
27 private char[] buffer;
28 private int maxNextCharInd = 0;
29 private int inBuf = 0;
30
31 public void finalize () {
32 bufline = null;
33 bufcolumn = null;
34 buffer = null;
35 }
36
37
38 private final void ExpandBuff(boolean wrapAround)
39 {
40 char[] newbuffer = new char[bufsize + 2048];
41 int newbufline[] = new int[bufsize + 2048];
42 int newbufcolumn[] = new int[bufsize + 2048];
43
44 try
45 {
46 if (wrapAround)
47 {
48 System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
49 System.arraycopy(buffer, 0, newbuffer,
50 bufsize - tokenBegin, bufpos);
51 buffer = newbuffer;
52
53 System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
54 System.arraycopy(bufline, 0, newbufline, bufsize - tokenBegin, bufpos);
55 bufline = newbufline;
56
57 System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
58 System.arraycopy(bufcolumn, 0, newbufcolumn, bufsize - tokenBegin, bufpos);
59 bufcolumn = newbufcolumn;
60
61 maxNextCharInd = (bufpos += (bufsize - tokenBegin));
62 }
63 else
64 {
65 System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
66 buffer = newbuffer;
67
68 System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
69 bufline = newbufline;
70
71 System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
72 bufcolumn = newbufcolumn;
73
74 maxNextCharInd = (bufpos -= tokenBegin);
75 }
76 }
77 catch (Throwable t)
78 {
79 throw new Error(t.getMessage());
80 }
81
82
83 bufsize += 2048;
84 available = bufsize;
85 tokenBegin = 0;
86 }
87
88 private final void FillBuff() throws java.io.IOException
89 {
90 if (maxNextCharInd == available)
91 {
92 if (available == bufsize)
93 {
94 if (tokenBegin > 2048)
95 {
96 bufpos = maxNextCharInd = 0;
97 available = tokenBegin;
98 }
99 else if (tokenBegin < 0)
100 bufpos = maxNextCharInd = 0;
101 else
102 ExpandBuff(false);
103 }
104 else if (available > tokenBegin)
105 available = bufsize;
106 else if ((tokenBegin - available) < 2048)
107 ExpandBuff(true);
108 else
109 available = tokenBegin;
110 }
111
112 int i;
113 try {
114 if ((i = inputStream.read(buffer, maxNextCharInd,
115 available - maxNextCharInd)) == -1)
116 {
117 inputStream.close();
118 throw new java.io.IOException();
119 }
120 else
121 maxNextCharInd += i;
122 return;
123 }
124 catch(java.io.IOException e) {
125 --bufpos;
126 backup(0);
127 if (tokenBegin == -1)
128 tokenBegin = bufpos;
129 throw e;
130 }
131 }
132
133 public final char BeginToken() throws java.io.IOException
134 {
135 tokenBegin = -1;
136 char c = readChar();
137 tokenBegin = bufpos;
138
139 return c;
140 }
141
142 private final void UpdateLineColumn(char c)
143 {
144 column++;
145
146 if (prevCharIsLF)
147 {
148 prevCharIsLF = false;
149 line += (column = 1);
150 }
151 else if (prevCharIsCR)
152 {
153 prevCharIsCR = false;
154 if (c == '\n')
155 {
156 prevCharIsLF = true;
157 }
158 else
159 line += (column = 1);
160 }
161
162 switch (c)
163 {
164 case '\r' :
165 prevCharIsCR = true;
166 break;
167 case '\n' :
168 prevCharIsLF = true;
169 break;
170 case '\t' :
171 column--;
172 column += (8 - (column & 07));
173 break;
174 default :
175 break;
176 }
177
178 bufline[bufpos] = line;
179 bufcolumn[bufpos] = column;
180 }
181
182 public final char readChar() throws java.io.IOException
183 {
184 if (inBuf > 0)
185 {
186 --inBuf;
187 return (char)((char)0xff & buffer[(bufpos == bufsize - 1) ? (bufpos = 0) : ++bufpos]);
188 }
189
190 if (++bufpos >= maxNextCharInd)
191 FillBuff();
192
193 char c = (char)((char)0xff & buffer[bufpos]);
194
195 UpdateLineColumn(c);
196 return (c);
197 }
198
199 /***
200 * @deprecated
201 * @see #getEndColumn
202 */
203
204 public final int getColumn() {
205 return bufcolumn[bufpos];
206 }
207
208 /***
209 * @deprecated
210 * @see #getEndLine
211 */
212
213 public final int getLine() {
214 return bufline[bufpos];
215 }
216
217 public final int getEndColumn() {
218 return bufcolumn[bufpos];
219 }
220
221 public final int getEndLine() {
222 return bufline[bufpos];
223 }
224
225 public final int getBeginColumn() {
226 return bufcolumn[tokenBegin];
227 }
228
229 public final int getBeginLine() {
230 return bufline[tokenBegin];
231 }
232
233 public final void backup(int amount) {
234
235 inBuf += amount;
236 if ((bufpos -= amount) < 0)
237 bufpos += bufsize;
238 }
239
240 public ASCII_CharStream(java.io.Reader dstream, int startline,
241 int startcolumn, int buffersize)
242 {
243 inputStream = dstream;
244 line = startline;
245 column = startcolumn - 1;
246
247 available = bufsize = buffersize;
248 buffer = new char[buffersize];
249 bufline = new int[buffersize];
250 bufcolumn = new int[buffersize];
251 }
252
253 public ASCII_CharStream(java.io.Reader dstream, int startline,
254 int startcolumn)
255 {
256 this(dstream, startline, startcolumn, 4096);
257 }
258 public void ReInit(java.io.Reader dstream, int startline,
259 int startcolumn, int buffersize)
260 {
261 inputStream = dstream;
262 line = startline;
263 column = startcolumn - 1;
264
265 if (buffer == null || buffersize != buffer.length)
266 {
267 available = bufsize = buffersize;
268 buffer = new char[buffersize];
269 bufline = new int[buffersize];
270 bufcolumn = new int[buffersize];
271 }
272 prevCharIsLF = prevCharIsCR = false;
273 tokenBegin = inBuf = maxNextCharInd = 0;
274 bufpos = -1;
275 }
276
277 public void ReInit(java.io.Reader dstream, int startline,
278 int startcolumn)
279 {
280 ReInit(dstream, startline, startcolumn, 4096);
281 }
282 public ASCII_CharStream(java.io.InputStream dstream, int startline,
283 int startcolumn, int buffersize)
284 {
285 this(new java.io.InputStreamReader(dstream), startline, startcolumn, 4096);
286 }
287
288 public ASCII_CharStream(java.io.InputStream dstream, int startline,
289 int startcolumn)
290 {
291 this(dstream, startline, startcolumn, 4096);
292 }
293
294 public void ReInit(java.io.InputStream dstream, int startline,
295 int startcolumn, int buffersize)
296 {
297 ReInit(new java.io.InputStreamReader(dstream), startline, startcolumn, 4096);
298 }
299 public void ReInit(java.io.InputStream dstream, int startline,
300 int startcolumn)
301 {
302 ReInit(dstream, startline, startcolumn, 4096);
303 }
304 public final String GetImage()
305 {
306 if (bufpos >= tokenBegin)
307 return new String(buffer, tokenBegin, bufpos - tokenBegin + 1);
308 else
309 return new String(buffer, tokenBegin, bufsize - tokenBegin) +
310 new String(buffer, 0, bufpos + 1);
311 }
312
313 public final char[] GetSuffix(int len)
314 {
315 char[] ret = new char[len];
316
317 if ((bufpos + 1) >= len)
318 System.arraycopy(buffer, bufpos - len + 1, ret, 0, len);
319 else
320 {
321 System.arraycopy(buffer, bufsize - (len - bufpos - 1), ret, 0,
322 len - bufpos - 1);
323 System.arraycopy(buffer, 0, ret, len - bufpos - 1, bufpos + 1);
324 }
325
326 return ret;
327 }
328
329 public void Done()
330 {
331 buffer = null;
332 bufline = null;
333 bufcolumn = null;
334 }
335
336 /***
337 * Method to adjust line and column numbers for the start of a token.<BR>
338 */
339 public void adjustBeginLineColumn(int newLine, int newCol)
340 {
341 int start = tokenBegin;
342 int len;
343
344 if (bufpos >= tokenBegin)
345 {
346 len = bufpos - tokenBegin + inBuf + 1;
347 }
348 else
349 {
350 len = bufsize - tokenBegin + bufpos + 1 + inBuf;
351 }
352
353 int i = 0, j = 0, k = 0;
354 int nextColDiff = 0, columnDiff = 0;
355
356 while (i < len &&
357 bufline[j = start % bufsize] == bufline[k = ++start % bufsize])
358 {
359 bufline[j] = newLine;
360 nextColDiff = columnDiff + bufcolumn[k] - bufcolumn[j];
361 bufcolumn[j] = newCol + columnDiff;
362 columnDiff = nextColDiff;
363 i++;
364 }
365
366 if (i < len)
367 {
368 bufline[j] = newLine++;
369 bufcolumn[j] = newCol + columnDiff;
370
371 while (i++ < len)
372 {
373 if (bufline[j = start % bufsize] != bufline[++start % bufsize])
374 bufline[j] = newLine++;
375 else
376 bufline[j] = newLine;
377 }
378 }
379
380 line = bufline[j];
381 column = bufcolumn[j];
382 }
383
384 }