I just noticed it while reading code.

On Wed, Apr 25, 2012 at 03:45:29PM -0700, Ethan Jackson wrote:
> 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 <[email protected]> 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 <[email protected]>
> > ---
> >  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
> > [email protected]
> > http://openvswitch.org/mailman/listinfo/dev
_______________________________________________
dev mailing list
[email protected]
http://openvswitch.org/mailman/listinfo/dev

Reply via email to