KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > micronova > util > cc > html > SimpleCharStream


1 /*
2
3 Copyright 2003-2007 MicroNova (R)
4 All rights reserved.
5
6 Redistribution and use in source and binary forms, with or
7 without modification, are permitted provided that the following
8 conditions are met:
9
10     * Redistributions of source code must retain the above copyright
11     notice, this list of conditions and the following disclaimer.
12
13     * Redistributions in binary form must reproduce the above copyright
14     notice, this list of conditions and the following disclaimer in the
15     documentation and/or other materials provided with the distribution.
16
17     * Neither the name of MicroNova nor the names of its contributors
18     may be used to endorse or promote products derived from this
19     software without specific prior written permission.
20
21 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
25 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31 POSSIBILITY OF SUCH DAMAGE.
32
33 */

34
35
36 /* Generated By:JavaCC: Do not edit this line. SimpleCharStream.java Version 3.0 */
37 package com.micronova.util.cc.html;
38
39 /**
40  * An implementation of interface CharStream, where the stream is assumed to
41  * contain only ASCII characters (without unicode processing).
42  */

43
44 public class SimpleCharStream
45 {
46   public static final boolean staticFlag = false;
47   int bufsize;
48   int available;
49   int tokenBegin;
50   public int bufpos = -1;
51   protected int bufline[];
52   protected int bufcolumn[];
53
54   protected int column = 0;
55   protected int line = 1;
56
57   protected boolean prevCharIsCR = false;
58   protected boolean prevCharIsLF = false;
59
60   protected java.io.Reader JavaDoc inputStream;
61
62   protected char[] buffer;
63   protected int maxNextCharInd = 0;
64   protected int inBuf = 0;
65
66   protected void ExpandBuff(boolean wrapAround)
67   {
68      char[] newbuffer = new char[bufsize + 2048];
69      int newbufline[] = new int[bufsize + 2048];
70      int newbufcolumn[] = new int[bufsize + 2048];
71
72      try
73      {
74         if (wrapAround)
75         {
76            System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
77            System.arraycopy(buffer, 0, newbuffer,
78                                              bufsize - tokenBegin, bufpos);
79            buffer = newbuffer;
80
81            System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
82            System.arraycopy(bufline, 0, newbufline, bufsize - tokenBegin, bufpos);
83            bufline = newbufline;
84
85            System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
86            System.arraycopy(bufcolumn, 0, newbufcolumn, bufsize - tokenBegin, bufpos);
87            bufcolumn = newbufcolumn;
88
89            maxNextCharInd = (bufpos += (bufsize - tokenBegin));
90         }
91         else
92         {
93            System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
94            buffer = newbuffer;
95
96            System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
97            bufline = newbufline;
98
99            System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
100            bufcolumn = newbufcolumn;
101
102            maxNextCharInd = (bufpos -= tokenBegin);
103         }
104      }
105      catch (Throwable JavaDoc t)
106      {
107         throw new Error JavaDoc(t.getMessage());
108      }
109
110
111      bufsize += 2048;
112      available = bufsize;
113      tokenBegin = 0;
114   }
115
116   protected void FillBuff() throws java.io.IOException JavaDoc
117   {
118      if (maxNextCharInd == available)
119      {
120         if (available == bufsize)
121         {
122            if (tokenBegin > 2048)
123            {
124               bufpos = maxNextCharInd = 0;
125               available = tokenBegin;
126            }
127            else if (tokenBegin < 0)
128               bufpos = maxNextCharInd = 0;
129            else
130               ExpandBuff(false);
131         }
132         else if (available > tokenBegin)
133            available = bufsize;
134         else if ((tokenBegin - available) < 2048)
135            ExpandBuff(true);
136         else
137            available = tokenBegin;
138      }
139
140      int i;
141      try {
142         if ((i = inputStream.read(buffer, maxNextCharInd,
143                                     available - maxNextCharInd)) == -1)
144         {
145            inputStream.close();
146            throw new java.io.IOException JavaDoc();
147         }
148         else
149            maxNextCharInd += i;
150         return;
151      }
152      catch(java.io.IOException JavaDoc e) {
153         --bufpos;
154         backup(0);
155         if (tokenBegin == -1)
156            tokenBegin = bufpos;
157         throw e;
158      }
159   }
160
161   public char BeginToken() throws java.io.IOException JavaDoc
162   {
163      tokenBegin = -1;
164      char c = readChar();
165      tokenBegin = bufpos;
166
167      return c;
168   }
169
170   protected void UpdateLineColumn(char c)
171   {
172      column++;
173
174      if (prevCharIsLF)
175      {
176         prevCharIsLF = false;
177         line += (column = 1);
178      }
179      else if (prevCharIsCR)
180      {
181         prevCharIsCR = false;
182         if (c == '\n')
183         {
184            prevCharIsLF = true;
185         }
186         else
187            line += (column = 1);
188      }
189
190      switch (c)
191      {
192         case '\r' :
193            prevCharIsCR = true;
194            break;
195         case '\n' :
196            prevCharIsLF = true;
197            break;
198         case '\t' :
199            column--;
200            column += (8 - (column & 07));
201            break;
202         default :
203            break;
204      }
205
206      bufline[bufpos] = line;
207      bufcolumn[bufpos] = column;
208   }
209
210   public char readChar() throws java.io.IOException JavaDoc
211   {
212      if (inBuf > 0)
213      {
214         --inBuf;
215
216         if (++bufpos == bufsize)
217            bufpos = 0;
218
219         return buffer[bufpos];
220      }
221
222      if (++bufpos >= maxNextCharInd)
223         FillBuff();
224
225      char c = buffer[bufpos];
226
227      UpdateLineColumn(c);
228      return (c);
229   }
230
231   /**
232    * @deprecated
233    * @see #getEndColumn
234    */

235
236   public int getColumn() {
237      return bufcolumn[bufpos];
238   }
239
240   /**
241    * @deprecated
242    * @see #getEndLine
243    */

244
245   public int getLine() {
246      return bufline[bufpos];
247   }
248
249   public int getEndColumn() {
250      return bufcolumn[bufpos];
251   }
252
253   public int getEndLine() {
254      return bufline[bufpos];
255   }
256
257   public int getBeginColumn() {
258      return bufcolumn[tokenBegin];
259   }
260
261   public int getBeginLine() {
262      return bufline[tokenBegin];
263   }
264
265   public void backup(int amount) {
266
267     inBuf += amount;
268     if ((bufpos -= amount) < 0)
269        bufpos += bufsize;
270   }
271
272   public SimpleCharStream(java.io.Reader JavaDoc dstream, int startline,
273   int startcolumn, int buffersize)
274   {
275     inputStream = dstream;
276     line = startline;
277     column = startcolumn - 1;
278
279     available = bufsize = buffersize;
280     buffer = new char[buffersize];
281     bufline = new int[buffersize];
282     bufcolumn = new int[buffersize];
283   }
284
285   public SimpleCharStream(java.io.Reader JavaDoc dstream, int startline,
286                                                            int startcolumn)
287   {
288      this(dstream, startline, startcolumn, 4096);
289   }
290
291   public SimpleCharStream(java.io.Reader JavaDoc dstream)
292   {
293      this(dstream, 1, 1, 4096);
294   }
295   public void ReInit(java.io.Reader JavaDoc dstream, int startline,
296   int startcolumn, int buffersize)
297   {
298     inputStream = dstream;
299     line = startline;
300     column = startcolumn - 1;
301
302     if (buffer == null || buffersize != buffer.length)
303     {
304       available = bufsize = buffersize;
305       buffer = new char[buffersize];
306       bufline = new int[buffersize];
307       bufcolumn = new int[buffersize];
308     }
309     prevCharIsLF = prevCharIsCR = false;
310     tokenBegin = inBuf = maxNextCharInd = 0;
311     bufpos = -1;
312   }
313
314   public void ReInit(java.io.Reader JavaDoc dstream, int startline,
315                                                            int startcolumn)
316   {
317      ReInit(dstream, startline, startcolumn, 4096);
318   }
319
320   public void ReInit(java.io.Reader JavaDoc dstream)
321   {
322      ReInit(dstream, 1, 1, 4096);
323   }
324   public SimpleCharStream(java.io.InputStream JavaDoc dstream, int startline,
325   int startcolumn, int buffersize)
326   {
327      this(new java.io.InputStreamReader JavaDoc(dstream), startline, startcolumn, 4096);
328   }
329
330   public SimpleCharStream(java.io.InputStream JavaDoc dstream, int startline,
331                                                            int startcolumn)
332   {
333      this(dstream, startline, startcolumn, 4096);
334   }
335
336   public SimpleCharStream(java.io.InputStream JavaDoc dstream)
337   {
338      this(dstream, 1, 1, 4096);
339   }
340
341   public void ReInit(java.io.InputStream JavaDoc dstream, int startline,
342                           int startcolumn, int buffersize)
343   {
344      ReInit(new java.io.InputStreamReader JavaDoc(dstream), startline, startcolumn, 4096);
345   }
346
347   public void ReInit(java.io.InputStream JavaDoc dstream)
348   {
349      ReInit(dstream, 1, 1, 4096);
350   }
351   public void ReInit(java.io.InputStream JavaDoc dstream, int startline,
352                                                            int startcolumn)
353   {
354      ReInit(dstream, startline, startcolumn, 4096);
355   }
356   public String JavaDoc GetImage()
357   {
358      if (bufpos >= tokenBegin)
359         return new String JavaDoc(buffer, tokenBegin, bufpos - tokenBegin + 1);
360      else
361         return new String JavaDoc(buffer, tokenBegin, bufsize - tokenBegin) +
362                               new String JavaDoc(buffer, 0, bufpos + 1);
363   }
364
365   public char[] GetSuffix(int len)
366   {
367      char[] ret = new char[len];
368
369      if ((bufpos + 1) >= len)
370         System.arraycopy(buffer, bufpos - len + 1, ret, 0, len);
371      else
372      {
373         System.arraycopy(buffer, bufsize - (len - bufpos - 1), ret, 0,
374                                                           len - bufpos - 1);
375         System.arraycopy(buffer, 0, ret, len - bufpos - 1, bufpos + 1);
376      }
377
378      return ret;
379   }
380
381   public void Done()
382   {
383      buffer = null;
384      bufline = null;
385      bufcolumn = null;
386   }
387
388   /**
389    * Method to adjust line and column numbers for the start of a token.
390    */

391   public void adjustBeginLineColumn(int newLine, int newCol)
392   {
393      int start = tokenBegin;
394      int len;
395
396      if (bufpos >= tokenBegin)
397      {
398         len = bufpos - tokenBegin + inBuf + 1;
399      }
400      else
401      {
402         len = bufsize - tokenBegin + bufpos + 1 + inBuf;
403      }
404
405      int i = 0, j = 0, k = 0;
406      int nextColDiff = 0, columnDiff = 0;
407
408      while (i < len &&
409             bufline[j = start % bufsize] == bufline[k = ++start % bufsize])
410      {
411         bufline[j] = newLine;
412         nextColDiff = columnDiff + bufcolumn[k] - bufcolumn[j];
413         bufcolumn[j] = newCol + columnDiff;
414         columnDiff = nextColDiff;
415         i++;
416      }
417
418      if (i < len)
419      {
420         bufline[j] = newLine++;
421         bufcolumn[j] = newCol + columnDiff;
422
423         while (i++ < len)
424         {
425            if (bufline[j = start % bufsize] != bufline[++start % bufsize])
426               bufline[j] = newLine++;
427            else
428               bufline[j] = newLine;
429         }
430      }
431
432      line = bufline[j];
433      column = bufcolumn[j];
434   }
435
436 }
437
Popular Tags