001    /* Generated By:JavaCC: Do not edit this line. SimpleCharStream.java Version 4.0 */
002    /**
003     *
004     * Licensed to the Apache Software Foundation (ASF) under one or more
005     * contributor license agreements.  See the NOTICE file distributed with
006     * this work for additional information regarding copyright ownership.
007     * The ASF licenses this file to You under the Apache License, Version 2.0
008     * (the "License"); you may not use this file except in compliance with
009     * the License.  You may obtain a copy of the License at
010     *
011     * http://www.apache.org/licenses/LICENSE-2.0
012     *
013     * Unless required by applicable law or agreed to in writing, software
014     * distributed under the License is distributed on an "AS IS" BASIS,
015     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
016     * See the License for the specific language governing permissions and
017     * limitations under the License.
018     */
019    
020    package org.granite.gravity.selector;
021    
022    /**
023     * An implementation of interface CharStream, where the stream is assumed to
024     * contain only ASCII characters (without unicode processing).
025     */
026    
027    public class SimpleCharStream
028    {
029      public static final boolean staticFlag = false;
030      int bufsize;
031      int available;
032      int tokenBegin;
033      public int bufpos = -1;
034      protected int bufline[];
035      protected int bufcolumn[];
036    
037      protected int column = 0;
038      protected int line = 1;
039    
040      protected boolean prevCharIsCR = false;
041      protected boolean prevCharIsLF = false;
042    
043      protected java.io.Reader inputStream;
044    
045      protected char[] buffer;
046      protected int maxNextCharInd = 0;
047      protected int inBuf = 0;
048      protected int tabSize = 8;
049    
050      protected void setTabSize(int i) { tabSize = i; }
051      protected int getTabSize(int i) { return tabSize; }
052    
053    
054      protected void ExpandBuff(boolean wrapAround)
055      {
056         char[] newbuffer = new char[bufsize + 2048];
057         int newbufline[] = new int[bufsize + 2048];
058         int newbufcolumn[] = new int[bufsize + 2048];
059    
060         try
061         {
062            if (wrapAround)
063            {
064               System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
065               System.arraycopy(buffer, 0, newbuffer,
066                                                 bufsize - tokenBegin, bufpos);
067               buffer = newbuffer;
068    
069               System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
070               System.arraycopy(bufline, 0, newbufline, bufsize - tokenBegin, bufpos);
071               bufline = newbufline;
072    
073               System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
074               System.arraycopy(bufcolumn, 0, newbufcolumn, bufsize - tokenBegin, bufpos);
075               bufcolumn = newbufcolumn;
076    
077               maxNextCharInd = (bufpos += (bufsize - tokenBegin));
078            }
079            else
080            {
081               System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
082               buffer = newbuffer;
083    
084               System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
085               bufline = newbufline;
086    
087               System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
088               bufcolumn = newbufcolumn;
089    
090               maxNextCharInd = (bufpos -= tokenBegin);
091            }
092         }
093         catch (Throwable t)
094         {
095            throw new Error(t.getMessage());
096         }
097    
098    
099         bufsize += 2048;
100         available = bufsize;
101         tokenBegin = 0;
102      }
103    
104      protected void FillBuff() throws java.io.IOException
105      {
106         if (maxNextCharInd == available)
107         {
108            if (available == bufsize)
109            {
110               if (tokenBegin > 2048)
111               {
112                  bufpos = maxNextCharInd = 0;
113                  available = tokenBegin;
114               }
115               else if (tokenBegin < 0)
116                  bufpos = maxNextCharInd = 0;
117               else
118                  ExpandBuff(false);
119            }
120            else if (available > tokenBegin)
121               available = bufsize;
122            else if ((tokenBegin - available) < 2048)
123               ExpandBuff(true);
124            else
125               available = tokenBegin;
126         }
127    
128         int i;
129         try {
130            if ((i = inputStream.read(buffer, maxNextCharInd,
131                                        available - maxNextCharInd)) == -1)
132            {
133               inputStream.close();
134               throw new java.io.IOException();
135            }
136            maxNextCharInd += i;
137            return;
138         }
139         catch(java.io.IOException e) {
140            --bufpos;
141            backup(0);
142            if (tokenBegin == -1)
143               tokenBegin = bufpos;
144            throw e;
145         }
146      }
147    
148      public char BeginToken() throws java.io.IOException
149      {
150         tokenBegin = -1;
151         char c = readChar();
152         tokenBegin = bufpos;
153    
154         return c;
155      }
156    
157      protected void UpdateLineColumn(char c)
158      {
159         column++;
160    
161         if (prevCharIsLF)
162         {
163            prevCharIsLF = false;
164            line += (column = 1);
165         }
166         else if (prevCharIsCR)
167         {
168            prevCharIsCR = false;
169            if (c == '\n')
170            {
171               prevCharIsLF = true;
172            }
173            else
174               line += (column = 1);
175         }
176    
177         switch (c)
178         {
179            case '\r' :
180               prevCharIsCR = true;
181               break;
182            case '\n' :
183               prevCharIsLF = true;
184               break;
185            case '\t' :
186               column--;
187               column += (tabSize - (column % tabSize));
188               break;
189            default :
190               break;
191         }
192    
193         bufline[bufpos] = line;
194         bufcolumn[bufpos] = column;
195      }
196    
197      public char readChar() throws java.io.IOException
198      {
199         if (inBuf > 0)
200         {
201            --inBuf;
202    
203            if (++bufpos == bufsize)
204               bufpos = 0;
205    
206            return buffer[bufpos];
207         }
208    
209         if (++bufpos >= maxNextCharInd)
210            FillBuff();
211    
212         char c = buffer[bufpos];
213    
214         UpdateLineColumn(c);
215         return (c);
216      }
217    
218      /**
219       * @deprecated
220       * @see #getEndColumn
221       */
222    
223      @SuppressWarnings("dep-ann")
224    public int getColumn() {
225         return bufcolumn[bufpos];
226      }
227    
228      /**
229       * @deprecated
230       * @see #getEndLine
231       */
232    
233      @SuppressWarnings("dep-ann")
234    public int getLine() {
235         return bufline[bufpos];
236      }
237    
238      public int getEndColumn() {
239         return bufcolumn[bufpos];
240      }
241    
242      public int getEndLine() {
243         return bufline[bufpos];
244      }
245    
246      public int getBeginColumn() {
247         return bufcolumn[tokenBegin];
248      }
249    
250      public int getBeginLine() {
251         return bufline[tokenBegin];
252      }
253    
254      public void backup(int amount) {
255    
256        inBuf += amount;
257        if ((bufpos -= amount) < 0)
258           bufpos += bufsize;
259      }
260    
261      public SimpleCharStream(java.io.Reader dstream, int startline,
262      int startcolumn, int buffersize)
263      {
264        inputStream = dstream;
265        line = startline;
266        column = startcolumn - 1;
267    
268        available = bufsize = buffersize;
269        buffer = new char[buffersize];
270        bufline = new int[buffersize];
271        bufcolumn = new int[buffersize];
272      }
273    
274      public SimpleCharStream(java.io.Reader dstream, int startline,
275                              int startcolumn)
276      {
277         this(dstream, startline, startcolumn, 4096);
278      }
279    
280      public SimpleCharStream(java.io.Reader dstream)
281      {
282         this(dstream, 1, 1, 4096);
283      }
284      public void ReInit(java.io.Reader dstream, int startline,
285      int startcolumn, int buffersize)
286      {
287        inputStream = dstream;
288        line = startline;
289        column = startcolumn - 1;
290    
291        if (buffer == null || buffersize != buffer.length)
292        {
293          available = bufsize = buffersize;
294          buffer = new char[buffersize];
295          bufline = new int[buffersize];
296          bufcolumn = new int[buffersize];
297        }
298        prevCharIsLF = prevCharIsCR = false;
299        tokenBegin = inBuf = maxNextCharInd = 0;
300        bufpos = -1;
301      }
302    
303      public void ReInit(java.io.Reader dstream, int startline,
304                         int startcolumn)
305      {
306         ReInit(dstream, startline, startcolumn, 4096);
307      }
308    
309      public void ReInit(java.io.Reader dstream)
310      {
311         ReInit(dstream, 1, 1, 4096);
312      }
313      public SimpleCharStream(java.io.InputStream dstream, String encoding, int startline,
314      int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException
315      {
316         this(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize);
317      }
318    
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      public SimpleCharStream(java.io.InputStream dstream, String encoding, int startline,
326                              int startcolumn) throws java.io.UnsupportedEncodingException
327      {
328         this(dstream, encoding, startline, startcolumn, 4096);
329      }
330    
331      public SimpleCharStream(java.io.InputStream dstream, int startline,
332                              int startcolumn)
333      {
334         this(dstream, startline, startcolumn, 4096);
335      }
336    
337      public SimpleCharStream(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException
338      {
339         this(dstream, encoding, 1, 1, 4096);
340      }
341    
342      public SimpleCharStream(java.io.InputStream dstream)
343      {
344         this(dstream, 1, 1, 4096);
345      }
346    
347      public void ReInit(java.io.InputStream dstream, String encoding, int startline,
348                              int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException
349      {
350         ReInit(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize);
351      }
352    
353      public void ReInit(java.io.InputStream dstream, int startline,
354                              int startcolumn, int buffersize)
355      {
356         ReInit(new java.io.InputStreamReader(dstream), startline, startcolumn, buffersize);
357      }
358    
359      public void ReInit(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException
360      {
361         ReInit(dstream, encoding, 1, 1, 4096);
362      }
363    
364      public void ReInit(java.io.InputStream dstream)
365      {
366         ReInit(dstream, 1, 1, 4096);
367      }
368      public void ReInit(java.io.InputStream dstream, String encoding, int startline,
369                         int startcolumn) throws java.io.UnsupportedEncodingException
370      {
371         ReInit(dstream, encoding, startline, startcolumn, 4096);
372      }
373      public void ReInit(java.io.InputStream dstream, int startline,
374                         int startcolumn)
375      {
376         ReInit(dstream, startline, startcolumn, 4096);
377      }
378      public String GetImage()
379      {
380         if (bufpos >= tokenBegin)
381            return new String(buffer, tokenBegin, bufpos - tokenBegin + 1);
382         return new String(buffer, tokenBegin, bufsize - tokenBegin) +
383                                  new String(buffer, 0, bufpos + 1);
384      }
385    
386      public char[] GetSuffix(int len)
387      {
388         char[] ret = new char[len];
389    
390         if ((bufpos + 1) >= len)
391            System.arraycopy(buffer, bufpos - len + 1, ret, 0, len);
392         else
393         {
394            System.arraycopy(buffer, bufsize - (len - bufpos - 1), ret, 0,
395                                                              len - bufpos - 1);
396            System.arraycopy(buffer, 0, ret, len - bufpos - 1, bufpos + 1);
397         }
398    
399         return ret;
400      }
401    
402      public void Done()
403      {
404         buffer = null;
405         bufline = null;
406         bufcolumn = null;
407      }
408    
409      /**
410       * Method to adjust line and column numbers for the start of a token.
411       */
412      public void adjustBeginLineColumn(int newLine, int newCol)
413      {
414         int start = tokenBegin;
415         int len;
416    
417         if (bufpos >= tokenBegin)
418         {
419            len = bufpos - tokenBegin + inBuf + 1;
420         }
421         else
422         {
423            len = bufsize - tokenBegin + bufpos + 1 + inBuf;
424         }
425    
426         int i = 0, j = 0, k = 0;
427         int nextColDiff = 0, columnDiff = 0;
428    
429         while (i < len &&
430                bufline[j = start % bufsize] == bufline[k = ++start % bufsize])
431         {
432            bufline[j] = newLine;
433            nextColDiff = columnDiff + bufcolumn[k] - bufcolumn[j];
434            bufcolumn[j] = newCol + columnDiff;
435            columnDiff = nextColDiff;
436            i++;
437         }
438    
439         if (i < len)
440         {
441            bufline[j] = newLine++;
442            bufcolumn[j] = newCol + columnDiff;
443    
444            while (i++ < len)
445            {
446               if (bufline[j = start % bufsize] != bufline[++start % bufsize])
447                  bufline[j] = newLine++;
448               else
449                  bufline[j] = newLine;
450            }
451         }
452    
453         line = bufline[j];
454         column = bufcolumn[j];
455      }
456    
457    }