SimpleCharStream.java
001 /* Generated By:JavaCC: Do not edit this line. SimpleCharStream.java Version 4.0 */
002 package gate.yam.parse;
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 - available2048)
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 -= amount0)
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, 114096);
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, 114096);
293   }
294   public SimpleCharStream(java.io.InputStream dstream, String encoding, int startline,
295   int startcolumn, int buffersizethrows java.io.UnsupportedEncodingException
296   {
297      this(encoding == null new java.io.InputStreamReader(dstreamnew 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 startcolumnthrows 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 encodingthrows java.io.UnsupportedEncodingException
319   {
320      this(dstream, encoding, 114096);
321   }
322 
323   public SimpleCharStream(java.io.InputStream dstream)
324   {
325      this(dstream, 114096);
326   }
327 
328   public void ReInit(java.io.InputStream dstream, String encoding, int startline,
329                           int startcolumn, int buffersizethrows java.io.UnsupportedEncodingException
330   {
331      ReInit(encoding == null new java.io.InputStreamReader(dstreamnew 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 encodingthrows java.io.UnsupportedEncodingException
341   {
342      ReInit(dstream, encoding, 114096);
343   }
344 
345   public void ReInit(java.io.InputStream dstream)
346   {
347      ReInit(dstream, 114096);
348   }
349   public void ReInit(java.io.InputStream dstream, String encoding, int startline,
350                      int startcolumnthrows 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 + + 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 }