1:
2: package ;
3:
4:
8:
9: public final class Generic_CharStream 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 reader;
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 t)
71: {
72: throw new Error(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
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 = reader.read(buffer, maxNextCharInd,
108: available - maxNextCharInd)) == -1)
109: {
110: reader.close();
111: throw new java.io.IOException();
112: }
113: else
114: maxNextCharInd += i;
115: return;
116: }
117: catch(java.io.IOException 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
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
176: {
177: if (inBuf > 0)
178: {
179: --inBuf;
180: return (char)((char)0xff & buffer[(bufpos == bufsize - 1) ? (bufpos = 0) : ++bufpos]);
181: }
182:
183: if (++bufpos >= maxNextCharInd)
184: FillBuff();
185:
186: char c = (char)((char)0xff & buffer[bufpos]);
187:
188: UpdateLineColumn(c);
189: return (c);
190: }
191:
192:
196:
197: public final int getColumn() {
198: return bufcolumn[bufpos];
199: }
200:
201:
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 Generic_CharStream(java.io.Reader dstream, int startline,
234: int startcolumn, int buffersize)
235: {
236: reader = dstream;
237: line = startline;
238: column = startcolumn - 1;
239:
240: available = bufsize = buffersize;
241: buffer = new char[buffersize];
242: bufline = new int[buffersize];
243: bufcolumn = new int[buffersize];
244: }
245:
246: public Generic_CharStream(java.io.Reader dstream, int startline,
247: int startcolumn)
248: {
249: this(dstream, startline, startcolumn, 4096);
250: }
251: public void ReInit(java.io.Reader dstream, int startline,
252: int startcolumn, int buffersize)
253: {
254: reader = dstream;
255: line = startline;
256: column = startcolumn - 1;
257:
258: if (buffer == null || buffersize != buffer.length)
259: {
260: available = bufsize = buffersize;
261: buffer = new char[buffersize];
262: bufline = new int[buffersize];
263: bufcolumn = new int[buffersize];
264: }
265: prevCharIsLF = prevCharIsCR = false;
266: tokenBegin = inBuf = maxNextCharInd = 0;
267: bufpos = -1;
268: }
269:
270: public void ReInit(java.io.Reader dstream, int startline,
271: int startcolumn)
272: {
273: ReInit(dstream, startline, startcolumn, 4096);
274: }
275:
276: public final String GetImage()
277: {
278: if (bufpos >= tokenBegin)
279: return new String(buffer, tokenBegin, bufpos - tokenBegin + 1);
280: else
281: return new String(buffer, tokenBegin, bufsize - tokenBegin) +
282: new String(buffer, 0, bufpos + 1);
283: }
284:
285: public final char[] GetSuffix(int len)
286: {
287: char[] ret = new char[len];
288:
289: if ((bufpos + 1) >= len)
290: System.arraycopy(buffer, bufpos - len + 1, ret, 0, len);
291: else
292: {
293: System.arraycopy(buffer, bufsize - (len - bufpos - 1), ret, 0,
294: len - bufpos - 1);
295: System.arraycopy(buffer, 0, ret, len - bufpos - 1, bufpos + 1);
296: }
297: return ret;
298: }
299:
300: public void Done()
301: {
302: buffer = null;
303: bufline = null;
304: bufcolumn = null;
305: }
306:
307:
310: public void adjustBeginLineColumn(int newLine, int newCol)
311: {
312: int start = tokenBegin;
313: int len;
314:
315: if (bufpos >= tokenBegin)
316: {
317: len = bufpos - tokenBegin + inBuf + 1;
318: }
319: else
320: {
321: len = bufsize - tokenBegin + bufpos + 1 + inBuf;
322: }
323:
324: int i = 0, j = 0, k = 0;
325: int nextColDiff = 0, columnDiff = 0;
326:
327: while (i < len &&
328: bufline[j = start % bufsize] == bufline[k = ++start % bufsize])
329: {
330: bufline[j] = newLine;
331: nextColDiff = columnDiff + bufcolumn[k] - bufcolumn[j];
332: bufcolumn[j] = newCol + columnDiff;
333: columnDiff = nextColDiff;
334: i++;
335: }
336:
337: if (i < len)
338: {
339: bufline[j] = newLine++;
340: bufcolumn[j] = newCol + columnDiff;
341:
342: while (i++ < len)
343: {
344: if (bufline[j = start % bufsize] != bufline[++start % bufsize])
345: bufline[j] = newLine++;
346: else
347: bufline[j] = newLine;
348: }
349: }
350:
351: line = bufline[j];
352: column = bufcolumn[j];
353: }
354:
355: }