summaryrefslogtreecommitdiffstats
path: root/core/java/android/util
diff options
context:
space:
mode:
authorJesse Wilson <jessewilson@google.com>2011-07-18 14:39:39 -0700
committerAndroid (Google) Code Review <android-gerrit@google.com>2011-07-18 14:39:39 -0700
commita11c2f8674ab5b8834fb5cccce1060aa829a7f0a (patch)
tree45a3227ce9f2c4b492920dc694694602606646a6 /core/java/android/util
parent1a1d731c9cc0209570472a9c8b6e59da0b545968 (diff)
parentfebae4ed18953098fec2126c7f883213e14469c9 (diff)
downloadframeworks_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/android/util')
-rw-r--r--core/java/android/util/JsonReader.java41
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() {