PageRenderTime 110ms CodeModel.GetById 43ms app.highlight 57ms RepoModel.GetById 1ms app.codeStats 1ms

/jEdit/tags/jedit-4-3-pre5/bsh/JavaCharStream.java

#
Java | 547 lines | 447 code | 82 blank | 18 comment | 60 complexity | a486501085bee7d5e819cd0a943015eb MD5 | raw file
  1/* Generated By:JavaCC: Do not edit this line. JavaCharStream.java Version 3.0 */
  2package bsh;
  3
  4/**
  5 * An implementation of interface CharStream, where the stream is assumed to
  6 * contain only ASCII characters (with java-like unicode escape processing).
  7 */
  8
  9public class JavaCharStream
 10{
 11  public static final boolean staticFlag = false;
 12  static final int hexval(char c) throws java.io.IOException {
 13    switch(c)
 14    {
 15       case '0' :
 16          return 0;
 17       case '1' :
 18          return 1;
 19       case '2' :
 20          return 2;
 21       case '3' :
 22          return 3;
 23       case '4' :
 24          return 4;
 25       case '5' :
 26          return 5;
 27       case '6' :
 28          return 6;
 29       case '7' :
 30          return 7;
 31       case '8' :
 32          return 8;
 33       case '9' :
 34          return 9;
 35
 36       case 'a' :
 37       case 'A' :
 38          return 10;
 39       case 'b' :
 40       case 'B' :
 41          return 11;
 42       case 'c' :
 43       case 'C' :
 44          return 12;
 45       case 'd' :
 46       case 'D' :
 47          return 13;
 48       case 'e' :
 49       case 'E' :
 50          return 14;
 51       case 'f' :
 52       case 'F' :
 53          return 15;
 54    }
 55
 56    throw new java.io.IOException(); // Should never come here
 57  }
 58
 59  public int bufpos = -1;
 60  int bufsize;
 61  int available;
 62  int tokenBegin;
 63  protected int bufline[];
 64  protected int bufcolumn[];
 65
 66  protected int column = 0;
 67  protected int line = 1;
 68
 69  protected boolean prevCharIsCR = false;
 70  protected boolean prevCharIsLF = false;
 71
 72  protected java.io.Reader inputStream;
 73
 74  protected char[] nextCharBuf;
 75  protected char[] buffer;
 76  protected int maxNextCharInd = 0;
 77  protected int nextCharInd = -1;
 78  protected int inBuf = 0;
 79
 80  protected void ExpandBuff(boolean wrapAround)
 81  {
 82     char[] newbuffer = new char[bufsize + 2048];
 83     int newbufline[] = new int[bufsize + 2048];
 84     int newbufcolumn[] = new int[bufsize + 2048];
 85
 86     try
 87     {
 88        if (wrapAround)
 89        {
 90           System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
 91           System.arraycopy(buffer, 0, newbuffer,
 92                                             bufsize - tokenBegin, bufpos);
 93           buffer = newbuffer;
 94
 95           System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
 96           System.arraycopy(bufline, 0, newbufline, bufsize - tokenBegin, bufpos);
 97           bufline = newbufline;
 98
 99           System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
100           System.arraycopy(bufcolumn, 0, newbufcolumn, bufsize - tokenBegin, bufpos);
101           bufcolumn = newbufcolumn;
102
103           bufpos += (bufsize - tokenBegin);
104        }
105        else
106        {
107           System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
108           buffer = newbuffer;
109
110           System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
111           bufline = newbufline;
112
113           System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
114           bufcolumn = newbufcolumn;
115
116           bufpos -= tokenBegin;
117        }
118     }
119     catch (Throwable t)
120     {
121        throw new Error(t.getMessage());
122     }
123
124     available = (bufsize += 2048);
125     tokenBegin = 0;
126  }
127
128  protected void FillBuff() throws java.io.IOException
129  {
130     int i;
131     if (maxNextCharInd == 4096)
132        maxNextCharInd = nextCharInd = 0;
133
134     try {
135        if ((i = inputStream.read(nextCharBuf, maxNextCharInd,
136                                            4096 - maxNextCharInd)) == -1)
137        {
138           inputStream.close();
139           throw new java.io.IOException();
140        }
141        else
142           maxNextCharInd += i;
143        return;
144     }
145     catch(java.io.IOException e) {
146        if (bufpos != 0)
147        {
148           --bufpos;
149           backup(0);
150        }
151        else
152        {
153           bufline[bufpos] = line;
154           bufcolumn[bufpos] = column;
155        }
156        throw e;
157     }
158  }
159
160  protected char ReadByte() throws java.io.IOException
161  {
162     if (++nextCharInd >= maxNextCharInd)
163        FillBuff();
164
165     return nextCharBuf[nextCharInd];
166  }
167
168  public char BeginToken() throws java.io.IOException
169  {     
170     if (inBuf > 0)
171     {
172        --inBuf;
173
174        if (++bufpos == bufsize)
175           bufpos = 0;
176
177        tokenBegin = bufpos;
178        return buffer[bufpos];
179     }
180
181     tokenBegin = 0;
182     bufpos = -1;
183
184     return readChar();
185  }     
186
187  protected void AdjustBuffSize()
188  {
189     if (available == bufsize)
190     {
191        if (tokenBegin > 2048)
192        {
193           bufpos = 0;
194           available = tokenBegin;
195        }
196        else
197           ExpandBuff(false);
198     }
199     else if (available > tokenBegin)
200        available = bufsize;
201     else if ((tokenBegin - available) < 2048)
202        ExpandBuff(true);
203     else
204        available = tokenBegin;
205  }
206
207  protected void UpdateLineColumn(char c)
208  {
209     column++;
210
211     if (prevCharIsLF)
212     {
213        prevCharIsLF = false;
214        line += (column = 1);
215     }
216     else if (prevCharIsCR)
217     {
218        prevCharIsCR = false;
219        if (c == '\n')
220        {
221           prevCharIsLF = true;
222        }
223        else
224           line += (column = 1);
225     }
226
227     switch (c)
228     {
229        case '\r' :
230           prevCharIsCR = true;
231           break;
232        case '\n' :
233           prevCharIsLF = true;
234           break;
235        case '\t' :
236           column--;
237           column += (8 - (column & 07));
238           break;
239        default :
240           break;
241     }
242
243     bufline[bufpos] = line;
244     bufcolumn[bufpos] = column;
245  }
246
247  public char readChar() throws java.io.IOException
248  {
249     if (inBuf > 0)
250     {
251        --inBuf;
252
253        if (++bufpos == bufsize)
254           bufpos = 0;
255
256        return buffer[bufpos];
257     }
258
259     char c;
260
261     if (++bufpos == available)
262        AdjustBuffSize();
263
264     if ((buffer[bufpos] = c = ReadByte()) == '\\')
265     {
266        UpdateLineColumn(c);
267
268        int backSlashCnt = 1;
269
270        for (;;) // Read all the backslashes
271        {
272           if (++bufpos == available)
273              AdjustBuffSize();
274
275           try
276           {
277              if ((buffer[bufpos] = c = ReadByte()) != '\\')
278              {
279                 UpdateLineColumn(c);
280                 // found a non-backslash char.
281                 if ((c == 'u') && ((backSlashCnt & 1) == 1))
282                 {
283                    if (--bufpos < 0)
284                       bufpos = bufsize - 1;
285
286                    break;
287                 }
288
289                 backup(backSlashCnt);
290                 return '\\';
291              }
292           }
293           catch(java.io.IOException e)
294           {
295              if (backSlashCnt > 1)
296                 backup(backSlashCnt);
297
298              return '\\';
299           }
300
301           UpdateLineColumn(c);
302           backSlashCnt++;
303        }
304
305        // Here, we have seen an odd number of backslash's followed by a 'u'
306        try
307        {
308           while ((c = ReadByte()) == 'u')
309              ++column;
310
311           buffer[bufpos] = c = (char)(hexval(c) << 12 |
312                                       hexval(ReadByte()) << 8 |
313                                       hexval(ReadByte()) << 4 |
314                                       hexval(ReadByte()));
315
316           column += 4;
317        }
318        catch(java.io.IOException e)
319        {
320           throw new Error("Invalid escape character at line " + line +
321                                         " column " + column + ".");
322        }
323
324        if (backSlashCnt == 1)
325           return c;
326        else
327        {
328           backup(backSlashCnt - 1);
329           return '\\';
330        }
331     }
332     else
333     {
334        UpdateLineColumn(c);
335        return (c);
336     }
337  }
338
339  /**
340   * @deprecated 
341   * @see #getEndColumn
342   */
343
344  public int getColumn() {
345     return bufcolumn[bufpos];
346  }
347
348  /**
349   * @deprecated 
350   * @see #getEndLine
351   */
352
353  public int getLine() {
354     return bufline[bufpos];
355  }
356
357  public int getEndColumn() {
358     return bufcolumn[bufpos];
359  }
360
361  public int getEndLine() {
362     return bufline[bufpos];
363  }
364
365  public int getBeginColumn() {
366     return bufcolumn[tokenBegin];
367  }
368
369  public int getBeginLine() {
370     return bufline[tokenBegin];
371  }
372
373  public void backup(int amount) {
374
375    inBuf += amount;
376    if ((bufpos -= amount) < 0)
377       bufpos += bufsize;
378  }
379
380  public JavaCharStream(java.io.Reader dstream,
381                 int startline, int startcolumn, int buffersize)
382  {
383    inputStream = dstream;
384    line = startline;
385    column = startcolumn - 1;
386
387    available = bufsize = buffersize;
388    buffer = new char[buffersize];
389    bufline = new int[buffersize];
390    bufcolumn = new int[buffersize];
391    nextCharBuf = new char[4096];
392  }
393
394  public JavaCharStream(java.io.Reader dstream,
395                                        int startline, int startcolumn)
396  {
397     this(dstream, startline, startcolumn, 4096);
398  }
399
400  public JavaCharStream(java.io.Reader dstream)
401  {
402     this(dstream, 1, 1, 4096);
403  }
404  public void ReInit(java.io.Reader dstream,
405                 int startline, int startcolumn, int buffersize)
406  {
407    inputStream = dstream;
408    line = startline;
409    column = startcolumn - 1;
410
411    if (buffer == null || buffersize != buffer.length)
412    {
413      available = bufsize = buffersize;
414      buffer = new char[buffersize];
415      bufline = new int[buffersize];
416      bufcolumn = new int[buffersize];
417      nextCharBuf = new char[4096];
418    }
419    prevCharIsLF = prevCharIsCR = false;
420    tokenBegin = inBuf = maxNextCharInd = 0;
421    nextCharInd = bufpos = -1;
422  }
423
424  public void ReInit(java.io.Reader dstream,
425                                        int startline, int startcolumn)
426  {
427     ReInit(dstream, startline, startcolumn, 4096);
428  }
429
430  public void ReInit(java.io.Reader dstream)
431  {
432     ReInit(dstream, 1, 1, 4096);
433  }
434  public JavaCharStream(java.io.InputStream dstream, int startline,
435  int startcolumn, int buffersize)
436  {
437     this(new java.io.InputStreamReader(dstream), startline, startcolumn, 4096);
438  }
439
440  public JavaCharStream(java.io.InputStream dstream, int startline,
441                                                           int startcolumn)
442  {
443     this(dstream, startline, startcolumn, 4096);
444  }
445
446  public JavaCharStream(java.io.InputStream dstream)
447  {
448     this(dstream, 1, 1, 4096);
449  }
450
451  public void ReInit(java.io.InputStream dstream, int startline,
452  int startcolumn, int buffersize)
453  {
454     ReInit(new java.io.InputStreamReader(dstream), startline, startcolumn, 4096);
455  }
456  public void ReInit(java.io.InputStream dstream, int startline,
457                                                           int startcolumn)
458  {
459     ReInit(dstream, startline, startcolumn, 4096);
460  }
461  public void ReInit(java.io.InputStream dstream)
462  {
463     ReInit(dstream, 1, 1, 4096);
464  }
465
466  public String GetImage()
467  {
468     if (bufpos >= tokenBegin)
469        return new String(buffer, tokenBegin, bufpos - tokenBegin + 1);
470     else
471        return new String(buffer, tokenBegin, bufsize - tokenBegin) +
472                              new String(buffer, 0, bufpos + 1);
473  }
474
475  public char[] GetSuffix(int len)
476  {
477     char[] ret = new char[len];
478
479     if ((bufpos + 1) >= len)
480        System.arraycopy(buffer, bufpos - len + 1, ret, 0, len);
481     else
482     {
483        System.arraycopy(buffer, bufsize - (len - bufpos - 1), ret, 0,
484                                                          len - bufpos - 1);
485        System.arraycopy(buffer, 0, ret, len - bufpos - 1, bufpos + 1);
486     }
487
488     return ret;
489  }
490
491  public void Done()
492  {
493     nextCharBuf = null;
494     buffer = null;
495     bufline = null;
496     bufcolumn = null;
497  }
498
499  /**
500   * Method to adjust line and column numbers for the start of a token.<BR>
501   */
502  public void adjustBeginLineColumn(int newLine, int newCol)
503  {
504     int start = tokenBegin;
505     int len;
506
507     if (bufpos >= tokenBegin)
508     {
509        len = bufpos - tokenBegin + inBuf + 1;
510     }
511     else
512     {
513        len = bufsize - tokenBegin + bufpos + 1 + inBuf;
514     }
515
516     int i = 0, j = 0, k = 0;
517     int nextColDiff = 0, columnDiff = 0;
518
519     while (i < len &&
520            bufline[j = start % bufsize] == bufline[k = ++start % bufsize])
521     {
522        bufline[j] = newLine;
523        nextColDiff = columnDiff + bufcolumn[k] - bufcolumn[j];
524        bufcolumn[j] = newCol + columnDiff;
525        columnDiff = nextColDiff;
526        i++;
527     } 
528
529     if (i < len)
530     {
531        bufline[j] = newLine++;
532        bufcolumn[j] = newCol + columnDiff;
533
534        while (i++ < len)
535        {
536           if (bufline[j = start % bufsize] != bufline[++start % bufsize])
537              bufline[j] = newLine++;
538           else
539              bufline[j] = newLine;
540        }
541     }
542
543     line = bufline[j];
544     column = bufcolumn[j];
545  }
546
547}