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