KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > xquark > xquery > parser > ASCII_UCodeESC_CharStream


1 /* Generated By:JavaCC: Do not edit this line. ASCII_UCodeESC_CharStream.java Version 0.7pre6 */
2 package org.xquark.xquery.parser;
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 final class ASCII_UCodeESC_CharStream
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   private int bufline[];
64   private int bufcolumn[];
65
66   private int column = 0;
67   private int line = 1;
68
69   private java.io.Reader JavaDoc inputStream;
70
71   private boolean prevCharIsCR = false;
72   private boolean prevCharIsLF = false;
73
74   private char[] nextCharBuf;
75   private char[] buffer;
76   private int maxNextCharInd = 0;
77   private int nextCharInd = -1;
78   private int inBuf = 0;
79
80   private final 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   private final 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   private final char ReadByte() throws java.io.IOException JavaDoc
161   {
162      if (++nextCharInd >= maxNextCharInd)
163         FillBuff();
164
165      return nextCharBuf[nextCharInd];
166   }
167
168   public final char BeginToken() throws java.io.IOException JavaDoc
169   {
170      if (inBuf > 0)
171      {
172         --inBuf;
173         return buffer[tokenBegin = (bufpos == bufsize - 1) ? (bufpos = 0)
174                                                            : ++bufpos];
175      }
176
177      tokenBegin = 0;
178      bufpos = -1;
179
180      return readChar();
181   }
182
183   private final void AdjustBuffSize()
184   {
185      if (available == bufsize)
186      {
187         if (tokenBegin > 2048)
188         {
189            bufpos = 0;
190            available = tokenBegin;
191         }
192         else
193            ExpandBuff(false);
194      }
195      else if (available > tokenBegin)
196         available = bufsize;
197      else if ((tokenBegin - available) < 2048)
198         ExpandBuff(true);
199      else
200         available = tokenBegin;
201   }
202
203   private final void UpdateLineColumn(char c)
204   {
205      column++;
206
207      if (prevCharIsLF)
208      {
209         prevCharIsLF = false;
210         line += (column = 1);
211      }
212      else if (prevCharIsCR)
213      {
214         prevCharIsCR = false;
215         if (c == '\n')
216         {
217            prevCharIsLF = true;
218         }
219         else
220            line += (column = 1);
221      }
222
223      switch (c)
224      {
225         case '\r' :
226            prevCharIsCR = true;
227            break;
228         case '\n' :
229            prevCharIsLF = true;
230            break;
231         case '\t' :
232            column--;
233            column += (8 - (column & 07));
234            break;
235         default :
236            break;
237      }
238
239      bufline[bufpos] = line;
240      bufcolumn[bufpos] = column;
241   }
242
243   public final char readChar() throws java.io.IOException JavaDoc
244   {
245      if (inBuf > 0)
246      {
247         --inBuf;
248         return buffer[(bufpos == bufsize - 1) ? (bufpos = 0) : ++bufpos];
249      }
250
251      char c;
252
253      if (++bufpos == available)
254         AdjustBuffSize();
255
256      if (((buffer[bufpos] = c = (char)((char)0xff & ReadByte())) == '\\'))
257      {
258         UpdateLineColumn(c);
259
260         int backSlashCnt = 1;
261
262         for (;;) // Read all the backslashes
263
{
264            if (++bufpos == available)
265               AdjustBuffSize();
266
267            try
268            {
269               if ((buffer[bufpos] = c = (char)((char)0xff & ReadByte())) != '\\')
270               {
271                  UpdateLineColumn(c);
272                  // found a non-backslash char.
273
if ((c == 'u') && ((backSlashCnt & 1) == 1))
274                  {
275                     if (--bufpos < 0)
276                        bufpos = bufsize - 1;
277
278                     break;
279                  }
280
281                  backup(backSlashCnt);
282                  return '\\';
283               }
284            }
285            catch(java.io.IOException JavaDoc e)
286            {
287               if (backSlashCnt > 1)
288                  backup(backSlashCnt);
289
290               return '\\';
291            }
292
293            UpdateLineColumn(c);
294            backSlashCnt++;
295         }
296
297         // Here, we have seen an odd number of backslash's followed by a 'u'
298
try
299         {
300            while ((c = (char)((char)0xff & ReadByte())) == 'u')
301               ++column;
302
303            buffer[bufpos] = c = (char)(hexval(c) << 12 |
304                                        hexval((char)((char)0xff & ReadByte())) << 8 |
305                                        hexval((char)((char)0xff & ReadByte())) << 4 |
306                                        hexval((char)((char)0xff & ReadByte())));
307
308            column += 4;
309         }
310         catch(java.io.IOException JavaDoc e)
311         {
312            throw new Error JavaDoc("Invalid escape character at line " + line +
313                                          " column " + column + ".");
314         }
315
316         if (backSlashCnt == 1)
317            return c;
318         else
319         {
320            backup(backSlashCnt - 1);
321            return '\\';
322         }
323      }
324      else
325      {
326         UpdateLineColumn(c);
327         return (c);
328      }
329   }
330
331   /**
332    * @deprecated
333    * @see #getEndColumn
334    */

335
336   public final int getColumn() {
337      return bufcolumn[bufpos];
338   }
339
340   /**
341    * @deprecated
342    * @see #getEndLine
343    */

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

475   public void adjustBeginLineColumn(int newLine, int newCol)
476   {
477      int start = tokenBegin;
478      int len;
479
480      if (bufpos >= tokenBegin)
481      {
482         len = bufpos - tokenBegin + inBuf + 1;
483      }
484      else
485      {
486         len = bufsize - tokenBegin + bufpos + 1 + inBuf;
487      }
488
489      int i = 0, j = 0, k = 0;
490      int nextColDiff = 0, columnDiff = 0;
491
492      while (i < len &&
493             bufline[j = start % bufsize] == bufline[k = ++start % bufsize])
494      {
495         bufline[j] = newLine;
496         nextColDiff = columnDiff + bufcolumn[k] - bufcolumn[j];
497         bufcolumn[j] = newCol + columnDiff;
498         columnDiff = nextColDiff;
499         i++;
500      }
501
502      if (i < len)
503      {
504         bufline[j] = newLine++;
505         bufcolumn[j] = newCol + columnDiff;
506
507         while (i++ < len)
508         {
509            if (bufline[j = start % bufsize] != bufline[++start % bufsize])
510               bufline[j] = newLine++;
511            else
512               bufline[j] = newLine;
513         }
514      }
515
516      line = bufline[j];
517      column = bufcolumn[j];
518   }
519
520 }
521
Popular Tags