001/* Generated By:JavaCC: Do not edit this line. Generic_CharStream.java Version 0.7pre6 */
002package org.w3c.flute.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
009public final class Generic_CharStream implements CharStream
010{
011  public static final boolean staticFlag = false;
012  int bufsize;
013  int available;
014  int tokenBegin;
015  public int bufpos = -1;
016  private int bufline[];
017  private int bufcolumn[];
018
019  private int column = 0;
020  private int line = 1;
021
022  private boolean prevCharIsCR = false;
023  private boolean prevCharIsLF = false;
024
025  private java.io.Reader reader;
026
027  private char[] buffer;
028  private int maxNextCharInd = 0;
029  private int inBuf = 0;
030
031  private final 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  private final 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 = reader.read(buffer, maxNextCharInd,
108                                    available - maxNextCharInd)) == -1)
109        {
110           reader.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 final char BeginToken() throws java.io.IOException
127  {
128     tokenBegin = -1;
129     char c = readChar();
130     tokenBegin = bufpos;
131
132     return c;
133  }
134
135  private final 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 final char readChar() throws java.io.IOException
176  {
177     if (inBuf > 0)
178     {
179        --inBuf;
180        return (char)((char)0xff & buffer[(bufpos == bufsize - 1) ? (bufpos = 0) : ++bufpos]);
181     }
182
183     if (++bufpos >= maxNextCharInd)
184        FillBuff();
185
186     char c = (char)((char)0xff & buffer[bufpos]);
187
188     UpdateLineColumn(c);
189     return (c);
190  }
191
192  /**
193   * @deprecated 
194   * @see #getEndColumn
195   */
196
197  public final int getColumn() {
198     return bufcolumn[bufpos];
199  }
200
201  /**
202   * @deprecated 
203   * @see #getEndLine
204   */
205
206  public final int getLine() {
207     return bufline[bufpos];
208  }
209
210  public final int getEndColumn() {
211     return bufcolumn[bufpos];
212  }
213
214  public final int getEndLine() {
215     return bufline[bufpos];
216  }
217
218  public final int getBeginColumn() {
219     return bufcolumn[tokenBegin];
220  }
221
222  public final int getBeginLine() {
223     return bufline[tokenBegin];
224  }
225
226  public final void backup(int amount) {
227
228    inBuf += amount;
229    if ((bufpos -= amount) < 0)
230       bufpos += bufsize;
231  }
232
233  public Generic_CharStream(java.io.Reader dstream, int startline,
234                            int startcolumn, int buffersize)
235  {
236    reader = dstream;
237    line = startline;
238    column = startcolumn - 1;
239
240    available = bufsize = buffersize;
241    buffer = new char[buffersize];
242    bufline = new int[buffersize];
243    bufcolumn = new int[buffersize];
244  }
245
246  public Generic_CharStream(java.io.Reader dstream, int startline,
247                            int startcolumn)
248  {
249     this(dstream, startline, startcolumn, 4096);
250  }
251  public void ReInit(java.io.Reader dstream, int startline,
252  int startcolumn, int buffersize)
253  {
254    reader = dstream;
255    line = startline;
256    column = startcolumn - 1;
257
258    if (buffer == null || buffersize != buffer.length)
259    {
260      available = bufsize = buffersize;
261      buffer = new char[buffersize];
262      bufline = new int[buffersize];
263      bufcolumn = new int[buffersize];
264    }
265    prevCharIsLF = prevCharIsCR = false;
266    tokenBegin = inBuf = maxNextCharInd = 0;
267    bufpos = -1;
268  }
269
270  public void ReInit(java.io.Reader dstream, int startline,
271                                                           int startcolumn)
272  {
273     ReInit(dstream, startline, startcolumn, 4096);
274  }
275
276  public final String GetImage()
277  {
278     if (bufpos >= tokenBegin)
279        return new String(buffer, tokenBegin, bufpos - tokenBegin + 1);
280     else
281        return new String(buffer, tokenBegin, bufsize - tokenBegin) +
282                              new String(buffer, 0, bufpos + 1);
283  }
284
285  public final char[] GetSuffix(int len)
286  {
287     char[] ret = new char[len];
288
289     if ((bufpos + 1) >= len)
290        System.arraycopy(buffer, bufpos - len + 1, ret, 0, len);
291     else
292     {
293        System.arraycopy(buffer, bufsize - (len - bufpos - 1), ret, 0,
294                                                          len - bufpos - 1);
295        System.arraycopy(buffer, 0, ret, len - bufpos - 1, bufpos + 1);
296     }
297     return ret;
298  }
299
300  public void Done()
301  {
302     buffer = null;
303     bufline = null;
304     bufcolumn = null;
305  }
306
307  /**
308   * Method to adjust line and column numbers for the start of a token.<BR>
309   */
310  public void adjustBeginLineColumn(int newLine, int newCol)
311  {
312     int start = tokenBegin;
313     int len;
314
315     if (bufpos >= tokenBegin)
316     {
317        len = bufpos - tokenBegin + inBuf + 1;
318     }
319     else
320     {
321        len = bufsize - tokenBegin + bufpos + 1 + inBuf;
322     }
323
324     int i = 0, j = 0, k = 0;
325     int nextColDiff = 0, columnDiff = 0;
326
327     while (i < len &&
328            bufline[j = start % bufsize] == bufline[k = ++start % bufsize])
329     {
330        bufline[j] = newLine;
331        nextColDiff = columnDiff + bufcolumn[k] - bufcolumn[j];
332        bufcolumn[j] = newCol + columnDiff;
333        columnDiff = nextColDiff;
334        i++;
335     } 
336
337     if (i < len)
338     {
339        bufline[j] = newLine++;
340        bufcolumn[j] = newCol + columnDiff;
341
342        while (i++ < len)
343        {
344           if (bufline[j = start % bufsize] != bufline[++start % bufsize])
345              bufline[j] = newLine++;
346           else
347              bufline[j] = newLine;
348        }
349     }
350
351     line = bufline[j];
352     column = bufcolumn[j];
353  }
354
355}