1 34 35 36 37 package com.micronova.util.cc.html; 38 39 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 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 t) 106 { 107 throw new Error (t.getMessage()); 108 } 109 110 111 bufsize += 2048; 112 available = bufsize; 113 tokenBegin = 0; 114 } 115 116 protected void FillBuff() throws java.io.IOException 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 (); 147 } 148 else 149 maxNextCharInd += i; 150 return; 151 } 152 catch(java.io.IOException 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 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 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 235 236 public int getColumn() { 237 return bufcolumn[bufpos]; 238 } 239 240 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 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 dstream, int startline, 286 int startcolumn) 287 { 288 this(dstream, startline, startcolumn, 4096); 289 } 290 291 public SimpleCharStream(java.io.Reader dstream) 292 { 293 this(dstream, 1, 1, 4096); 294 } 295 public void ReInit(java.io.Reader 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 dstream, int startline, 315 int startcolumn) 316 { 317 ReInit(dstream, startline, startcolumn, 4096); 318 } 319 320 public void ReInit(java.io.Reader dstream) 321 { 322 ReInit(dstream, 1, 1, 4096); 323 } 324 public SimpleCharStream(java.io.InputStream dstream, int startline, 325 int startcolumn, int buffersize) 326 { 327 this(new java.io.InputStreamReader (dstream), startline, startcolumn, 4096); 328 } 329 330 public SimpleCharStream(java.io.InputStream dstream, int startline, 331 int startcolumn) 332 { 333 this(dstream, startline, startcolumn, 4096); 334 } 335 336 public SimpleCharStream(java.io.InputStream dstream) 337 { 338 this(dstream, 1, 1, 4096); 339 } 340 341 public void ReInit(java.io.InputStream dstream, int startline, 342 int startcolumn, int buffersize) 343 { 344 ReInit(new java.io.InputStreamReader (dstream), startline, startcolumn, 4096); 345 } 346 347 public void ReInit(java.io.InputStream dstream) 348 { 349 ReInit(dstream, 1, 1, 4096); 350 } 351 public void ReInit(java.io.InputStream dstream, int startline, 352 int startcolumn) 353 { 354 ReInit(dstream, startline, startcolumn, 4096); 355 } 356 public String GetImage() 357 { 358 if (bufpos >= tokenBegin) 359 return new String (buffer, tokenBegin, bufpos - tokenBegin + 1); 360 else 361 return new String (buffer, tokenBegin, bufsize - tokenBegin) + 362 new String (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 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 |