KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > nfunk > jep > JavaCharStream


1 /* Generated By:JavaCC: Do not edit this line. JavaCharStream.java Version 3.0 */
2 package org.nfunk.jep;
3
4 /**
5  * An implementation of interface CharStream, where the stream is assumed to
6  * contain only ASCII characters (with java-like unicode escape processing).
7  */

8
9 public class JavaCharStream
10 {
11   public static final boolean staticFlag = false;
12   static final int hexval(char c) throws java.io.IOException JavaDoc {
13     switch(c)
14     {
15        case '0' :
16           return 0;
17        case '1' :
18           return 1;
19        case '2' :
20           return 2;
21        case '3' :
22           return 3;
23        case '4' :
24           return 4;
25        case '5' :
26           return 5;
27        case '6' :
28           return 6;
29        case '7' :
30           return 7;
31        case '8' :
32           return 8;
33        case '9' :
34           return 9;
35
36        case 'a' :
37        case 'A' :
38           return 10;
39        case 'b' :
40        case 'B' :
41           return 11;
42        case 'c' :
43        case 'C' :
44           return 12;
45        case 'd' :
46        case 'D' :
47           return 13;
48        case 'e' :
49        case 'E' :
50           return 14;
51        case 'f' :
52        case 'F' :
53           return 15;
54     }
55
56     throw new java.io.IOException JavaDoc(); // Should never come here
57
}
58
59   public int bufpos = -1;
60   int bufsize;
61   int available;
62   int tokenBegin;
63   protected int bufline[];
64   protected int bufcolumn[];
65
66   protected int column = 0;
67   protected int line = 1;
68
69   protected boolean prevCharIsCR = false;
70   protected boolean prevCharIsLF = false;
71
72   protected java.io.Reader JavaDoc inputStream;
73
74   protected char[] nextCharBuf;
75   protected char[] buffer;
76   protected int maxNextCharInd = 0;
77   protected int nextCharInd = -1;
78   protected int inBuf = 0;
79
80   protected void ExpandBuff(boolean wrapAround)
81   {
82      char[] newbuffer = new char[bufsize + 2048];
83      int newbufline[] = new int[bufsize + 2048];
84      int newbufcolumn[] = new int[bufsize + 2048];
85
86      try
87      {
88         if (wrapAround)
89         {
90            System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
91            System.arraycopy(buffer, 0, newbuffer,
92                                              bufsize - tokenBegin, bufpos);
93            buffer = newbuffer;
94
95            System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
96            System.arraycopy(bufline, 0, newbufline, bufsize - tokenBegin, bufpos);
97            bufline = newbufline;
98
99            System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
100            System.arraycopy(bufcolumn, 0, newbufcolumn, bufsize - tokenBegin, bufpos);
101            bufcolumn = newbufcolumn;
102
103            bufpos += (bufsize - tokenBegin);
104         }
105         else
106         {
107            System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
108            buffer = newbuffer;
109
110            System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
111            bufline = newbufline;
112
113            System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
114            bufcolumn = newbufcolumn;
115
116            bufpos -= tokenBegin;
117         }
118      }
119      catch (Throwable JavaDoc t)
120      {
121         throw new Error JavaDoc(t.getMessage());
122      }
123
124      available = (bufsize += 2048);
125      tokenBegin = 0;
126   }
127
128   protected void FillBuff() throws java.io.IOException JavaDoc
129   {
130      int i;
131      if (maxNextCharInd == 4096)
132         maxNextCharInd = nextCharInd = 0;
133
134      try {
135         if ((i = inputStream.read(nextCharBuf, maxNextCharInd,
136                                             4096 - maxNextCharInd)) == -1)
137         {
138            inputStream.close();
139            throw new java.io.IOException JavaDoc();
140         }
141         else
142            maxNextCharInd += i;
143         return;
144      }
145      catch(java.io.IOException JavaDoc e) {
146         if (bufpos != 0)
147         {
148            --bufpos;
149            backup(0);
150         }
151         else
152         {
153            bufline[bufpos] = line;
154            bufcolumn[bufpos] = column;
155         }
156         throw e;
157      }
158   }
159
160   protected char ReadByte() throws java.io.IOException JavaDoc
161   {
162      if (++nextCharInd >= maxNextCharInd)
163         FillBuff();
164
165      return nextCharBuf[nextCharInd];
166   }
167
168   public char BeginToken() throws java.io.IOException JavaDoc
169   {
170      if (inBuf > 0)
171      {
172         --inBuf;
173
174         if (++bufpos == bufsize)
175            bufpos = 0;
176
177         tokenBegin = bufpos;
178         return buffer[bufpos];
179      }
180
181      tokenBegin = 0;
182      bufpos = -1;
183
184      return readChar();
185   }
186
187   protected void AdjustBuffSize()
188   {
189      if (available == bufsize)
190      {
191         if (tokenBegin > 2048)
192         {
193            bufpos = 0;
194            available = tokenBegin;
195         }
196         else
197            ExpandBuff(false);
198      }
199      else if (available > tokenBegin)
200         available = bufsize;
201      else if ((tokenBegin - available) < 2048)
202         ExpandBuff(true);
203      else
204         available = tokenBegin;
205   }
206
207   protected void UpdateLineColumn(char c)
208   {
209      column++;
210
211      if (prevCharIsLF)
212      {
213         prevCharIsLF = false;
214         line += (column = 1);
215      }
216      else if (prevCharIsCR)
217      {
218         prevCharIsCR = false;
219         if (c == '\n')
220         {
221            prevCharIsLF = true;
222         }
223         else
224            line += (column = 1);
225      }
226
227      switch (c)
228      {
229         case '\r' :
230            prevCharIsCR = true;
231            break;
232         case '\n' :
233            prevCharIsLF = true;
234            break;
235         case '\t' :
236            column--;
237            column += (8 - (column & 07));
238            break;
239         default :
240            break;
241      }
242
243      bufline[bufpos] = line;
244      bufcolumn[bufpos] = column;
245   }
246
247   public char readChar() throws java.io.IOException JavaDoc
248   {
249      if (inBuf > 0)
250      {
251         --inBuf;
252
253         if (++bufpos == bufsize)
254            bufpos = 0;
255
256         return buffer[bufpos];
257      }
258
259      char c;
260
261      if (++bufpos == available)
262         AdjustBuffSize();
263
264      if ((buffer[bufpos] = c = ReadByte()) == '\\')
265      {
266         UpdateLineColumn(c);
267
268         int backSlashCnt = 1;
269
270         for (;;) // Read all the backslashes
271
{
272            if (++bufpos == available)
273               AdjustBuffSize();
274
275            try
276            {
277               if ((buffer[bufpos] = c = ReadByte()) != '\\')
278               {
279                  UpdateLineColumn(c);
280                  // found a non-backslash char.
281
if ((c == 'u') && ((backSlashCnt & 1) == 1))
282                  {
283                     if (--bufpos < 0)
284                        bufpos = bufsize - 1;
285
286                     break;
287                  }
288
289                  backup(backSlashCnt);
290                  return '\\';
291               }
292            }
293            catch(java.io.IOException JavaDoc e)
294            {
295               if (backSlashCnt > 1)
296                  backup(backSlashCnt);
297
298               return '\\';
299            }
300
301            UpdateLineColumn(c);
302            backSlashCnt++;
303         }
304
305         // Here, we have seen an odd number of backslash's followed by a 'u'
306
try
307         {
308            while ((c = ReadByte()) == 'u')
309               ++column;
310
311            buffer[bufpos] = c = (char)(hexval(c) << 12 |
312                                        hexval(ReadByte()) << 8 |
313                                        hexval(ReadByte()) << 4 |
314                                        hexval(ReadByte()));
315
316            column += 4;
317         }
318         catch(java.io.IOException JavaDoc e)
319         {
320            throw new Error JavaDoc("Invalid escape character at line " + line +
321                                          " column " + column + ".");
322         }
323
324         if (backSlashCnt == 1)
325            return c;
326         else
327         {
328            backup(backSlashCnt - 1);
329            return '\\';
330         }
331      }
332      else
333      {
334         UpdateLineColumn(c);
335         return (c);
336      }
337   }
338
339   /**
340    * @deprecated
341    * @see #getEndColumn
342    */

343
344   public int getColumn() {
345      return bufcolumn[bufpos];
346   }
347
348   /**
349    * @deprecated
350    * @see #getEndLine
351    */

352
353   public int getLine() {
354      return bufline[bufpos];
355   }
356
357   public int getEndColumn() {
358      return bufcolumn[bufpos];
359   }
360
361   public int getEndLine() {
362      return bufline[bufpos];
363   }
364
365   public int getBeginColumn() {
366      return bufcolumn[tokenBegin];
367   }
368
369   public int getBeginLine() {
370      return bufline[tokenBegin];
371   }
372
373   public void backup(int amount) {
374
375     inBuf += amount;
376     if ((bufpos -= amount) < 0)
377        bufpos += bufsize;
378   }
379
380   public JavaCharStream(java.io.Reader JavaDoc dstream,
381                  int startline, int startcolumn, int buffersize)
382   {
383     inputStream = dstream;
384     line = startline;
385     column = startcolumn - 1;
386
387     available = bufsize = buffersize;
388     buffer = new char[buffersize];
389     bufline = new int[buffersize];
390     bufcolumn = new int[buffersize];
391     nextCharBuf = new char[4096];
392   }
393
394   public JavaCharStream(java.io.Reader JavaDoc dstream,
395                                         int startline, int startcolumn)
396   {
397      this(dstream, startline, startcolumn, 4096);
398   }
399
400   public JavaCharStream(java.io.Reader JavaDoc dstream)
401   {
402      this(dstream, 1, 1, 4096);
403   }
404   public void ReInit(java.io.Reader JavaDoc dstream,
405                  int startline, int startcolumn, int buffersize)
406   {
407     inputStream = dstream;
408     line = startline;
409     column = startcolumn - 1;
410
411     if (buffer == null || buffersize != buffer.length)
412     {
413       available = bufsize = buffersize;
414       buffer = new char[buffersize];
415       bufline = new int[buffersize];
416       bufcolumn = new int[buffersize];
417       nextCharBuf = new char[4096];
418     }
419     prevCharIsLF = prevCharIsCR = false;
420     tokenBegin = inBuf = maxNextCharInd = 0;
421     nextCharInd = bufpos = -1;
422   }
423
424   public void ReInit(java.io.Reader JavaDoc dstream,
425                                         int startline, int startcolumn)
426   {
427      ReInit(dstream, startline, startcolumn, 4096);
428   }
429
430   public void ReInit(java.io.Reader JavaDoc dstream)
431   {
432      ReInit(dstream, 1, 1, 4096);
433   }
434   public JavaCharStream(java.io.InputStream JavaDoc dstream, int startline,
435   int startcolumn, int buffersize)
436   {
437      this(new java.io.InputStreamReader JavaDoc(dstream), startline, startcolumn, 4096);
438   }
439
440   public JavaCharStream(java.io.InputStream JavaDoc dstream, int startline,
441                                                            int startcolumn)
442   {
443      this(dstream, startline, startcolumn, 4096);
444   }
445
446   public JavaCharStream(java.io.InputStream JavaDoc dstream)
447   {
448      this(dstream, 1, 1, 4096);
449   }
450
451   public void ReInit(java.io.InputStream JavaDoc dstream, int startline,
452   int startcolumn, int buffersize)
453   {
454      ReInit(new java.io.InputStreamReader JavaDoc(dstream), startline, startcolumn, 4096);
455   }
456   public void ReInit(java.io.InputStream JavaDoc dstream, int startline,
457                                                            int startcolumn)
458   {
459      ReInit(dstream, startline, startcolumn, 4096);
460   }
461   public void ReInit(java.io.InputStream JavaDoc dstream)
462   {
463      ReInit(dstream, 1, 1, 4096);
464   }
465
466   public String JavaDoc GetImage()
467   {
468      if (bufpos >= tokenBegin)
469         return new String JavaDoc(buffer, tokenBegin, bufpos - tokenBegin + 1);
470      else
471         return new String JavaDoc(buffer, tokenBegin, bufsize - tokenBegin) +
472                               new String JavaDoc(buffer, 0, bufpos + 1);
473   }
474
475   public char[] GetSuffix(int len)
476   {
477      char[] ret = new char[len];
478
479      if ((bufpos + 1) >= len)
480         System.arraycopy(buffer, bufpos - len + 1, ret, 0, len);
481      else
482      {
483         System.arraycopy(buffer, bufsize - (len - bufpos - 1), ret, 0,
484                                                           len - bufpos - 1);
485         System.arraycopy(buffer, 0, ret, len - bufpos - 1, bufpos + 1);
486      }
487
488      return ret;
489   }
490
491   public void Done()
492   {
493      nextCharBuf = null;
494      buffer = null;
495      bufline = null;
496      bufcolumn = null;
497   }
498
499   /**
500    * Method to adjust line and column numbers for the start of a token.
501    */

502   public void adjustBeginLineColumn(int newLine, int newCol)
503   {
504      int start = tokenBegin;
505      int len;
506
507      if (bufpos >= tokenBegin)
508      {
509         len = bufpos - tokenBegin + inBuf + 1;
510      }
511      else
512      {
513         len = bufsize - tokenBegin + bufpos + 1 + inBuf;
514      }
515
516      int i = 0, j = 0, k = 0;
517      int nextColDiff = 0, columnDiff = 0;
518
519      while (i < len &&
520             bufline[j = start % bufsize] == bufline[k = ++start % bufsize])
521      {
522         bufline[j] = newLine;
523         nextColDiff = columnDiff + bufcolumn[k] - bufcolumn[j];
524         bufcolumn[j] = newCol + columnDiff;
525         columnDiff = nextColDiff;
526         i++;
527      }
528
529      if (i < len)
530      {
531         bufline[j] = newLine++;
532         bufcolumn[j] = newCol + columnDiff;
533
534         while (i++ < len)
535         {
536            if (bufline[j = start % bufsize] != bufline[++start % bufsize])
537               bufline[j] = newLine++;
538            else
539               bufline[j] = newLine;
540         }
541      }
542
543      line = bufline[j];
544      column = bufcolumn[j];
545   }
546
547 }
548
Popular Tags