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