@@ -33,6 +33,7 @@ public class SimpleCharStream {
33
33
protected boolean prevCharIsLF = false ;
34
34
35
35
protected Provider inputStream ;
36
+ private boolean externalBuffer ;
36
37
37
38
protected char [] buffer ;
38
39
protected int maxNextCharInd = 0 ;
@@ -97,7 +98,7 @@ protected void ExpandBuff(boolean wrapAround) {
97
98
}
98
99
99
100
protected void FillBuff () throws java .io .IOException {
100
- if (maxNextCharInd == available ) {
101
+ if (! externalBuffer && maxNextCharInd == available ) {
101
102
if (available == bufsize ) {
102
103
if (tokenBegin > 2048 ) {
103
104
bufpos = maxNextCharInd = 0 ;
@@ -287,13 +288,21 @@ public void backup(int amount) {
287
288
public SimpleCharStream (Provider dstream , int startline ,
288
289
int startcolumn , int buffersize ) {
289
290
inputStream = dstream ;
291
+ externalBuffer = dstream instanceof StringProvider ;
290
292
line = startline ;
291
293
column = startcolumn - 1 ;
292
294
293
- available = bufsize = buffersize ;
294
- buffer = new char [buffersize ];
295
- bufline = new int [buffersize ];
296
- bufcolumn = new int [buffersize ];
295
+ if (externalBuffer ) {
296
+ int bs = ((StringProvider ) inputStream )._string .length ();
297
+ available = bufsize = bs ;
298
+ bufline = new int [bs ];
299
+ bufcolumn = new int [bs ];
300
+ } else {
301
+ available = bufsize = buffersize ;
302
+ buffer = new char [buffersize ];
303
+ bufline = new int [buffersize ];
304
+ bufcolumn = new int [buffersize ];
305
+ }
297
306
}
298
307
299
308
/**
@@ -317,14 +326,21 @@ public SimpleCharStream(Provider dstream) {
317
326
public void ReInit (Provider dstream , int startline ,
318
327
int startcolumn , int buffersize ) {
319
328
inputStream = dstream ;
329
+ externalBuffer = dstream instanceof StringProvider ;
320
330
line = startline ;
321
331
column = startcolumn - 1 ;
322
-
323
- if (buffer == null || buffersize != buffer .length ) {
324
- available = bufsize = buffersize ;
325
- buffer = new char [buffersize ];
326
- bufline = new int [buffersize ];
327
- bufcolumn = new int [buffersize ];
332
+ if (externalBuffer ) {
333
+ int bs = ((StringProvider ) inputStream )._string .length ();
334
+ available = bufsize = bs ;
335
+ bufline = new int [bs ];
336
+ bufcolumn = new int [bs ];
337
+ } else {
338
+ if (buffer == null || buffersize != buffer .length ) {
339
+ available = bufsize = buffersize ;
340
+ buffer = new char [buffersize ];
341
+ bufline = new int [buffersize ];
342
+ bufcolumn = new int [buffersize ];
343
+ }
328
344
}
329
345
prevCharIsLF = prevCharIsCR = false ;
330
346
tokenBegin = inBuf = maxNextCharInd = 0 ;
@@ -350,18 +366,29 @@ public void ReInit(Provider dstream) {
350
366
* Get token literal value.
351
367
*/
352
368
public String GetImage () {
353
- if (bufpos >= tokenBegin ) {
354
- return new String (buffer , tokenBegin , bufpos - tokenBegin + 1 );
369
+ if (externalBuffer ) {
370
+ String data = ((StringProvider ) inputStream )._string ;
371
+ if (bufpos >= tokenBegin ) {
372
+ return data .substring (tokenBegin , bufpos + 1 );
373
+ } else {
374
+ return data .substring (tokenBegin , bufsize )
375
+ + data .substring (0 , bufpos + 1 );
376
+ }
355
377
} else {
356
- return new String (buffer , tokenBegin , bufsize - tokenBegin )
357
- + new String (buffer , 0 , bufpos + 1 );
378
+ if (bufpos >= tokenBegin ) {
379
+ return new String (buffer , tokenBegin , bufpos - tokenBegin + 1 );
380
+ } else {
381
+ return new String (buffer , tokenBegin , bufsize - tokenBegin )
382
+ + new String (buffer , 0 , bufpos + 1 );
383
+ }
358
384
}
359
385
}
360
386
361
387
/**
362
388
* Get the suffix.
363
389
*/
364
390
public char [] GetSuffix (int len ) {
391
+
365
392
char [] ret = new char [len ];
366
393
367
394
if ((bufpos + 1 ) >= len ) {
0 commit comments