001/* Generated By:JavaCC: Do not edit this line. SimpleCharStream.java Version 5.0 */
002/* JavaCCOptions:STATIC=false,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */
003package mondrian.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
010public 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=e1e2aaa1e05b9dcbb7c0f35015fd15ad (do not edit this line) */