[ovs-dev] [PATCH] json: Correct position tracking in JSON parser.
Ethan Jackson
ethan at nicira.com
Wed Apr 25 22:45:29 UTC 2012
Looks good.
Was there a specific issue that this fixes, or did you just happen to notice it?
Ethan
On Wed, Apr 25, 2012 at 15:38, Ben Pfaff <blp at nicira.com> wrote:
> When json_lex_input() returns false, the parser does not consume the byte
> passed in. That byte will get processed again in the next iteration of
> the json_parser_feed() loop. Therefore, until now, this code has
> double-counted bytes that cause a false return from json_lex_input().
>
> This fixes the problem. Every input byte is now counted only once.
>
> Signed-off-by: Ben Pfaff <blp at nicira.com>
> ---
> lib/json.c | 15 +++++++--------
> python/ovs/json.py | 20 +++++++++++---------
> tests/ovsdb-log.at | 2 +-
> 3 files changed, 19 insertions(+), 18 deletions(-)
>
> diff --git a/lib/json.c b/lib/json.c
> index 37bdece..d514a90 100644
> --- a/lib/json.c
> +++ b/lib/json.c
> @@ -908,14 +908,6 @@ json_lex_input(struct json_parser *p, unsigned char c)
> {
> struct json_token token;
>
> - p->byte_number++;
> - if (c == '\n') {
> - p->column_number = 0;
> - p->line_number++;
> - } else {
> - p->column_number++;
> - }
> -
> switch (p->lex_state) {
> case JSON_LEX_START:
> switch (c) {
> @@ -1092,6 +1084,13 @@ json_parser_feed(struct json_parser *p, const char *input, size_t n)
> size_t i;
> for (i = 0; !p->done && i < n; ) {
> if (json_lex_input(p, input[i])) {
> + p->byte_number++;
> + if (input[i] == '\n') {
> + p->column_number = 0;
> + p->line_number++;
> + } else {
> + p->column_number++;
> + }
> i++;
> }
> }
> diff --git a/python/ovs/json.py b/python/ovs/json.py
> index 417d231..fa5fd15 100644
> --- a/python/ovs/json.py
> +++ b/python/ovs/json.py
> @@ -1,4 +1,4 @@
> -# Copyright (c) 2010, 2011 Nicira Networks
> +# Copyright (c) 2010, 2011, 2012 Nicira Networks
> #
> # Licensed under the Apache License, Version 2.0 (the "License");
> # you may not use this file except in compliance with the License.
> @@ -420,13 +420,6 @@ class Parser(object):
> return True
>
> def __lex_input(self, c):
> - self.byte_number += 1
> - if c == '\n':
> - self.column_number = 0
> - self.line_number += 1
> - else:
> - self.column_number += 1
> -
> eat = self.lex_state(self, c)
> assert eat is True or eat is False
> return eat
> @@ -557,7 +550,16 @@ class Parser(object):
> while True:
> if self.done or i >= len(s):
> return i
> - if self.__lex_input(s[i]):
> +
> + c = s[i]
> + if self.__lex_input(c):
> + self.byte_number += 1
> + if c == '\n':
> + self.column_number = 0
> + self.line_number += 1
> + else:
> + self.column_number += 1
> +
> i += 1
>
> def is_done(self):
> diff --git a/tests/ovsdb-log.at b/tests/ovsdb-log.at
> index bd06110..055dc70 100644
> --- a/tests/ovsdb-log.at
> +++ b/tests/ovsdb-log.at
> @@ -266,7 +266,7 @@ AT_CHECK(
> file: read: [0]
> file: read: [1]
> file: read: [2]
> -file: read failed: syntax error: file: 5 bytes starting at offset 228 are not valid JSON (line 1, column 0, byte 5: syntax error at beginning of input)
> +file: read failed: syntax error: file: 5 bytes starting at offset 228 are not valid JSON (line 0, column 4, byte 4: syntax error at beginning of input)
> file: write:["replacement data"] successful
> ]], [ignore])
> AT_CHECK(
> --
> 1.7.2.5
>
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev
More information about the dev
mailing list