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 * Copyright (c) 2009 The JOMC Project 005 * Copyright (c) 2005 Christian Schulte <cs@jomc.org> 006 * All rights reserved. 007 * 008 * Redistribution and use in source and binary forms, with or without 009 * modification, are permitted provided that the following conditions 010 * are met: 011 * 012 * o Redistributions of source code must retain the above copyright 013 * notice, this list of conditions and the following disclaimer. 014 * 015 * o Redistributions in binary form must reproduce the above copyright 016 * notice, this list of conditions and the following disclaimer in 017 * the documentation and/or other materials provided with the 018 * distribution. 019 * 020 * THIS SOFTWARE IS PROVIDED BY THE JOMC PROJECT AND CONTRIBUTORS "AS IS" 021 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 022 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 023 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JOMC PROJECT OR 024 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 025 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 026 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 027 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 028 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 029 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 030 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 031 * 032 * $Id: VersionParser.jj 733 2009-10-05 17:22:57Z schulte2005 $ 033 * 034 */ 035 package org.jomc.util; 036 037 /** 038 * An implementation of interface CharStream, where the stream is assumed to 039 * contain only ASCII characters (without unicode processing). 040 */ 041 042 public class SimpleCharStream 043 { 044 /** Whether parser is static. */ 045 public static final boolean staticFlag = false; 046 int bufsize; 047 int available; 048 int tokenBegin; 049 /** Position in buffer. */ 050 public int bufpos = -1; 051 protected int bufline[]; 052 protected int bufcolumn[]; 053 054 protected int column = 0; 055 protected int line = 1; 056 057 protected boolean prevCharIsCR = false; 058 protected boolean prevCharIsLF = false; 059 060 protected java.io.Reader inputStream; 061 062 protected char[] buffer; 063 protected int maxNextCharInd = 0; 064 protected int inBuf = 0; 065 protected int tabSize = 8; 066 067 protected void setTabSize(int i) { tabSize = i; } 068 protected int getTabSize(int i) { return tabSize; } 069 070 071 protected void ExpandBuff(boolean wrapAround) 072 { 073 char[] newbuffer = new char[bufsize + 2048]; 074 int newbufline[] = new int[bufsize + 2048]; 075 int newbufcolumn[] = new int[bufsize + 2048]; 076 077 try 078 { 079 if (wrapAround) 080 { 081 System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin); 082 System.arraycopy(buffer, 0, newbuffer, bufsize - tokenBegin, bufpos); 083 buffer = newbuffer; 084 085 System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin); 086 System.arraycopy(bufline, 0, newbufline, bufsize - tokenBegin, bufpos); 087 bufline = newbufline; 088 089 System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin); 090 System.arraycopy(bufcolumn, 0, newbufcolumn, bufsize - tokenBegin, bufpos); 091 bufcolumn = newbufcolumn; 092 093 maxNextCharInd = (bufpos += (bufsize - tokenBegin)); 094 } 095 else 096 { 097 System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin); 098 buffer = newbuffer; 099 100 System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin); 101 bufline = newbufline; 102 103 System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin); 104 bufcolumn = newbufcolumn; 105 106 maxNextCharInd = (bufpos -= tokenBegin); 107 } 108 } 109 catch (Throwable t) 110 { 111 throw new Error(t.getMessage()); 112 } 113 114 115 bufsize += 2048; 116 available = bufsize; 117 tokenBegin = 0; 118 } 119 120 protected void FillBuff() throws java.io.IOException 121 { 122 if (maxNextCharInd == available) 123 { 124 if (available == bufsize) 125 { 126 if (tokenBegin > 2048) 127 { 128 bufpos = maxNextCharInd = 0; 129 available = tokenBegin; 130 } 131 else if (tokenBegin < 0) 132 bufpos = maxNextCharInd = 0; 133 else 134 ExpandBuff(false); 135 } 136 else if (available > tokenBegin) 137 available = bufsize; 138 else if ((tokenBegin - available) < 2048) 139 ExpandBuff(true); 140 else 141 available = tokenBegin; 142 } 143 144 int i; 145 try { 146 if ((i = inputStream.read(buffer, maxNextCharInd, available - maxNextCharInd)) == -1) 147 { 148 inputStream.close(); 149 throw new java.io.IOException(); 150 } 151 else 152 maxNextCharInd += i; 153 return; 154 } 155 catch(java.io.IOException e) { 156 --bufpos; 157 backup(0); 158 if (tokenBegin == -1) 159 tokenBegin = bufpos; 160 throw e; 161 } 162 } 163 164 /** Start. */ 165 public char BeginToken() throws java.io.IOException 166 { 167 tokenBegin = -1; 168 char c = readChar(); 169 tokenBegin = bufpos; 170 171 return c; 172 } 173 174 protected void UpdateLineColumn(char c) 175 { 176 column++; 177 178 if (prevCharIsLF) 179 { 180 prevCharIsLF = false; 181 line += (column = 1); 182 } 183 else if (prevCharIsCR) 184 { 185 prevCharIsCR = false; 186 if (c == '\n') 187 { 188 prevCharIsLF = true; 189 } 190 else 191 line += (column = 1); 192 } 193 194 switch (c) 195 { 196 case '\r' : 197 prevCharIsCR = true; 198 break; 199 case '\n' : 200 prevCharIsLF = true; 201 break; 202 case '\t' : 203 column--; 204 column += (tabSize - (column % tabSize)); 205 break; 206 default : 207 break; 208 } 209 210 bufline[bufpos] = line; 211 bufcolumn[bufpos] = column; 212 } 213 214 /** Read a character. */ 215 public char readChar() throws java.io.IOException 216 { 217 if (inBuf > 0) 218 { 219 --inBuf; 220 221 if (++bufpos == bufsize) 222 bufpos = 0; 223 224 return buffer[bufpos]; 225 } 226 227 if (++bufpos >= maxNextCharInd) 228 FillBuff(); 229 230 char c = buffer[bufpos]; 231 232 UpdateLineColumn(c); 233 return c; 234 } 235 236 /** 237 * @deprecated 238 * @see #getEndColumn 239 */ 240 241 public int getColumn() { 242 return bufcolumn[bufpos]; 243 } 244 245 /** 246 * @deprecated 247 * @see #getEndLine 248 */ 249 250 public int getLine() { 251 return bufline[bufpos]; 252 } 253 254 /** Get token end column number. */ 255 public int getEndColumn() { 256 return bufcolumn[bufpos]; 257 } 258 259 /** Get token end line number. */ 260 public int getEndLine() { 261 return bufline[bufpos]; 262 } 263 264 /** Get token beginning column number. */ 265 public int getBeginColumn() { 266 return bufcolumn[tokenBegin]; 267 } 268 269 /** Get token beginning line number. */ 270 public int getBeginLine() { 271 return bufline[tokenBegin]; 272 } 273 274 /** Backup a number of characters. */ 275 public void backup(int amount) { 276 277 inBuf += amount; 278 if ((bufpos -= amount) < 0) 279 bufpos += bufsize; 280 } 281 282 /** Constructor. */ 283 public SimpleCharStream(java.io.Reader dstream, int startline, 284 int startcolumn, int buffersize) 285 { 286 inputStream = dstream; 287 line = startline; 288 column = startcolumn - 1; 289 290 available = bufsize = buffersize; 291 buffer = new char[buffersize]; 292 bufline = new int[buffersize]; 293 bufcolumn = new int[buffersize]; 294 } 295 296 /** Constructor. */ 297 public SimpleCharStream(java.io.Reader dstream, int startline, 298 int startcolumn) 299 { 300 this(dstream, startline, startcolumn, 4096); 301 } 302 303 /** Constructor. */ 304 public SimpleCharStream(java.io.Reader dstream) 305 { 306 this(dstream, 1, 1, 4096); 307 } 308 309 /** Reinitialise. */ 310 public void ReInit(java.io.Reader dstream, int startline, 311 int startcolumn, int buffersize) 312 { 313 inputStream = dstream; 314 line = startline; 315 column = startcolumn - 1; 316 317 if (buffer == null || buffersize != buffer.length) 318 { 319 available = bufsize = buffersize; 320 buffer = new char[buffersize]; 321 bufline = new int[buffersize]; 322 bufcolumn = new int[buffersize]; 323 } 324 prevCharIsLF = prevCharIsCR = false; 325 tokenBegin = inBuf = maxNextCharInd = 0; 326 bufpos = -1; 327 } 328 329 /** Reinitialise. */ 330 public void ReInit(java.io.Reader dstream, int startline, 331 int startcolumn) 332 { 333 ReInit(dstream, startline, startcolumn, 4096); 334 } 335 336 /** Reinitialise. */ 337 public void ReInit(java.io.Reader dstream) 338 { 339 ReInit(dstream, 1, 1, 4096); 340 } 341 /** Constructor. */ 342 public SimpleCharStream(java.io.InputStream dstream, String encoding, int startline, 343 int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException 344 { 345 this(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize); 346 } 347 348 /** Constructor. */ 349 public SimpleCharStream(java.io.InputStream dstream, int startline, 350 int startcolumn, int buffersize) 351 { 352 this(new java.io.InputStreamReader(dstream), startline, startcolumn, buffersize); 353 } 354 355 /** Constructor. */ 356 public SimpleCharStream(java.io.InputStream dstream, String encoding, int startline, 357 int startcolumn) throws java.io.UnsupportedEncodingException 358 { 359 this(dstream, encoding, startline, startcolumn, 4096); 360 } 361 362 /** Constructor. */ 363 public SimpleCharStream(java.io.InputStream dstream, int startline, 364 int startcolumn) 365 { 366 this(dstream, startline, startcolumn, 4096); 367 } 368 369 /** Constructor. */ 370 public SimpleCharStream(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException 371 { 372 this(dstream, encoding, 1, 1, 4096); 373 } 374 375 /** Constructor. */ 376 public SimpleCharStream(java.io.InputStream dstream) 377 { 378 this(dstream, 1, 1, 4096); 379 } 380 381 /** Reinitialise. */ 382 public void ReInit(java.io.InputStream dstream, String encoding, int startline, 383 int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException 384 { 385 ReInit(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize); 386 } 387 388 /** Reinitialise. */ 389 public void ReInit(java.io.InputStream dstream, int startline, 390 int startcolumn, int buffersize) 391 { 392 ReInit(new java.io.InputStreamReader(dstream), startline, startcolumn, buffersize); 393 } 394 395 /** Reinitialise. */ 396 public void ReInit(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException 397 { 398 ReInit(dstream, encoding, 1, 1, 4096); 399 } 400 401 /** Reinitialise. */ 402 public void ReInit(java.io.InputStream dstream) 403 { 404 ReInit(dstream, 1, 1, 4096); 405 } 406 /** Reinitialise. */ 407 public void ReInit(java.io.InputStream dstream, String encoding, int startline, 408 int startcolumn) throws java.io.UnsupportedEncodingException 409 { 410 ReInit(dstream, encoding, startline, startcolumn, 4096); 411 } 412 /** Reinitialise. */ 413 public void ReInit(java.io.InputStream dstream, int startline, 414 int startcolumn) 415 { 416 ReInit(dstream, startline, startcolumn, 4096); 417 } 418 /** Get token literal value. */ 419 public String GetImage() 420 { 421 if (bufpos >= tokenBegin) 422 return new String(buffer, tokenBegin, bufpos - tokenBegin + 1); 423 else 424 return new String(buffer, tokenBegin, bufsize - tokenBegin) + 425 new String(buffer, 0, bufpos + 1); 426 } 427 428 /** Get the suffix. */ 429 public char[] GetSuffix(int len) 430 { 431 char[] ret = new char[len]; 432 433 if ((bufpos + 1) >= len) 434 System.arraycopy(buffer, bufpos - len + 1, ret, 0, len); 435 else 436 { 437 System.arraycopy(buffer, bufsize - (len - bufpos - 1), ret, 0, 438 len - bufpos - 1); 439 System.arraycopy(buffer, 0, ret, len - bufpos - 1, bufpos + 1); 440 } 441 442 return ret; 443 } 444 445 /** Reset buffer when finished. */ 446 public void Done() 447 { 448 buffer = null; 449 bufline = null; 450 bufcolumn = null; 451 } 452 453 /** 454 * Method to adjust line and column numbers for the start of a token. 455 */ 456 public void adjustBeginLineColumn(int newLine, int newCol) 457 { 458 int start = tokenBegin; 459 int len; 460 461 if (bufpos >= tokenBegin) 462 { 463 len = bufpos - tokenBegin + inBuf + 1; 464 } 465 else 466 { 467 len = bufsize - tokenBegin + bufpos + 1 + inBuf; 468 } 469 470 int i = 0, j = 0, k = 0; 471 int nextColDiff = 0, columnDiff = 0; 472 473 while (i < len && bufline[j = start % bufsize] == bufline[k = ++start % bufsize]) 474 { 475 bufline[j] = newLine; 476 nextColDiff = columnDiff + bufcolumn[k] - bufcolumn[j]; 477 bufcolumn[j] = newCol + columnDiff; 478 columnDiff = nextColDiff; 479 i++; 480 } 481 482 if (i < len) 483 { 484 bufline[j] = newLine++; 485 bufcolumn[j] = newCol + columnDiff; 486 487 while (i++ < len) 488 { 489 if (bufline[j = start % bufsize] != bufline[++start % bufsize]) 490 bufline[j] = newLine++; 491 else 492 bufline[j] = newLine; 493 } 494 } 495 496 line = bufline[j]; 497 column = bufcolumn[j]; 498 } 499 500 } 501 /* JavaCC - OriginalChecksum=a9b2cfd9d36387354cda361e02a411f1 (do not edit this line) */