@@ -33,6 +33,7 @@ public class SimpleCharStream {
3333 protected boolean prevCharIsLF = false ;
3434
3535 protected Provider inputStream ;
36+ private boolean externalBuffer ;
3637
3738 protected char [] buffer ;
3839 protected int maxNextCharInd = 0 ;
@@ -97,7 +98,7 @@ protected void ExpandBuff(boolean wrapAround) {
9798 }
9899
99100 protected void FillBuff () throws java .io .IOException {
100- if (maxNextCharInd == available ) {
101+ if (! externalBuffer && maxNextCharInd == available ) {
101102 if (available == bufsize ) {
102103 if (tokenBegin > 2048 ) {
103104 bufpos = maxNextCharInd = 0 ;
@@ -287,13 +288,21 @@ public void backup(int amount) {
287288 public SimpleCharStream (Provider dstream , int startline ,
288289 int startcolumn , int buffersize ) {
289290 inputStream = dstream ;
291+ externalBuffer = dstream instanceof StringProvider ;
290292 line = startline ;
291293 column = startcolumn - 1 ;
292294
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+ }
297306 }
298307
299308 /**
@@ -317,14 +326,21 @@ public SimpleCharStream(Provider dstream) {
317326 public void ReInit (Provider dstream , int startline ,
318327 int startcolumn , int buffersize ) {
319328 inputStream = dstream ;
329+ externalBuffer = dstream instanceof StringProvider ;
320330 line = startline ;
321331 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+ }
328344 }
329345 prevCharIsLF = prevCharIsCR = false ;
330346 tokenBegin = inBuf = maxNextCharInd = 0 ;
@@ -350,18 +366,29 @@ public void ReInit(Provider dstream) {
350366 * Get token literal value.
351367 */
352368 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+ }
355377 } 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+ }
358384 }
359385 }
360386
361387 /**
362388 * Get the suffix.
363389 */
364390 public char [] GetSuffix (int len ) {
391+
365392 char [] ret = new char [len ];
366393
367394 if ((bufpos + 1 ) >= len ) {
0 commit comments