SimpleCharStream.java
001 /* Generated By:JavaCC: Do not edit this line. SimpleCharStream.java Version 4.1 */
002 /* JavaCCOptions:STATIC=false */
003 package net.sourceforge.pmd.lang.ast;
004 
005 /**
006  * An implementation of interface CharStream, where the stream is assumed to
007  * contain only ASCII characters (without unicode processing).
008  */
009 
010 public class SimpleCharStream implements CharStream
011 {
012 /** Whether parser is static. */
013   public static final boolean staticFlag = false;
014   int bufsize;
015   int available;
016   int tokenBegin;
017 /** Position in buffer. */
018   public int bufpos = -1;
019   protected int bufline[];
020   protected int bufcolumn[];
021 
022   protected int column = 0;
023   protected int line = 1;
024 
025   protected boolean prevCharIsCR = false;
026   protected boolean prevCharIsLF = false;
027 
028   protected java.io.Reader inputStream;
029 
030   protected char[] buffer;
031   protected int maxNextCharInd = 0;
032   protected int inBuf = 0;
033   protected int tabSize = 8;
034 
035   protected void setTabSize(int i) { tabSize = i; }
036   protected int getTabSize(int i) { return tabSize; }
037 
038 
039   protected void ExpandBuff(boolean wrapAround)
040   {
041      char[] newbuffer = new char[bufsize + 2048];
042      int newbufline[] new int[bufsize + 2048];
043      int newbufcolumn[] new int[bufsize + 2048];
044 
045      try
046      {
047         if (wrapAround)
048         {
049            System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
050            System.arraycopy(buffer, 0, newbuffer,
051                                              bufsize - tokenBegin, bufpos);
052            buffer = newbuffer;
053 
054            System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
055            System.arraycopy(bufline, 0, newbufline, bufsize - tokenBegin, bufpos);
056            bufline = newbufline;
057 
058            System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
059            System.arraycopy(bufcolumn, 0, newbufcolumn, bufsize - tokenBegin, bufpos);
060            bufcolumn = newbufcolumn;
061 
062            maxNextCharInd = (bufpos += (bufsize - tokenBegin));
063         }
064         else
065         {
066            System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
067            buffer = newbuffer;
068 
069            System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
070            bufline = newbufline;
071 
072            System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
073            bufcolumn = newbufcolumn;
074 
075            maxNextCharInd = (bufpos -= tokenBegin);
076         }
077      }
078      catch (Throwable t)
079      {
080         throw new Error(t.getMessage());
081      }
082 
083 
084      bufsize += 2048;
085      available = bufsize;
086      tokenBegin = 0;
087   }
088 
089   protected void FillBuff() throws java.io.IOException
090   {
091      if (maxNextCharInd == available)
092      {
093         if (available == bufsize)
094         {
095            if (tokenBegin > 2048)
096            {
097               bufpos = maxNextCharInd = 0;
098               available = tokenBegin;
099            }
100            else if (tokenBegin < 0)
101               bufpos = maxNextCharInd = 0;
102            else
103               ExpandBuff(false);
104         }
105         else if (available > tokenBegin)
106            available = bufsize;
107         else if ((tokenBegin - available2048)
108            ExpandBuff(true);
109         else
110            available = tokenBegin;
111      }
112 
113      int i;
114      try {
115         if ((i = inputStream.read(buffer, maxNextCharInd,
116                                     available - maxNextCharInd)) == -1)
117         {
118            inputStream.close();
119            throw new java.io.IOException();
120         }
121         else
122            maxNextCharInd += i;
123         return;
124      }
125      catch(java.io.IOException e) {
126         --bufpos;
127         backup(0);
128         if (tokenBegin == -1)
129            tokenBegin = bufpos;
130         throw e;
131      }
132   }
133 
134 /** Start. */
135   public char BeginToken() throws java.io.IOException
136   {
137      tokenBegin = -1;
138      char c = readChar();
139      tokenBegin = bufpos;
140 
141      return c;
142   }
143 
144   protected void UpdateLineColumn(char c)
145   {
146      column++;
147 
148      if (prevCharIsLF)
149      {
150         prevCharIsLF = false;
151         line += (column = 1);
152      }
153      else if (prevCharIsCR)
154      {
155         prevCharIsCR = false;
156         if (c == '\n')
157         {
158            prevCharIsLF = true;
159         }
160         else
161            line += (column = 1);
162      }
163 
164      switch (c)
165      {
166         case '\r' :
167            prevCharIsCR = true;
168            break;
169         case '\n' :
170            prevCharIsLF = true;
171            break;
172         case '\t' :
173            column--;
174            column += (tabSize - (column % tabSize));
175            break;
176         default :
177            break;
178      }
179 
180      bufline[bufpos= line;
181      bufcolumn[bufpos= column;
182   }
183 
184 /** Read a character. */
185   public char readChar() throws java.io.IOException
186   {
187      if (inBuf > 0)
188      {
189         --inBuf;
190 
191         if (++bufpos == bufsize)
192            bufpos = 0;
193 
194         return buffer[bufpos];
195      }
196 
197      if (++bufpos >= maxNextCharInd)
198         FillBuff();
199 
200      char c = buffer[bufpos];
201 
202      UpdateLineColumn(c);
203      return c;
204   }
205 
206   /**
207    @deprecated
208    @see #getEndColumn
209    */
210 
211   public int getColumn() {
212      return bufcolumn[bufpos];
213   }
214 
215   /**
216    @deprecated
217    @see #getEndLine
218    */
219 
220   public int getLine() {
221      return bufline[bufpos];
222   }
223 
224   /** Get token end column number. */
225   public int getEndColumn() {
226      return bufcolumn[bufpos];
227   }
228 
229   /** Get token end line number. */
230   public int getEndLine() {
231      return bufline[bufpos];
232   }
233 
234   /** Get token beginning column number. */
235   public int getBeginColumn() {
236      return bufcolumn[tokenBegin];
237   }
238 
239   /** Get token beginning line number. */
240   public int getBeginLine() {
241      return bufline[tokenBegin];
242   }
243 
244 /** Backup a number of characters. */
245   public void backup(int amount) {
246 
247     inBuf += amount;
248     if ((bufpos -= amount0)
249        bufpos += bufsize;
250   }
251 
252   /** Constructor. */
253   public SimpleCharStream(java.io.Reader dstream, int startline,
254   int startcolumn, int buffersize)
255   {
256     inputStream = dstream;
257     line = startline;
258     column = startcolumn - 1;
259 
260     available = bufsize = buffersize;
261     buffer = new char[buffersize];
262     bufline = new int[buffersize];
263     bufcolumn = new int[buffersize];
264   }
265 
266   /** Constructor. */
267   public SimpleCharStream(java.io.Reader dstream, int startline,
268                           int startcolumn)
269   {
270      this(dstream, startline, startcolumn, 4096);
271   }
272 
273   /** Constructor. */
274   public SimpleCharStream(java.io.Reader dstream)
275   {
276      this(dstream, 114096);
277   }
278 
279   /** Reinitialise. */
280   public void ReInit(java.io.Reader dstream, int startline,
281   int startcolumn, int buffersize)
282   {
283     inputStream = dstream;
284     line = startline;
285     column = startcolumn - 1;
286 
287     if (buffer == null || buffersize != buffer.length)
288     {
289       available = bufsize = buffersize;
290       buffer = new char[buffersize];
291       bufline = new int[buffersize];
292       bufcolumn = new int[buffersize];
293     }
294     prevCharIsLF = prevCharIsCR = false;
295     tokenBegin = inBuf = maxNextCharInd = 0;
296     bufpos = -1;
297   }
298 
299   /** Reinitialise. */
300   public void ReInit(java.io.Reader dstream, int startline,
301                      int startcolumn)
302   {
303      ReInit(dstream, startline, startcolumn, 4096);
304   }
305 
306   /** Reinitialise. */
307   public void ReInit(java.io.Reader dstream)
308   {
309      ReInit(dstream, 114096);
310   }
311   /** Constructor. */
312   public SimpleCharStream(java.io.InputStream dstream, String encoding, int startline,
313   int startcolumn, int buffersizethrows java.io.UnsupportedEncodingException
314   {
315      this(encoding == null new java.io.InputStreamReader(dstreamnew java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize);
316   }
317 
318   /** Constructor. */
319   public SimpleCharStream(java.io.InputStream dstream, int startline,
320   int startcolumn, int buffersize)
321   {
322      this(new java.io.InputStreamReader(dstream), startline, startcolumn, buffersize);
323   }
324 
325   /** Constructor. */
326   public SimpleCharStream(java.io.InputStream dstream, String encoding, int startline,
327                           int startcolumnthrows java.io.UnsupportedEncodingException
328   {
329      this(dstream, encoding, startline, startcolumn, 4096);
330   }
331 
332   /** Constructor. */
333   public SimpleCharStream(java.io.InputStream dstream, int startline,
334                           int startcolumn)
335   {
336      this(dstream, startline, startcolumn, 4096);
337   }
338 
339   /** Constructor. */
340   public SimpleCharStream(java.io.InputStream dstream, String encodingthrows java.io.UnsupportedEncodingException
341   {
342      this(dstream, encoding, 114096);
343   }
344 
345   /** Constructor. */
346   public SimpleCharStream(java.io.InputStream dstream)
347   {
348      this(dstream, 114096);
349   }
350 
351   /** Reinitialise. */
352   public void ReInit(java.io.InputStream dstream, String encoding, int startline,
353                           int startcolumn, int buffersizethrows java.io.UnsupportedEncodingException
354   {
355      ReInit(encoding == null new java.io.InputStreamReader(dstreamnew java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize);
356   }
357 
358   /** Reinitialise. */
359   public void ReInit(java.io.InputStream dstream, int startline,
360                           int startcolumn, int buffersize)
361   {
362      ReInit(new java.io.InputStreamReader(dstream), startline, startcolumn, buffersize);
363   }
364 
365   /** Reinitialise. */
366   public void ReInit(java.io.InputStream dstream, String encodingthrows java.io.UnsupportedEncodingException
367   {
368      ReInit(dstream, encoding, 114096);
369   }
370 
371   /** Reinitialise. */
372   public void ReInit(java.io.InputStream dstream)
373   {
374      ReInit(dstream, 114096);
375   }
376   /** Reinitialise. */
377   public void ReInit(java.io.InputStream dstream, String encoding, int startline,
378                      int startcolumnthrows java.io.UnsupportedEncodingException
379   {
380      ReInit(dstream, encoding, startline, startcolumn, 4096);
381   }
382   /** Reinitialise. */
383   public void ReInit(java.io.InputStream dstream, int startline,
384                      int startcolumn)
385   {
386      ReInit(dstream, startline, startcolumn, 4096);
387   }
388   /** Get token literal value. */
389   public String GetImage()
390   {
391      if (bufpos >= tokenBegin)
392         return new String(buffer, tokenBegin, bufpos - tokenBegin + 1);
393      else
394         return new String(buffer, tokenBegin, bufsize - tokenBegin+
395                               new String(buffer, 0, bufpos + 1);
396   }
397 
398   /** Get the suffix. */
399   public char[] GetSuffix(int len)
400   {
401      char[] ret = new char[len];
402 
403      if ((bufpos + 1>= len)
404         System.arraycopy(buffer, bufpos - len + 1, ret, 0, len);
405      else
406      {
407         System.arraycopy(buffer, bufsize - (len - bufpos - 1), ret, 0,
408                                                           len - bufpos - 1);
409         System.arraycopy(buffer, 0, ret, len - bufpos - 1, bufpos + 1);
410      }
411 
412      return ret;
413   }
414 
415   /** Reset buffer when finished. */
416   public void Done()
417   {
418      buffer = null;
419      bufline = null;
420      bufcolumn = null;
421   }
422 
423   /**
424    * Method to adjust line and column numbers for the start of a token.
425    */
426   public void adjustBeginLineColumn(int newLine, int newCol)
427   {
428      int start = tokenBegin;
429      int len;
430 
431      if (bufpos >= tokenBegin)
432      {
433         len = bufpos - tokenBegin + inBuf + 1;
434      }
435      else
436      {
437         len = bufsize - tokenBegin + bufpos + + inBuf;
438      }
439 
440      int i = 0, j = 0, k = 0;
441      int nextColDiff = 0, columnDiff = 0;
442 
443      while (i < len &&
444             bufline[j = start % bufsize== bufline[k = ++start % bufsize])
445      {
446         bufline[j= newLine;
447         nextColDiff = columnDiff + bufcolumn[k- bufcolumn[j];
448         bufcolumn[j= newCol + columnDiff;
449         columnDiff = nextColDiff;
450         i++;
451      }
452 
453      if (i < len)
454      {
455         bufline[j= newLine++;
456         bufcolumn[j= newCol + columnDiff;
457 
458         while (i++ < len)
459         {
460            if (bufline[j = start % bufsize!= bufline[++start % bufsize])
461               bufline[j= newLine++;
462            else
463               bufline[j= newLine;
464         }
465      }
466 
467      line = bufline[j];
468      column = bufcolumn[j];
469   }
470 
471 }
472 /* JavaCC - OriginalChecksum=81d99296909abd2c9b4b1e2d27786d9e (do not edit this line) */