    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=ef20f44987097f1f0817618b012c6903 (do not edit this line) */