1
0
Fork 0
mirror of https://github.com/ethauvin/JSON-java.git synced 2025-06-17 07:50:52 -07:00

Fixes more position errors from stepping to new lines and then back.

This commit is contained in:
John J. Aylward 2017-06-23 23:27:28 -04:00 committed by John J. Aylward
parent e7e6ed9205
commit 52845366bd

View file

@ -53,10 +53,12 @@ public class JSONTokener {
private final Reader reader; private final Reader reader;
/** flag to indicate that a previous character was requested. */ /** flag to indicate that a previous character was requested. */
private boolean usePrevious; private boolean usePrevious;
/** the number of characters read in the previous line. */
private long characterPreviousLine;
/** /**
* Construct a JSONTokener from a Reader. * Construct a JSONTokener from a Reader. The caller must close the Reader.
* *
* @param reader A reader. * @param reader A reader.
*/ */
@ -69,12 +71,13 @@ public class JSONTokener {
this.previous = 0; this.previous = 0;
this.index = 0; this.index = 0;
this.character = 1; this.character = 1;
this.characterPreviousLine = 0;
this.line = 1; this.line = 1;
} }
/** /**
* Construct a JSONTokener from an InputStream. * Construct a JSONTokener from an InputStream. The caller must close the input stream.
* @param inputStream The source. * @param inputStream The source.
*/ */
public JSONTokener(InputStream inputStream) { public JSONTokener(InputStream inputStream) {
@ -103,12 +106,23 @@ public class JSONTokener {
if (this.usePrevious || this.index <= 0) { if (this.usePrevious || this.index <= 0) {
throw new JSONException("Stepping back two steps is not supported"); throw new JSONException("Stepping back two steps is not supported");
} }
this.index--; this.decrementIndexes();
this.character--;
this.usePrevious = true; this.usePrevious = true;
this.eof = false; this.eof = false;
} }
/**
* Decrements the indexes for the {@link #back()} method based on the previous character read.
*/
private void decrementIndexes() {
this.index--;
if(this.previous=='\r' || this.previous == '\n') {
this.line--;
this.character=this.characterPreviousLine ;
} else if(this.character > 0){
this.character--;
}
}
/** /**
* Get the hex value of a character (base16). * Get the hex value of a character (base16).
@ -183,26 +197,39 @@ public class JSONTokener {
} catch (IOException exception) { } catch (IOException exception) {
throw new JSONException(exception); throw new JSONException(exception);
} }
if (c <= 0) { // End of stream
this.eof = true;
return 0;
}
} }
this.index += 1; if (c <= 0) { // End of stream
if (this.previous == '\r') { this.eof = true;
this.line += 1; return 0;
this.character = c == '\n' ? 0 : 1;
} else if (c == '\n') {
this.line += 1;
this.character = 0;
} else {
this.character += 1;
} }
this.incrementIndexes(c);
this.previous = (char) c; this.previous = (char) c;
return this.previous; return this.previous;
} }
/**
* Increments the internal indexes according to the previous character
* read and the character passed as the current character.
* @param c the current character read.
*/
private void incrementIndexes(int c) {
if(c > 0) {
this.index++;
if(c=='\r') {
this.line++;
this.characterPreviousLine = this.character;
this.character=0;
}else if (c=='\n') {
if(this.previous != '\r') {
this.line++;
this.characterPreviousLine = this.character;
}
this.character=0;
} else {
this.character++;
}
}
}
/** /**
* Consume the next character, and check that it matches a specified * Consume the next character, and check that it matches a specified
@ -447,13 +474,17 @@ public class JSONTokener {
do { do {
c = this.next(); c = this.next();
if (c == 0) { if (c == 0) {
// in some readers, reset() may throw an exception if
// the remaining portion of the input is greater than
// the mark size (1,000,000 above).
this.reader.reset(); this.reader.reset();
this.index = startIndex; this.index = startIndex;
this.character = startCharacter; this.character = startCharacter;
this.line = startLine; this.line = startLine;
return c; return 0;
} }
} while (c != to); } while (c != to);
this.reader.mark(1);
} catch (IOException exception) { } catch (IOException exception) {
throw new JSONException(exception); throw new JSONException(exception);
} }
@ -461,7 +492,6 @@ public class JSONTokener {
return c; return c;
} }
/** /**
* Make a JSONException to signal a syntax error. * Make a JSONException to signal a syntax error.
* *