001 /* Generated By:JavaCC: Do not edit this line. SimpleCharStream.java Version 5.0 */
002 /* JavaCCOptions:STATIC=false,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */
003 /**
004 * Licensed to the Apache Software Foundation (ASF) under one or more
005 * contributor license agreements. See the NOTICE file distributed with
006 * this work for additional information regarding copyright ownership.
007 * The ASF licenses this file to You under the Apache License, Version 2.0
008 * (the "License"); you may not use this file except in compliance with
009 * the License. You may obtain a copy of the License at
010 *
011 * http://www.apache.org/licenses/LICENSE-2.0
012 *
013 * Unless required by applicable law or agreed to in writing, software
014 * distributed under the License is distributed on an "AS IS" BASIS,
015 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
016 * See the License for the specific language governing permissions and
017 * limitations under the License.
018 */
019
020 package org.apache.activemq.selector;
021
022 /**
023 * An implementation of interface CharStream, where the stream is assumed to
024 * contain only ASCII characters (without unicode processing).
025 */
026
027 public class SimpleCharStream
028 {
029 /** Whether parser is static. */
030 public static final boolean staticFlag = false;
031 int bufsize;
032 int available;
033 int tokenBegin;
034 /** Position in buffer. */
035 public int bufpos = -1;
036 protected int bufline[];
037 protected int bufcolumn[];
038
039 protected int column = 0;
040 protected int line = 1;
041
042 protected boolean prevCharIsCR = false;
043 protected boolean prevCharIsLF = false;
044
045 protected java.io.Reader inputStream;
046
047 protected char[] buffer;
048 protected int maxNextCharInd = 0;
049 protected int inBuf = 0;
050 protected int tabSize = 8;
051
052 protected void setTabSize(int i) { tabSize = i; }
053 protected int getTabSize(int i) { return tabSize; }
054
055
056 protected void ExpandBuff(boolean wrapAround)
057 {
058 char[] newbuffer = new char[bufsize + 2048];
059 int newbufline[] = new int[bufsize + 2048];
060 int newbufcolumn[] = new int[bufsize + 2048];
061
062 try
063 {
064 if (wrapAround)
065 {
066 System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
067 System.arraycopy(buffer, 0, newbuffer, bufsize - tokenBegin, bufpos);
068 buffer = newbuffer;
069
070 System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
071 System.arraycopy(bufline, 0, newbufline, bufsize - tokenBegin, bufpos);
072 bufline = newbufline;
073
074 System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
075 System.arraycopy(bufcolumn, 0, newbufcolumn, bufsize - tokenBegin, bufpos);
076 bufcolumn = newbufcolumn;
077
078 maxNextCharInd = (bufpos += (bufsize - tokenBegin));
079 }
080 else
081 {
082 System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
083 buffer = newbuffer;
084
085 System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
086 bufline = newbufline;
087
088 System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
089 bufcolumn = newbufcolumn;
090
091 maxNextCharInd = (bufpos -= tokenBegin);
092 }
093 }
094 catch (Throwable t)
095 {
096 throw new Error(t.getMessage());
097 }
098
099
100 bufsize += 2048;
101 available = bufsize;
102 tokenBegin = 0;
103 }
104
105 protected void FillBuff() throws java.io.IOException
106 {
107 if (maxNextCharInd == available)
108 {
109 if (available == bufsize)
110 {
111 if (tokenBegin > 2048)
112 {
113 bufpos = maxNextCharInd = 0;
114 available = tokenBegin;
115 }
116 else if (tokenBegin < 0)
117 bufpos = maxNextCharInd = 0;
118 else
119 ExpandBuff(false);
120 }
121 else if (available > tokenBegin)
122 available = bufsize;
123 else if ((tokenBegin - available) < 2048)
124 ExpandBuff(true);
125 else
126 available = tokenBegin;
127 }
128
129 int i;
130 try {
131 if ((i = inputStream.read(buffer, maxNextCharInd, available - maxNextCharInd)) == -1)
132 {
133 inputStream.close();
134 throw new java.io.IOException();
135 }
136 else
137 maxNextCharInd += i;
138 return;
139 }
140 catch(java.io.IOException e) {
141 --bufpos;
142 backup(0);
143 if (tokenBegin == -1)
144 tokenBegin = bufpos;
145 throw e;
146 }
147 }
148
149 /** Start. */
150 public char BeginToken() throws java.io.IOException
151 {
152 tokenBegin = -1;
153 char c = readChar();
154 tokenBegin = bufpos;
155
156 return c;
157 }
158
159 protected void UpdateLineColumn(char c)
160 {
161 column++;
162
163 if (prevCharIsLF)
164 {
165 prevCharIsLF = false;
166 line += (column = 1);
167 }
168 else if (prevCharIsCR)
169 {
170 prevCharIsCR = false;
171 if (c == '\n')
172 {
173 prevCharIsLF = true;
174 }
175 else
176 line += (column = 1);
177 }
178
179 switch (c)
180 {
181 case '\r' :
182 prevCharIsCR = true;
183 break;
184 case '\n' :
185 prevCharIsLF = true;
186 break;
187 case '\t' :
188 column--;
189 column += (tabSize - (column % tabSize));
190 break;
191 default :
192 break;
193 }
194
195 bufline[bufpos] = line;
196 bufcolumn[bufpos] = column;
197 }
198
199 /** Read a character. */
200 public char readChar() throws java.io.IOException
201 {
202 if (inBuf > 0)
203 {
204 --inBuf;
205
206 if (++bufpos == bufsize)
207 bufpos = 0;
208
209 return buffer[bufpos];
210 }
211
212 if (++bufpos >= maxNextCharInd)
213 FillBuff();
214
215 char c = buffer[bufpos];
216
217 UpdateLineColumn(c);
218 return c;
219 }
220
221 @Deprecated
222 /**
223 * @deprecated
224 * @see #getEndColumn
225 */
226
227 public int getColumn() {
228 return bufcolumn[bufpos];
229 }
230
231 @Deprecated
232 /**
233 * @deprecated
234 * @see #getEndLine
235 */
236
237 public int getLine() {
238 return bufline[bufpos];
239 }
240
241 /** Get token end column number. */
242 public int getEndColumn() {
243 return bufcolumn[bufpos];
244 }
245
246 /** Get token end line number. */
247 public int getEndLine() {
248 return bufline[bufpos];
249 }
250
251 /** Get token beginning column number. */
252 public int getBeginColumn() {
253 return bufcolumn[tokenBegin];
254 }
255
256 /** Get token beginning line number. */
257 public int getBeginLine() {
258 return bufline[tokenBegin];
259 }
260
261 /** Backup a number of characters. */
262 public void backup(int amount) {
263
264 inBuf += amount;
265 if ((bufpos -= amount) < 0)
266 bufpos += bufsize;
267 }
268
269 /** Constructor. */
270 public SimpleCharStream(java.io.Reader dstream, int startline,
271 int startcolumn, int buffersize)
272 {
273 inputStream = dstream;
274 line = startline;
275 column = startcolumn - 1;
276
277 available = bufsize = buffersize;
278 buffer = new char[buffersize];
279 bufline = new int[buffersize];
280 bufcolumn = new int[buffersize];
281 }
282
283 /** Constructor. */
284 public SimpleCharStream(java.io.Reader dstream, int startline,
285 int startcolumn)
286 {
287 this(dstream, startline, startcolumn, 4096);
288 }
289
290 /** Constructor. */
291 public SimpleCharStream(java.io.Reader dstream)
292 {
293 this(dstream, 1, 1, 4096);
294 }
295
296 /** Reinitialise. */
297 public void ReInit(java.io.Reader dstream, int startline,
298 int startcolumn, int buffersize)
299 {
300 inputStream = dstream;
301 line = startline;
302 column = startcolumn - 1;
303
304 if (buffer == null || buffersize != buffer.length)
305 {
306 available = bufsize = buffersize;
307 buffer = new char[buffersize];
308 bufline = new int[buffersize];
309 bufcolumn = new int[buffersize];
310 }
311 prevCharIsLF = prevCharIsCR = false;
312 tokenBegin = inBuf = maxNextCharInd = 0;
313 bufpos = -1;
314 }
315
316 /** Reinitialise. */
317 public void ReInit(java.io.Reader dstream, int startline,
318 int startcolumn)
319 {
320 ReInit(dstream, startline, startcolumn, 4096);
321 }
322
323 /** Reinitialise. */
324 public void ReInit(java.io.Reader dstream)
325 {
326 ReInit(dstream, 1, 1, 4096);
327 }
328 /** Constructor. */
329 public SimpleCharStream(java.io.InputStream dstream, String encoding, int startline,
330 int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException
331 {
332 this(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize);
333 }
334
335 /** Constructor. */
336 public SimpleCharStream(java.io.InputStream dstream, int startline,
337 int startcolumn, int buffersize)
338 {
339 this(new java.io.InputStreamReader(dstream), startline, startcolumn, buffersize);
340 }
341
342 /** Constructor. */
343 public SimpleCharStream(java.io.InputStream dstream, String encoding, int startline,
344 int startcolumn) throws java.io.UnsupportedEncodingException
345 {
346 this(dstream, encoding, startline, startcolumn, 4096);
347 }
348
349 /** Constructor. */
350 public SimpleCharStream(java.io.InputStream dstream, int startline,
351 int startcolumn)
352 {
353 this(dstream, startline, startcolumn, 4096);
354 }
355
356 /** Constructor. */
357 public SimpleCharStream(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException
358 {
359 this(dstream, encoding, 1, 1, 4096);
360 }
361
362 /** Constructor. */
363 public SimpleCharStream(java.io.InputStream dstream)
364 {
365 this(dstream, 1, 1, 4096);
366 }
367
368 /** Reinitialise. */
369 public void ReInit(java.io.InputStream dstream, String encoding, int startline,
370 int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException
371 {
372 ReInit(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize);
373 }
374
375 /** Reinitialise. */
376 public void ReInit(java.io.InputStream dstream, int startline,
377 int startcolumn, int buffersize)
378 {
379 ReInit(new java.io.InputStreamReader(dstream), startline, startcolumn, buffersize);
380 }
381
382 /** Reinitialise. */
383 public void ReInit(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException
384 {
385 ReInit(dstream, encoding, 1, 1, 4096);
386 }
387
388 /** Reinitialise. */
389 public void ReInit(java.io.InputStream dstream)
390 {
391 ReInit(dstream, 1, 1, 4096);
392 }
393 /** Reinitialise. */
394 public void ReInit(java.io.InputStream dstream, String encoding, int startline,
395 int startcolumn) throws java.io.UnsupportedEncodingException
396 {
397 ReInit(dstream, encoding, startline, startcolumn, 4096);
398 }
399 /** Reinitialise. */
400 public void ReInit(java.io.InputStream dstream, int startline,
401 int startcolumn)
402 {
403 ReInit(dstream, startline, startcolumn, 4096);
404 }
405 /** Get token literal value. */
406 public String GetImage()
407 {
408 if (bufpos >= tokenBegin)
409 return new String(buffer, tokenBegin, bufpos - tokenBegin + 1);
410 else
411 return new String(buffer, tokenBegin, bufsize - tokenBegin) +
412 new String(buffer, 0, bufpos + 1);
413 }
414
415 /** Get the suffix. */
416 public char[] GetSuffix(int len)
417 {
418 char[] ret = new char[len];
419
420 if ((bufpos + 1) >= len)
421 System.arraycopy(buffer, bufpos - len + 1, ret, 0, len);
422 else
423 {
424 System.arraycopy(buffer, bufsize - (len - bufpos - 1), ret, 0,
425 len - bufpos - 1);
426 System.arraycopy(buffer, 0, ret, len - bufpos - 1, bufpos + 1);
427 }
428
429 return ret;
430 }
431
432 /** Reset buffer when finished. */
433 public void Done()
434 {
435 buffer = null;
436 bufline = null;
437 bufcolumn = null;
438 }
439
440 /**
441 * Method to adjust line and column numbers for the start of a token.
442 */
443 public void adjustBeginLineColumn(int newLine, int newCol)
444 {
445 int start = tokenBegin;
446 int len;
447
448 if (bufpos >= tokenBegin)
449 {
450 len = bufpos - tokenBegin + inBuf + 1;
451 }
452 else
453 {
454 len = bufsize - tokenBegin + bufpos + 1 + inBuf;
455 }
456
457 int i = 0, j = 0, k = 0;
458 int nextColDiff = 0, columnDiff = 0;
459
460 while (i < len && bufline[j = start % bufsize] == bufline[k = ++start % bufsize])
461 {
462 bufline[j] = newLine;
463 nextColDiff = columnDiff + bufcolumn[k] - bufcolumn[j];
464 bufcolumn[j] = newCol + columnDiff;
465 columnDiff = nextColDiff;
466 i++;
467 }
468
469 if (i < len)
470 {
471 bufline[j] = newLine++;
472 bufcolumn[j] = newCol + columnDiff;
473
474 while (i++ < len)
475 {
476 if (bufline[j = start % bufsize] != bufline[++start % bufsize])
477 bufline[j] = newLine++;
478 else
479 bufline[j] = newLine;
480 }
481 }
482
483 line = bufline[j];
484 column = bufcolumn[j];
485 }
486
487 }
488 /* JavaCC - OriginalChecksum=0d87faf7268f57eee4264d5490bb66fc (do not edit this line) */