001    /* Generated By:JavaCC: Do not edit this line. SimpleCharStream.java Version 5.0 */
002    /* JavaCCOptions:STATIC=false,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */
003    /*
004     *   Copyright (C) Christian Schulte, 2005-206
005     *   All rights reserved.
006     *
007     *   Redistribution and use in source and binary forms, with or without
008     *   modification, are permitted provided that the following conditions
009     *   are met:
010     *
011     *     o Redistributions of source code must retain the above copyright
012     *       notice, this list of conditions and the following disclaimer.
013     *
014     *     o Redistributions in binary form must reproduce the above copyright
015     *       notice, this list of conditions and the following disclaimer in
016     *       the documentation and/or other materials provided with the
017     *       distribution.
018     *
019     *   THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
020     *   INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
021     *   AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
022     *   THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY DIRECT, INDIRECT,
023     *   INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
024     *   NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
025     *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
026     *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
027     *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
028     *   THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
029     *
030     *   $JOMC: VersionParser.jj 3862 2011-10-12 12:37:40Z schulte2005 $
031     *
032     */
033    package org.jomc.util;
034    
035    /**
036     * An implementation of interface CharStream, where the stream is assumed to
037     * contain only ASCII characters (without unicode processing).
038     */
039    
040    public class SimpleCharStream
041    {
042    /** Whether parser is static. */
043      public static final boolean staticFlag = false;
044      int bufsize;
045      int available;
046      int tokenBegin;
047    /** Position in buffer. */
048      public int bufpos = -1;
049      protected int bufline[];
050      protected int bufcolumn[];
051    
052      protected int column = 0;
053      protected int line = 1;
054    
055      protected boolean prevCharIsCR = false;
056      protected boolean prevCharIsLF = false;
057    
058      protected java.io.Reader inputStream;
059    
060      protected char[] buffer;
061      protected int maxNextCharInd = 0;
062      protected int inBuf = 0;
063      protected int tabSize = 8;
064    
065      protected void setTabSize(int i) { tabSize = i; }
066      protected int getTabSize(int i) { return tabSize; }
067    
068    
069      protected void ExpandBuff(boolean wrapAround)
070      {
071        char[] newbuffer = new char[bufsize + 2048];
072        int newbufline[] = new int[bufsize + 2048];
073        int newbufcolumn[] = new int[bufsize + 2048];
074    
075        try
076        {
077          if (wrapAround)
078          {
079            System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
080            System.arraycopy(buffer, 0, newbuffer, bufsize - tokenBegin, bufpos);
081            buffer = newbuffer;
082    
083            System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
084            System.arraycopy(bufline, 0, newbufline, bufsize - tokenBegin, bufpos);
085            bufline = newbufline;
086    
087            System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
088            System.arraycopy(bufcolumn, 0, newbufcolumn, bufsize - tokenBegin, bufpos);
089            bufcolumn = newbufcolumn;
090    
091            maxNextCharInd = (bufpos += (bufsize - tokenBegin));
092          }
093          else
094          {
095            System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
096            buffer = newbuffer;
097    
098            System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
099            bufline = newbufline;
100    
101            System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
102            bufcolumn = newbufcolumn;
103    
104            maxNextCharInd = (bufpos -= tokenBegin);
105          }
106        }
107        catch (Throwable t)
108        {
109          throw new Error(t.getMessage());
110        }
111    
112    
113        bufsize += 2048;
114        available = bufsize;
115        tokenBegin = 0;
116      }
117    
118      protected void FillBuff() throws java.io.IOException
119      {
120        if (maxNextCharInd == available)
121        {
122          if (available == bufsize)
123          {
124            if (tokenBegin > 2048)
125            {
126              bufpos = maxNextCharInd = 0;
127              available = tokenBegin;
128            }
129            else if (tokenBegin < 0)
130              bufpos = maxNextCharInd = 0;
131            else
132              ExpandBuff(false);
133          }
134          else if (available > tokenBegin)
135            available = bufsize;
136          else if ((tokenBegin - available) < 2048)
137            ExpandBuff(true);
138          else
139            available = tokenBegin;
140        }
141    
142        int i;
143        try {
144          if ((i = inputStream.read(buffer, maxNextCharInd, available - maxNextCharInd)) == -1)
145          {
146            inputStream.close();
147            throw new java.io.IOException();
148          }
149          else
150            maxNextCharInd += i;
151          return;
152        }
153        catch(java.io.IOException e) {
154          --bufpos;
155          backup(0);
156          if (tokenBegin == -1)
157            tokenBegin = bufpos;
158          throw e;
159        }
160      }
161    
162    /** Start. */
163      public char BeginToken() throws java.io.IOException
164      {
165        tokenBegin = -1;
166        char c = readChar();
167        tokenBegin = bufpos;
168    
169        return c;
170      }
171    
172      protected void UpdateLineColumn(char c)
173      {
174        column++;
175    
176        if (prevCharIsLF)
177        {
178          prevCharIsLF = false;
179          line += (column = 1);
180        }
181        else if (prevCharIsCR)
182        {
183          prevCharIsCR = false;
184          if (c == '\n')
185          {
186            prevCharIsLF = true;
187          }
188          else
189            line += (column = 1);
190        }
191    
192        switch (c)
193        {
194          case '\r' :
195            prevCharIsCR = true;
196            break;
197          case '\n' :
198            prevCharIsLF = true;
199            break;
200          case '\t' :
201            column--;
202            column += (tabSize - (column % tabSize));
203            break;
204          default :
205            break;
206        }
207    
208        bufline[bufpos] = line;
209        bufcolumn[bufpos] = column;
210      }
211    
212    /** Read a character. */
213      public char readChar() throws java.io.IOException
214      {
215        if (inBuf > 0)
216        {
217          --inBuf;
218    
219          if (++bufpos == bufsize)
220            bufpos = 0;
221    
222          return buffer[bufpos];
223        }
224    
225        if (++bufpos >= maxNextCharInd)
226          FillBuff();
227    
228        char c = buffer[bufpos];
229    
230        UpdateLineColumn(c);
231        return c;
232      }
233    
234      /**
235       * @deprecated
236       * @see #getEndColumn
237       */
238    
239      public int getColumn() {
240        return bufcolumn[bufpos];
241      }
242    
243      /**
244       * @deprecated
245       * @see #getEndLine
246       */
247    
248      public int getLine() {
249        return bufline[bufpos];
250      }
251    
252      /** Get token end column number. */
253      public int getEndColumn() {
254        return bufcolumn[bufpos];
255      }
256    
257      /** Get token end line number. */
258      public int getEndLine() {
259         return bufline[bufpos];
260      }
261    
262      /** Get token beginning column number. */
263      public int getBeginColumn() {
264        return bufcolumn[tokenBegin];
265      }
266    
267      /** Get token beginning line number. */
268      public int getBeginLine() {
269        return bufline[tokenBegin];
270      }
271    
272    /** Backup a number of characters. */
273      public void backup(int amount) {
274    
275        inBuf += amount;
276        if ((bufpos -= amount) < 0)
277          bufpos += bufsize;
278      }
279    
280      /** Constructor. */
281      public SimpleCharStream(java.io.Reader dstream, int startline,
282      int startcolumn, int buffersize)
283      {
284        inputStream = dstream;
285        line = startline;
286        column = startcolumn - 1;
287    
288        available = bufsize = buffersize;
289        buffer = new char[buffersize];
290        bufline = new int[buffersize];
291        bufcolumn = new int[buffersize];
292      }
293    
294      /** Constructor. */
295      public SimpleCharStream(java.io.Reader dstream, int startline,
296                              int startcolumn)
297      {
298        this(dstream, startline, startcolumn, 4096);
299      }
300    
301      /** Constructor. */
302      public SimpleCharStream(java.io.Reader dstream)
303      {
304        this(dstream, 1, 1, 4096);
305      }
306    
307      /** Reinitialise. */
308      public void ReInit(java.io.Reader dstream, int startline,
309      int startcolumn, int buffersize)
310      {
311        inputStream = dstream;
312        line = startline;
313        column = startcolumn - 1;
314    
315        if (buffer == null || buffersize != buffer.length)
316        {
317          available = bufsize = buffersize;
318          buffer = new char[buffersize];
319          bufline = new int[buffersize];
320          bufcolumn = new int[buffersize];
321        }
322        prevCharIsLF = prevCharIsCR = false;
323        tokenBegin = inBuf = maxNextCharInd = 0;
324        bufpos = -1;
325      }
326    
327      /** Reinitialise. */
328      public void ReInit(java.io.Reader dstream, int startline,
329                         int startcolumn)
330      {
331        ReInit(dstream, startline, startcolumn, 4096);
332      }
333    
334      /** Reinitialise. */
335      public void ReInit(java.io.Reader dstream)
336      {
337        ReInit(dstream, 1, 1, 4096);
338      }
339      /** Constructor. */
340      public SimpleCharStream(java.io.InputStream dstream, String encoding, int startline,
341      int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException
342      {
343        this(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize);
344      }
345    
346      /** Constructor. */
347      public SimpleCharStream(java.io.InputStream dstream, int startline,
348      int startcolumn, int buffersize)
349      {
350        this(new java.io.InputStreamReader(dstream), startline, startcolumn, buffersize);
351      }
352    
353      /** Constructor. */
354      public SimpleCharStream(java.io.InputStream dstream, String encoding, int startline,
355                              int startcolumn) throws java.io.UnsupportedEncodingException
356      {
357        this(dstream, encoding, startline, startcolumn, 4096);
358      }
359    
360      /** Constructor. */
361      public SimpleCharStream(java.io.InputStream dstream, int startline,
362                              int startcolumn)
363      {
364        this(dstream, startline, startcolumn, 4096);
365      }
366    
367      /** Constructor. */
368      public SimpleCharStream(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException
369      {
370        this(dstream, encoding, 1, 1, 4096);
371      }
372    
373      /** Constructor. */
374      public SimpleCharStream(java.io.InputStream dstream)
375      {
376        this(dstream, 1, 1, 4096);
377      }
378    
379      /** Reinitialise. */
380      public void ReInit(java.io.InputStream dstream, String encoding, int startline,
381                              int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException
382      {
383        ReInit(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize);
384      }
385    
386      /** Reinitialise. */
387      public void ReInit(java.io.InputStream dstream, int startline,
388                              int startcolumn, int buffersize)
389      {
390        ReInit(new java.io.InputStreamReader(dstream), startline, startcolumn, buffersize);
391      }
392    
393      /** Reinitialise. */
394      public void ReInit(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException
395      {
396        ReInit(dstream, encoding, 1, 1, 4096);
397      }
398    
399      /** Reinitialise. */
400      public void ReInit(java.io.InputStream dstream)
401      {
402        ReInit(dstream, 1, 1, 4096);
403      }
404      /** Reinitialise. */
405      public void ReInit(java.io.InputStream dstream, String encoding, int startline,
406                         int startcolumn) throws java.io.UnsupportedEncodingException
407      {
408        ReInit(dstream, encoding, startline, startcolumn, 4096);
409      }
410      /** Reinitialise. */
411      public void ReInit(java.io.InputStream dstream, int startline,
412                         int startcolumn)
413      {
414        ReInit(dstream, startline, startcolumn, 4096);
415      }
416      /** Get token literal value. */
417      public String GetImage()
418      {
419        if (bufpos >= tokenBegin)
420          return new String(buffer, tokenBegin, bufpos - tokenBegin + 1);
421        else
422          return new String(buffer, tokenBegin, bufsize - tokenBegin) +
423                                new String(buffer, 0, bufpos + 1);
424      }
425    
426      /** Get the suffix. */
427      public char[] GetSuffix(int len)
428      {
429        char[] ret = new char[len];
430    
431        if ((bufpos + 1) >= len)
432          System.arraycopy(buffer, bufpos - len + 1, ret, 0, len);
433        else
434        {
435          System.arraycopy(buffer, bufsize - (len - bufpos - 1), ret, 0,
436                                                            len - bufpos - 1);
437          System.arraycopy(buffer, 0, ret, len - bufpos - 1, bufpos + 1);
438        }
439    
440        return ret;
441      }
442    
443      /** Reset buffer when finished. */
444      public void Done()
445      {
446        buffer = null;
447        bufline = null;
448        bufcolumn = null;
449      }
450    
451      /**
452       * Method to adjust line and column numbers for the start of a token.
453       */
454      public void adjustBeginLineColumn(int newLine, int newCol)
455      {
456        int start = tokenBegin;
457        int len;
458    
459        if (bufpos >= tokenBegin)
460        {
461          len = bufpos - tokenBegin + inBuf + 1;
462        }
463        else
464        {
465          len = bufsize - tokenBegin + bufpos + 1 + inBuf;
466        }
467    
468        int i = 0, j = 0, k = 0;
469        int nextColDiff = 0, columnDiff = 0;
470    
471        while (i < len && bufline[j = start % bufsize] == bufline[k = ++start % bufsize])
472        {
473          bufline[j] = newLine;
474          nextColDiff = columnDiff + bufcolumn[k] - bufcolumn[j];
475          bufcolumn[j] = newCol + columnDiff;
476          columnDiff = nextColDiff;
477          i++;
478        }
479    
480        if (i < len)
481        {
482          bufline[j] = newLine++;
483          bufcolumn[j] = newCol + columnDiff;
484    
485          while (i++ < len)
486          {
487            if (bufline[j = start % bufsize] != bufline[++start % bufsize])
488              bufline[j] = newLine++;
489            else
490              bufline[j] = newLine;
491          }
492        }
493    
494        line = bufline[j];
495        column = bufcolumn[j];
496      }
497    
498    }
499    /* JavaCC - OriginalChecksum=f140db442a7308c68c6c64c13e8b21e2 (do not edit this line) */