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