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 * 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
020package org.apache.activemq.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
027public class SimpleCharStream
028{
029/** Whether parser is static. */
030  public static final boolean staticFlag = false;
031  int bufsize;
032  int available;
033  int tokenBegin;
034/** Position in buffer. */
035  public int bufpos = -1;
036  protected int bufline[];
037  protected int bufcolumn[];
038
039  protected int column = 0;
040  protected int line = 1;
041
042  protected boolean prevCharIsCR = false;
043  protected boolean prevCharIsLF = false;
044
045  protected java.io.Reader inputStream;
046
047  protected char[] buffer;
048  protected int maxNextCharInd = 0;
049  protected int inBuf = 0;
050  protected int tabSize = 8;
051
052  protected void setTabSize(int i) { tabSize = i; }
053  protected int getTabSize(int i) { return tabSize; }
054
055
056  protected void ExpandBuff(boolean wrapAround)
057  {
058    char[] newbuffer = new char[bufsize + 2048];
059    int newbufline[] = new int[bufsize + 2048];
060    int newbufcolumn[] = new int[bufsize + 2048];
061
062    try
063    {
064      if (wrapAround)
065      {
066        System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
067        System.arraycopy(buffer, 0, newbuffer, bufsize - tokenBegin, bufpos);
068        buffer = newbuffer;
069
070        System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
071        System.arraycopy(bufline, 0, newbufline, bufsize - tokenBegin, bufpos);
072        bufline = newbufline;
073
074        System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
075        System.arraycopy(bufcolumn, 0, newbufcolumn, bufsize - tokenBegin, bufpos);
076        bufcolumn = newbufcolumn;
077
078        maxNextCharInd = (bufpos += (bufsize - tokenBegin));
079      }
080      else
081      {
082        System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
083        buffer = newbuffer;
084
085        System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
086        bufline = newbufline;
087
088        System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
089        bufcolumn = newbufcolumn;
090
091        maxNextCharInd = (bufpos -= tokenBegin);
092      }
093    }
094    catch (Throwable t)
095    {
096      throw new Error(t.getMessage());
097    }
098
099
100    bufsize += 2048;
101    available = bufsize;
102    tokenBegin = 0;
103  }
104
105  protected void FillBuff() throws java.io.IOException
106  {
107    if (maxNextCharInd == available)
108    {
109      if (available == bufsize)
110      {
111        if (tokenBegin > 2048)
112        {
113          bufpos = maxNextCharInd = 0;
114          available = tokenBegin;
115        }
116        else if (tokenBegin < 0)
117          bufpos = maxNextCharInd = 0;
118        else
119          ExpandBuff(false);
120      }
121      else if (available > tokenBegin)
122        available = bufsize;
123      else if ((tokenBegin - available) < 2048)
124        ExpandBuff(true);
125      else
126        available = tokenBegin;
127    }
128
129    int i;
130    try {
131      if ((i = inputStream.read(buffer, maxNextCharInd, available - maxNextCharInd)) == -1)
132      {
133        inputStream.close();
134        throw new java.io.IOException();
135      }
136      else
137        maxNextCharInd += i;
138      return;
139    }
140    catch(java.io.IOException e) {
141      --bufpos;
142      backup(0);
143      if (tokenBegin == -1)
144        tokenBegin = bufpos;
145      throw e;
146    }
147  }
148
149/** Start. */
150  public char BeginToken() throws java.io.IOException
151  {
152    tokenBegin = -1;
153    char c = readChar();
154    tokenBegin = bufpos;
155
156    return c;
157  }
158
159  protected void UpdateLineColumn(char c)
160  {
161    column++;
162
163    if (prevCharIsLF)
164    {
165      prevCharIsLF = false;
166      line += (column = 1);
167    }
168    else if (prevCharIsCR)
169    {
170      prevCharIsCR = false;
171      if (c == '\n')
172      {
173        prevCharIsLF = true;
174      }
175      else
176        line += (column = 1);
177    }
178
179    switch (c)
180    {
181      case '\r' :
182        prevCharIsCR = true;
183        break;
184      case '\n' :
185        prevCharIsLF = true;
186        break;
187      case '\t' :
188        column--;
189        column += (tabSize - (column % tabSize));
190        break;
191      default :
192        break;
193    }
194
195    bufline[bufpos] = line;
196    bufcolumn[bufpos] = column;
197  }
198
199/** Read a character. */
200  public char readChar() throws java.io.IOException
201  {
202    if (inBuf > 0)
203    {
204      --inBuf;
205
206      if (++bufpos == bufsize)
207        bufpos = 0;
208
209      return buffer[bufpos];
210    }
211
212    if (++bufpos >= maxNextCharInd)
213      FillBuff();
214
215    char c = buffer[bufpos];
216
217    UpdateLineColumn(c);
218    return c;
219  }
220
221  @Deprecated
222  /**
223   * @deprecated
224   * @see #getEndColumn
225   */
226
227  public int getColumn() {
228    return bufcolumn[bufpos];
229  }
230
231  @Deprecated
232  /**
233   * @deprecated
234   * @see #getEndLine
235   */
236
237  public int getLine() {
238    return bufline[bufpos];
239  }
240
241  /** Get token end column number. */
242  public int getEndColumn() {
243    return bufcolumn[bufpos];
244  }
245
246  /** Get token end line number. */
247  public int getEndLine() {
248     return bufline[bufpos];
249  }
250
251  /** Get token beginning column number. */
252  public int getBeginColumn() {
253    return bufcolumn[tokenBegin];
254  }
255
256  /** Get token beginning line number. */
257  public int getBeginLine() {
258    return bufline[tokenBegin];
259  }
260
261/** Backup a number of characters. */
262  public void backup(int amount) {
263
264    inBuf += amount;
265    if ((bufpos -= amount) < 0)
266      bufpos += bufsize;
267  }
268
269  /** Constructor. */
270  public SimpleCharStream(java.io.Reader dstream, int startline,
271  int startcolumn, int buffersize)
272  {
273    inputStream = dstream;
274    line = startline;
275    column = startcolumn - 1;
276
277    available = bufsize = buffersize;
278    buffer = new char[buffersize];
279    bufline = new int[buffersize];
280    bufcolumn = new int[buffersize];
281  }
282
283  /** Constructor. */
284  public SimpleCharStream(java.io.Reader dstream, int startline,
285                          int startcolumn)
286  {
287    this(dstream, startline, startcolumn, 4096);
288  }
289
290  /** Constructor. */
291  public SimpleCharStream(java.io.Reader dstream)
292  {
293    this(dstream, 1, 1, 4096);
294  }
295
296  /** Reinitialise. */
297  public void ReInit(java.io.Reader dstream, int startline,
298  int startcolumn, int buffersize)
299  {
300    inputStream = dstream;
301    line = startline;
302    column = startcolumn - 1;
303
304    if (buffer == null || buffersize != buffer.length)
305    {
306      available = bufsize = buffersize;
307      buffer = new char[buffersize];
308      bufline = new int[buffersize];
309      bufcolumn = new int[buffersize];
310    }
311    prevCharIsLF = prevCharIsCR = false;
312    tokenBegin = inBuf = maxNextCharInd = 0;
313    bufpos = -1;
314  }
315
316  /** Reinitialise. */
317  public void ReInit(java.io.Reader dstream, int startline,
318                     int startcolumn)
319  {
320    ReInit(dstream, startline, startcolumn, 4096);
321  }
322
323  /** Reinitialise. */
324  public void ReInit(java.io.Reader dstream)
325  {
326    ReInit(dstream, 1, 1, 4096);
327  }
328  /** Constructor. */
329  public SimpleCharStream(java.io.InputStream dstream, String encoding, int startline,
330  int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException
331  {
332    this(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize);
333  }
334
335  /** Constructor. */
336  public SimpleCharStream(java.io.InputStream dstream, int startline,
337  int startcolumn, int buffersize)
338  {
339    this(new java.io.InputStreamReader(dstream), startline, startcolumn, buffersize);
340  }
341
342  /** Constructor. */
343  public SimpleCharStream(java.io.InputStream dstream, String encoding, int startline,
344                          int startcolumn) throws java.io.UnsupportedEncodingException
345  {
346    this(dstream, encoding, startline, startcolumn, 4096);
347  }
348
349  /** Constructor. */
350  public SimpleCharStream(java.io.InputStream dstream, int startline,
351                          int startcolumn)
352  {
353    this(dstream, startline, startcolumn, 4096);
354  }
355
356  /** Constructor. */
357  public SimpleCharStream(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException
358  {
359    this(dstream, encoding, 1, 1, 4096);
360  }
361
362  /** Constructor. */
363  public SimpleCharStream(java.io.InputStream dstream)
364  {
365    this(dstream, 1, 1, 4096);
366  }
367
368  /** Reinitialise. */
369  public void ReInit(java.io.InputStream dstream, String encoding, int startline,
370                          int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException
371  {
372    ReInit(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize);
373  }
374
375  /** Reinitialise. */
376  public void ReInit(java.io.InputStream dstream, int startline,
377                          int startcolumn, int buffersize)
378  {
379    ReInit(new java.io.InputStreamReader(dstream), startline, startcolumn, buffersize);
380  }
381
382  /** Reinitialise. */
383  public void ReInit(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException
384  {
385    ReInit(dstream, encoding, 1, 1, 4096);
386  }
387
388  /** Reinitialise. */
389  public void ReInit(java.io.InputStream dstream)
390  {
391    ReInit(dstream, 1, 1, 4096);
392  }
393  /** Reinitialise. */
394  public void ReInit(java.io.InputStream dstream, String encoding, int startline,
395                     int startcolumn) throws java.io.UnsupportedEncodingException
396  {
397    ReInit(dstream, encoding, startline, startcolumn, 4096);
398  }
399  /** Reinitialise. */
400  public void ReInit(java.io.InputStream dstream, int startline,
401                     int startcolumn)
402  {
403    ReInit(dstream, startline, startcolumn, 4096);
404  }
405  /** Get token literal value. */
406  public String GetImage()
407  {
408    if (bufpos >= tokenBegin)
409      return new String(buffer, tokenBegin, bufpos - tokenBegin + 1);
410    else
411      return new String(buffer, tokenBegin, bufsize - tokenBegin) +
412                            new String(buffer, 0, bufpos + 1);
413  }
414
415  /** Get the suffix. */
416  public char[] GetSuffix(int len)
417  {
418    char[] ret = new char[len];
419
420    if ((bufpos + 1) >= len)
421      System.arraycopy(buffer, bufpos - len + 1, ret, 0, len);
422    else
423    {
424      System.arraycopy(buffer, bufsize - (len - bufpos - 1), ret, 0,
425                                                        len - bufpos - 1);
426      System.arraycopy(buffer, 0, ret, len - bufpos - 1, bufpos + 1);
427    }
428
429    return ret;
430  }
431
432  /** Reset buffer when finished. */
433  public void Done()
434  {
435    buffer = null;
436    bufline = null;
437    bufcolumn = null;
438  }
439
440  /**
441   * Method to adjust line and column numbers for the start of a token.
442   */
443  public void adjustBeginLineColumn(int newLine, int newCol)
444  {
445    int start = tokenBegin;
446    int len;
447
448    if (bufpos >= tokenBegin)
449    {
450      len = bufpos - tokenBegin + inBuf + 1;
451    }
452    else
453    {
454      len = bufsize - tokenBegin + bufpos + 1 + inBuf;
455    }
456
457    int i = 0, j = 0, k = 0;
458    int nextColDiff = 0, columnDiff = 0;
459
460    while (i < len && bufline[j = start % bufsize] == bufline[k = ++start % bufsize])
461    {
462      bufline[j] = newLine;
463      nextColDiff = columnDiff + bufcolumn[k] - bufcolumn[j];
464      bufcolumn[j] = newCol + columnDiff;
465      columnDiff = nextColDiff;
466      i++;
467    }
468
469    if (i < len)
470    {
471      bufline[j] = newLine++;
472      bufcolumn[j] = newCol + columnDiff;
473
474      while (i++ < len)
475      {
476        if (bufline[j = start % bufsize] != bufline[++start % bufsize])
477          bufline[j] = newLine++;
478        else
479          bufline[j] = newLine;
480      }
481    }
482
483    line = bufline[j];
484    column = bufcolumn[j];
485  }
486
487}
488/* JavaCC - OriginalChecksum=0d87faf7268f57eee4264d5490bb66fc (do not edit this line) */