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