KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > python > parser > ReaderCharStream


1 package org.python.parser;
2
3 /**
4  * An implementation of interface CharStream, where the data is read from
5  * a Reader.
6  * This file started life as a copy of ASCII_CharStream.java.
7  */

8
9 public final class ReaderCharStream implements CharStream
10 {
11   public static final boolean staticFlag = false;
12   int bufsize;
13   int available;
14   int tokenBegin;
15   public int bufpos = -1;
16   private int bufline[];
17   private int bufcolumn[];
18
19   private int column = 0;
20   private int line = 1;
21
22   private boolean prevCharIsCR = false;
23   private boolean prevCharIsLF = false;
24
25   private java.io.Reader JavaDoc inputStream;
26
27   private char[] buffer;
28   private int maxNextCharInd = 0;
29   private int inBuf = 0;
30
31   private final void ExpandBuff(boolean wrapAround)
32   {
33      char[] newbuffer = new char[bufsize + 2048];
34      int newbufline[] = new int[bufsize + 2048];
35      int newbufcolumn[] = new int[bufsize + 2048];
36
37      try
38      {
39         if (wrapAround)
40         {
41            System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
42            System.arraycopy(buffer, 0, newbuffer,
43                                              bufsize - tokenBegin, bufpos);
44            buffer = newbuffer;
45
46            System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
47            System.arraycopy(bufline, 0, newbufline, bufsize - tokenBegin, bufpos);
48            bufline = newbufline;
49
50            System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
51            System.arraycopy(bufcolumn, 0, newbufcolumn, bufsize - tokenBegin, bufpos);
52            bufcolumn = newbufcolumn;
53
54            maxNextCharInd = (bufpos += (bufsize - tokenBegin));
55         }
56         else
57         {
58            System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
59            buffer = newbuffer;
60
61            System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
62            bufline = newbufline;
63
64            System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
65            bufcolumn = newbufcolumn;
66
67            maxNextCharInd = (bufpos -= tokenBegin);
68         }
69      }
70      catch (Throwable JavaDoc t)
71      {
72         throw new Error JavaDoc(t.getMessage());
73      }
74
75
76      bufsize += 2048;
77      available = bufsize;
78      tokenBegin = 0;
79   }
80
81   private final void FillBuff() throws java.io.IOException JavaDoc
82   {
83      if (maxNextCharInd == available)
84      {
85         if (available == bufsize)
86         {
87            if (tokenBegin > 2048)
88            {
89               bufpos = maxNextCharInd = 0;
90               available = tokenBegin;
91            }
92            else if (tokenBegin < 0)
93               bufpos = maxNextCharInd = 0;
94            else
95               ExpandBuff(false);
96         }
97         else if (available > tokenBegin)
98            available = bufsize;
99         else if ((tokenBegin - available) < 2048)
100            ExpandBuff(true);
101         else
102            available = tokenBegin;
103      }
104
105      int i;
106      try {
107         if ((i = inputStream.read(buffer, maxNextCharInd,
108                                     available - maxNextCharInd)) == -1)
109         {
110            inputStream.close();
111            throw new java.io.IOException JavaDoc();
112         }
113         else
114            maxNextCharInd += i;
115         return;
116      }
117      catch(java.io.IOException JavaDoc 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 JavaDoc
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 JavaDoc
176   {
177      if (inBuf > 0)
178      {
179         --inBuf;
180         return buffer[(bufpos == bufsize - 1) ? (bufpos = 0) : ++bufpos];
181      }
182
183      if (++bufpos >= maxNextCharInd)
184         FillBuff();
185
186      char c = 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 ReaderCharStream(java.io.Reader JavaDoc dstream)
234   {
235     inputStream = dstream;
236     line = 1;
237     column = 0;
238
239     available = bufsize = 4096;
240     buffer = new char[bufsize];
241     bufline = new int[bufsize];
242     bufcolumn = new int[bufsize];
243   }
244
245   public final String JavaDoc GetImage()
246   {
247      if (bufpos >= tokenBegin)
248         return new String JavaDoc(buffer, tokenBegin, bufpos - tokenBegin + 1);
249      else
250         return new String JavaDoc(buffer, tokenBegin, bufsize - tokenBegin) +
251                               new String JavaDoc(buffer, 0, bufpos + 1);
252   }
253
254   public final char[] GetSuffix(int len)
255   {
256      char[] ret = new char[len];
257
258      if ((bufpos + 1) >= len)
259         System.arraycopy(buffer, bufpos - len + 1, ret, 0, len);
260      else
261      {
262         System.arraycopy(buffer, bufsize - (len - bufpos - 1), ret, 0,
263                                                           len - bufpos - 1);
264         System.arraycopy(buffer, 0, ret, len - bufpos - 1, bufpos + 1);
265      }
266
267      return ret;
268   }
269
270   public void Done()
271   {
272      buffer = null;
273      bufline = null;
274      bufcolumn = null;
275   }
276
277   /**
278    * Method to adjust line and column numbers for the start of a token.<BR>
279    */

280   public void adjustBeginLineColumn(int newLine, int newCol)
281   {
282      int start = tokenBegin;
283      int len;
284
285      if (bufpos >= tokenBegin)
286      {
287         len = bufpos - tokenBegin + inBuf + 1;
288      }
289      else
290      {
291         len = bufsize - tokenBegin + bufpos + 1 + inBuf;
292      }
293
294      int i = 0, j = 0, k = 0;
295      int nextColDiff = 0, columnDiff = 0;
296
297      while (i < len &&
298             bufline[j = start % bufsize] == bufline[k = ++start % bufsize])
299      {
300         bufline[j] = newLine;
301         nextColDiff = columnDiff + bufcolumn[k] - bufcolumn[j];
302         bufcolumn[j] = newCol + columnDiff;
303         columnDiff = nextColDiff;
304         i++;
305      }
306
307      if (i < len)
308      {
309         bufline[j] = newLine++;
310         bufcolumn[j] = newCol + columnDiff;
311
312         while (i++ < len)
313         {
314            if (bufline[j = start % bufsize] != bufline[++start % bufsize])
315               bufline[j] = newLine++;
316            else
317               bufline[j] = newLine;
318         }
319      }
320
321      line = bufline[j];
322      column = bufcolumn[j];
323   }
324
325 }
326
Popular Tags