001    /* Generated By:JavaCC: Do not edit this line. SimpleCharStream.java Version 5.0 */
002    /* JavaCCOptions:STATIC=false,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */
003    package org.apache.commons.jexl2.parser;
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
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, bufsize - tokenBegin, bufpos);
051            buffer = newbuffer;
052    
053            System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
054            System.arraycopy(bufline, 0, newbufline, bufsize - tokenBegin, bufpos);
055            bufline = newbufline;
056    
057            System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
058            System.arraycopy(bufcolumn, 0, newbufcolumn, bufsize - tokenBegin, bufpos);
059            bufcolumn = newbufcolumn;
060    
061            maxNextCharInd = (bufpos += (bufsize - tokenBegin));
062          }
063          else
064          {
065            System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
066            buffer = newbuffer;
067    
068            System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
069            bufline = newbufline;
070    
071            System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
072            bufcolumn = newbufcolumn;
073    
074            maxNextCharInd = (bufpos -= tokenBegin);
075          }
076        }
077        catch (Throwable t)
078        {
079          throw new Error(t.getMessage());
080        }
081    
082    
083        bufsize += 2048;
084        available = bufsize;
085        tokenBegin = 0;
086      }
087    
088      protected void FillBuff() throws java.io.IOException
089      {
090        if (maxNextCharInd == available)
091        {
092          if (available == bufsize)
093          {
094            if (tokenBegin > 2048)
095            {
096              bufpos = maxNextCharInd = 0;
097              available = tokenBegin;
098            }
099            else if (tokenBegin < 0)
100              bufpos = maxNextCharInd = 0;
101            else
102              ExpandBuff(false);
103          }
104          else if (available > tokenBegin)
105            available = bufsize;
106          else if ((tokenBegin - available) < 2048)
107            ExpandBuff(true);
108          else
109            available = tokenBegin;
110        }
111    
112        int i;
113        try {
114          if ((i = inputStream.read(buffer, maxNextCharInd, available - maxNextCharInd)) == -1)
115          {
116            inputStream.close();
117            throw new java.io.IOException();
118          }
119          else
120            maxNextCharInd += i;
121          return;
122        }
123        catch(java.io.IOException e) {
124          --bufpos;
125          backup(0);
126          if (tokenBegin == -1)
127            tokenBegin = bufpos;
128          throw e;
129        }
130      }
131    
132    /** Start. */
133      public char BeginToken() throws java.io.IOException
134      {
135        tokenBegin = -1;
136        char c = readChar();
137        tokenBegin = bufpos;
138    
139        return c;
140      }
141    
142      protected void UpdateLineColumn(char c)
143      {
144        column++;
145    
146        if (prevCharIsLF)
147        {
148          prevCharIsLF = false;
149          line += (column = 1);
150        }
151        else if (prevCharIsCR)
152        {
153          prevCharIsCR = false;
154          if (c == '\n')
155          {
156            prevCharIsLF = true;
157          }
158          else
159            line += (column = 1);
160        }
161    
162        switch (c)
163        {
164          case '\r' :
165            prevCharIsCR = true;
166            break;
167          case '\n' :
168            prevCharIsLF = true;
169            break;
170          case '\t' :
171            column--;
172            column += (tabSize - (column % tabSize));
173            break;
174          default :
175            break;
176        }
177    
178        bufline[bufpos] = line;
179        bufcolumn[bufpos] = column;
180      }
181    
182    /** Read a character. */
183      public char readChar() throws java.io.IOException
184      {
185        if (inBuf > 0)
186        {
187          --inBuf;
188    
189          if (++bufpos == bufsize)
190            bufpos = 0;
191    
192          return buffer[bufpos];
193        }
194    
195        if (++bufpos >= maxNextCharInd)
196          FillBuff();
197    
198        char c = buffer[bufpos];
199    
200        UpdateLineColumn(c);
201        return c;
202      }
203    
204      @Deprecated
205      /**
206       * @deprecated
207       * @see #getEndColumn
208       */
209    
210      public int getColumn() {
211        return bufcolumn[bufpos];
212      }
213    
214      @Deprecated
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 -= amount) < 0)
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, 1, 1, 4096);
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, 1, 1, 4096);
310      }
311      /** Constructor. */
312      public SimpleCharStream(java.io.InputStream dstream, String encoding, int startline,
313      int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException
314      {
315        this(encoding == null ? new java.io.InputStreamReader(dstream) : new 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 startcolumn) throws 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 encoding) throws java.io.UnsupportedEncodingException
341      {
342        this(dstream, encoding, 1, 1, 4096);
343      }
344    
345      /** Constructor. */
346      public SimpleCharStream(java.io.InputStream dstream)
347      {
348        this(dstream, 1, 1, 4096);
349      }
350    
351      /** Reinitialise. */
352      public void ReInit(java.io.InputStream dstream, String encoding, int startline,
353                              int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException
354      {
355        ReInit(encoding == null ? new java.io.InputStreamReader(dstream) : new 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 encoding) throws java.io.UnsupportedEncodingException
367      {
368        ReInit(dstream, encoding, 1, 1, 4096);
369      }
370    
371      /** Reinitialise. */
372      public void ReInit(java.io.InputStream dstream)
373      {
374        ReInit(dstream, 1, 1, 4096);
375      }
376      /** Reinitialise. */
377      public void ReInit(java.io.InputStream dstream, String encoding, int startline,
378                         int startcolumn) throws 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 + 1 + inBuf;
438        }
439    
440        int i = 0, j = 0, k = 0;
441        int nextColDiff = 0, columnDiff = 0;
442    
443        while (i < len && bufline[j = start % bufsize] == bufline[k = ++start % bufsize])
444        {
445          bufline[j] = newLine;
446          nextColDiff = columnDiff + bufcolumn[k] - bufcolumn[j];
447          bufcolumn[j] = newCol + columnDiff;
448          columnDiff = nextColDiff;
449          i++;
450        }
451    
452        if (i < len)
453        {
454          bufline[j] = newLine++;
455          bufcolumn[j] = newCol + columnDiff;
456    
457          while (i++ < len)
458          {
459            if (bufline[j = start % bufsize] != bufline[++start % bufsize])
460              bufline[j] = newLine++;
461            else
462              bufline[j] = newLine;
463          }
464        }
465    
466        line = bufline[j];
467        column = bufcolumn[j];
468      }
469    
470    }
471    /* JavaCC - OriginalChecksum=f0541649ec861e8c0e746e985d46393b (do not edit this line) */