diff options
author | Jesse Wilson <jessewilson@google.com> | 2011-07-18 14:39:39 -0700 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2011-07-18 14:39:39 -0700 |
commit | a11c2f8674ab5b8834fb5cccce1060aa829a7f0a (patch) | |
tree | 45a3227ce9f2c4b492920dc694694602606646a6 /core/java | |
parent | 1a1d731c9cc0209570472a9c8b6e59da0b545968 (diff) | |
parent | febae4ed18953098fec2126c7f883213e14469c9 (diff) | |
download | frameworks_base-a11c2f8674ab5b8834fb5cccce1060aa829a7f0a.zip frameworks_base-a11c2f8674ab5b8834fb5cccce1060aa829a7f0a.tar.gz frameworks_base-a11c2f8674ab5b8834fb5cccce1060aa829a7f0a.tar.bz2 |
Merge "Track line and column when parsing JSON."
Diffstat (limited to 'core/java')
-rw-r--r-- | core/java/android/util/JsonReader.java | 41 |
1 files changed, 40 insertions, 1 deletions
diff --git a/core/java/android/util/JsonReader.java b/core/java/android/util/JsonReader.java index 132b595..09ce8e4 100644 --- a/core/java/android/util/JsonReader.java +++ b/core/java/android/util/JsonReader.java @@ -196,6 +196,12 @@ public final class JsonReader implements Closeable { private int pos = 0; private int limit = 0; + /* + * The offset of the first character in the buffer. + */ + private int bufferStartLine = 1; + private int bufferStartColumn = 1; + private final List<JsonScope> stack = new ArrayList<JsonScope>(); { push(JsonScope.EMPTY_DOCUMENT); @@ -711,6 +717,16 @@ public final class JsonReader implements Closeable { * false. */ private boolean fillBuffer(int minimum) throws IOException { + // Before clobbering the old characters, update where buffer starts + for (int i = 0; i < pos; i++) { + if (buffer[i] == '\n') { + bufferStartLine++; + bufferStartColumn = 1; + } else { + bufferStartColumn++; + } + } + if (limit != pos) { limit -= pos; System.arraycopy(buffer, pos, buffer, 0, limit); @@ -729,6 +745,28 @@ public final class JsonReader implements Closeable { return false; } + private int getLineNumber() { + int result = bufferStartLine; + for (int i = 0; i < pos; i++) { + if (buffer[i] == '\n') { + result++; + } + } + return result; + } + + private int getColumnNumber() { + int result = bufferStartColumn; + for (int i = 0; i < pos; i++) { + if (buffer[i] == '\n') { + result = 1; + } else { + result++; + } + } + return result; + } + private int nextNonWhitespace() throws IOException { while (pos < limit || fillBuffer(1)) { int c = buffer[pos++]; @@ -1107,7 +1145,8 @@ public final class JsonReader implements Closeable { * with this reader's content. */ private IOException syntaxError(String message) throws IOException { - throw new MalformedJsonException(message + " near " + getSnippet()); + throw new MalformedJsonException(message + + " at line " + getLineNumber() + " column " + getColumnNumber()); } private CharSequence getSnippet() { |