@@ -33,6 +33,7 @@ public class SimpleCharStream {
3333 protected boolean prevCharIsLF = false ;
3434
3535 protected Provider inputStream ;
36+ private boolean isStringProvider ;
3637
3738 protected char [] buffer ;
3839 protected int maxNextCharInd = 0 ;
@@ -88,7 +89,7 @@ protected void ExpandBuff(boolean wrapAround) {
8889 maxNextCharInd = bufpos -= tokenBegin ;
8990 }
9091 } catch (Throwable t ) {
91- throw new Error (t .getMessage ());
92+ throw new RuntimeException (t .getMessage ());
9293 }
9394
9495 bufsize += 2048 ;
@@ -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 (! isStringProvider && maxNextCharInd == available ) {
101102 if (available == bufsize ) {
102103 if (tokenBegin > 2048 ) {
103104 bufpos = maxNextCharInd = 0 ;
@@ -118,11 +119,19 @@ protected void FillBuff() throws java.io.IOException {
118119
119120 int i ;
120121 try {
121- if ((i = inputStream .read (buffer , maxNextCharInd , available - maxNextCharInd )) == -1 ) {
122- inputStream .close ();
123- throw new java .io .IOException ();
122+ if (inputStream instanceof StringProvider ) {
123+ i = ((StringProvider ) inputStream )._string .length ();
124+ if (maxNextCharInd == i ) {
125+ throw new java .io .IOException ();
126+ }
127+ maxNextCharInd = i ;
124128 } else {
125- maxNextCharInd += i ;
129+ if ((i = inputStream .read (buffer , maxNextCharInd , available - maxNextCharInd )) == -1 ) {
130+ inputStream .close ();
131+ throw new java .io .IOException ();
132+ } else {
133+ maxNextCharInd += i ;
134+ }
126135 }
127136 return ;
128137 } catch (java .io .IOException e ) {
@@ -180,6 +189,14 @@ protected void UpdateLineColumn(char c) {
180189 bufcolumn [bufpos ] = column ;
181190 }
182191
192+ private char readChar (int pos ) {
193+ if (this .inputStream instanceof StringProvider ) {
194+ return ((StringProvider ) inputStream )._string .charAt (pos );
195+ } else {
196+ return buffer [pos ];
197+ }
198+ }
199+
183200 /**
184201 * Read a character.
185202 */
@@ -192,7 +209,7 @@ public char readChar() throws java.io.IOException {
192209 }
193210
194211 totalCharsRead ++;
195- return buffer [ bufpos ] ;
212+ return readChar ( bufpos ) ;
196213 }
197214
198215 if (++bufpos >= maxNextCharInd ) {
@@ -201,7 +218,7 @@ public char readChar() throws java.io.IOException {
201218
202219 totalCharsRead ++;
203220
204- char c = buffer [ bufpos ] ;
221+ char c = readChar ( bufpos ) ;
205222
206223 UpdateLineColumn (c );
207224 return c ;
@@ -271,13 +288,21 @@ public void backup(int amount) {
271288 public SimpleCharStream (Provider dstream , int startline ,
272289 int startcolumn , int buffersize ) {
273290 inputStream = dstream ;
291+ isStringProvider = dstream instanceof StringProvider ;
274292 line = startline ;
275293 column = startcolumn - 1 ;
276294
277- available = bufsize = buffersize ;
278- buffer = new char [buffersize ];
279- bufline = new int [buffersize ];
280- bufcolumn = new int [buffersize ];
295+ if (isStringProvider ) {
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+ }
281306 }
282307
283308 /**
@@ -301,14 +326,21 @@ public SimpleCharStream(Provider dstream) {
301326 public void ReInit (Provider dstream , int startline ,
302327 int startcolumn , int buffersize ) {
303328 inputStream = dstream ;
329+ isStringProvider = dstream instanceof StringProvider ;
304330 line = startline ;
305331 column = startcolumn - 1 ;
306-
307- if (buffer == null || buffersize != buffer .length ) {
308- available = bufsize = buffersize ;
309- buffer = new char [buffersize ];
310- bufline = new int [buffersize ];
311- bufcolumn = new int [buffersize ];
332+ if (isStringProvider ) {
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+ }
312344 }
313345 prevCharIsLF = prevCharIsCR = false ;
314346 tokenBegin = inBuf = maxNextCharInd = 0 ;
@@ -334,18 +366,29 @@ public void ReInit(Provider dstream) {
334366 * Get token literal value.
335367 */
336368 public String GetImage () {
337- if (bufpos >= tokenBegin ) {
338- return new String (buffer , tokenBegin , bufpos - tokenBegin + 1 );
369+ if (isStringProvider ) {
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+ }
339377 } else {
340- return new String (buffer , tokenBegin , bufsize - tokenBegin )
341- + 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+ }
342384 }
343385 }
344386
345387 /**
346388 * Get the suffix.
347389 */
348390 public char [] GetSuffix (int len ) {
391+
349392 char [] ret = new char [len ];
350393
351394 if ((bufpos + 1 ) >= len ) {
@@ -385,7 +428,7 @@ public void adjustBeginLineColumn(int newLine, int newCol) {
385428 int i = 0 ;
386429 int j = 0 ;
387430 int k = 0 ;
388- int nextColDiff = 0 ;
431+ int nextColDiff = 0 ;
389432 int columnDiff = 0 ;
390433
391434 while (i < len && bufline [j = start % bufsize ] == bufline [k = ++start % bufsize ]) {
0 commit comments