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