qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Luiz Capitulino <lcapitulino@redhat.com>
To: Markus Armbruster <armbru@redhat.com>
Cc: qemu-devel@nongnu.org, Peter Maydell <peter.maydell@linaro.org>,
	aliguori@us.ibm.com, mdroth@linux.vnet.ibm.com,
	pbonzini@redhat.com
Subject: Re: [Qemu-devel] [PATCH 07/11] qapi: qapi.py: allow the "'" character be escaped
Date: Thu, 26 Jul 2012 10:47:49 -0300	[thread overview]
Message-ID: <20120726104749.5be67b6a@doriath.home> (raw)
In-Reply-To: <878ve6epif.fsf@blackfin.pond.sub.org>

On Thu, 26 Jul 2012 13:22:00 +0200
Markus Armbruster <armbru@redhat.com> wrote:

> Peter Maydell <peter.maydell@linaro.org> writes:
> 
> > On 25 July 2012 20:18, Luiz Capitulino <lcapitulino@redhat.com> wrote:
> >> Peter Maydell <peter.maydell@linaro.org> wrote:
> >>> On 25 July 2012 17:54, Luiz Capitulino <lcapitulino@redhat.com> wrote:
> >>> > --- a/scripts/qapi.py
> >>> > +++ b/scripts/qapi.py
> >>> > @@ -21,7 +21,9 @@ def tokenize(data):
> >>> >          elif data[0] == "'":
> >>> >              data = data[1:]
> >>> >              string = ''
> >>> > -            while data[0] != "'":
> >>> > +            while True:
> >>> > +                if data[0] == "'" and string[len(string)-1] != "\\":
> >>> > +                    break
> >>> >                  string += data[0]
> >>> >                  data = data[1:]
> >>> >              data = data[1:]
> >>>
> >>> Won't this cause us to look at string[-1] if
> >>> the input data has two ' characters in a row?
> >>
> >> Non escaped? If you meant '' that's a zero length string and should work, but
> >> if you meant 'foo '' bar' that's illegal, because ' characters
> >> should be escaped.
> >
> > I meant the zero length string case. yes. We come in with data = "''",
> > strip the first ' and set string to empty. Then in the first time
> > in the while loop data[0] is "'" but len(string) is 0 and so we'll
> > do string[-1] which I think will throw an exception.
> >
> > ...and yep, quick test of a nobbbled qapi-schema.json confirms:
> > $ python /home/pm215/src/qemu/qemu/scripts/qapi-types.py -h -o "." <
> > /home/pm215/src/qemu/qemu/qapi-schema.json
> > Traceback (most recent call last):
> >   File "/home/pm215/src/qemu/qemu/scripts/qapi-types.py", line 260, in <module>
> >     exprs = parse_schema(sys.stdin)
> >   File "/home/pm215/src/qemu/qemu/scripts/qapi.py", line 78, in parse_schema
> >     expr_eval = evaluate(expr)
> >   File "/home/pm215/src/qemu/qemu/scripts/qapi.py", line 64, in evaluate
> >     return parse(map(lambda x: x, tokenize(string)))[0]
> >   File "/home/pm215/src/qemu/qemu/scripts/qapi.py", line 25, in tokenize
> >     if data[0] == "'" and string[len(string)-1] != "\\":
> > IndexError: string index out of range
> >
> > Try this (very lightly tested but seems to work):
> > (feel free to do something nicer than raising an exception on
> > the syntax error, and sorry I'm feeling too lazy to make this
> > an actual patch email)
> >
> > Signed-off-by: Peter Maydell <peter.maydell@linaro.org>

Peter, I've replaced my original 07/11 patch with your patch below.

> >
> > --- a/scripts/qapi.py
> > +++ b/scripts/qapi.py
> > @@ -21,10 +21,16 @@ def tokenize(data):
> >          elif data[0] == "'":
> >              data = data[1:]
> >              string = ''
> > -            while data[0] != "'":
> > -                string += data[0]
> > -                data = data[1:]
> > -            data = data[1:]
> > +            while True:
> > +                pos = data.find("'")
> > +                if pos == -1:
> > +                    raise Exception("Mismatched quotes")
> > +                string += data[0:pos]
> > +                data = data[pos+1:]
> > +                if len(string) == 0 or string[-1] != "\\":
> > +                    # found a ' and it wasn't escaped
> > +                    break
> > +                string = string[0:-1] + "'"
> >              yield string
> >
> >  def parse(tokens):
> >
> > (if anybody wants to be able to use '\\' to escape escapes then
> > this approach is a bit stuffed, of course.)
> 
> For what it's worth, the orthodox way to lexically analyze strings is a
> finite automaton.  Utterly untested sketch:

Feel free to send a patch if you're strong about this.

> 
> diff --git a/scripts/qapi.py b/scripts/qapi.py
> index 8082af3..a745e92 100644
> --- a/scripts/qapi.py
> +++ b/scripts/qapi.py
> @@ -21,8 +21,17 @@ def tokenize(data):
>          elif data[0] == "'":
>              data = data[1:]
>              string = ''
> -            while data[0] != "'":
> -                string += data[0]
> +            esc = False
> +            while True:
> +                if esc:
> +                    string += data[0]
> +                    esc = False
> +                elif data[0] == "\\":
> +                    esc = True
> +                elif data[0] == "'":
> +                    break
> +                else
> +                    string += data[0]
>                  data = data[1:]
>              data = data[1:]
>              yield string
> 
> Doesn't handle missing close quote gracefully; you may want to add that.
> 
> >> PS: Peter, I get claustrophobic when reading emails from you :)
> >
> > I can add more blank lines if that helps? :-)
> >
> > -- PMM
> 

  reply	other threads:[~2012-07-26 13:53 UTC|newest]

Thread overview: 39+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-07-25 16:54 [Qemu-devel] [PATCH v2 00/11]: qapi: generate qerrors from qapi-schema-errors.json Luiz Capitulino
2012-07-25 16:54 ` [Qemu-devel] [PATCH 01/11] qerror: rename QERR_SOCKET_* macros Luiz Capitulino
2012-07-25 16:54 ` [Qemu-devel] [PATCH 02/11] qerror: rename QERR_SOCK_CONNECT_IN_PROGRESS Luiz Capitulino
2012-07-25 16:54 ` [Qemu-devel] [PATCH 03/11] qerror: rename QERR_QMP_EXTRA_MEMBER Luiz Capitulino
2012-07-25 16:54 ` [Qemu-devel] [PATCH 04/11] qerror: rename QERR_PROPERTY_VALUE_NOT_POWER_OF_2 Luiz Capitulino
2012-07-25 16:54 ` [Qemu-devel] [PATCH 05/11] qerror: QERR_DEVICE_ENCRYPTED: add filename info to human msg Luiz Capitulino
2012-07-25 16:54 ` [Qemu-devel] [PATCH 06/11] qerror: QERR_AMBIGUOUS_PATH: drop %(object) from " Luiz Capitulino
2012-07-26 11:12   ` Markus Armbruster
2012-07-26 14:15     ` Luiz Capitulino
2012-07-25 16:54 ` [Qemu-devel] [PATCH 07/11] qapi: qapi.py: allow the "'" character be escaped Luiz Capitulino
2012-07-25 17:45   ` Peter Maydell
2012-07-25 19:18     ` Luiz Capitulino
2012-07-25 19:47       ` Peter Maydell
2012-07-26 11:22         ` Markus Armbruster
2012-07-26 13:47           ` Luiz Capitulino [this message]
2012-07-26 16:11             ` Markus Armbruster
2012-07-26 17:09               ` [Qemu-devel] [PATCH] fixup! " Markus Armbruster
2012-07-26 18:21                 ` Peter Maydell
2012-07-27 14:29                 ` Luiz Capitulino
2012-07-28  6:37                   ` Markus Armbruster
2012-07-30 13:09                     ` Luiz Capitulino
2012-07-25 16:54 ` [Qemu-devel] [PATCH 08/11] qapi: add qapi-schema-errors.json Luiz Capitulino
2012-07-25 16:54 ` [Qemu-devel] [PATCH 09/11] qapi: add qapi-errors.py Luiz Capitulino
2012-07-26 11:50   ` Markus Armbruster
2012-07-26 11:55     ` Paolo Bonzini
2012-07-26 12:38       ` Eric Blake
2012-07-26 12:42         ` Eric Blake
2012-07-26 14:45       ` Luiz Capitulino
2012-07-26 14:34     ` Luiz Capitulino
2012-07-26 16:31       ` Markus Armbruster
2012-07-26 12:12   ` Markus Armbruster
2012-07-26 14:47     ` Luiz Capitulino
2012-07-25 16:54 ` [Qemu-devel] [PATCH 10/11] qerror: switch to qapi generated error macros and table Luiz Capitulino
2012-07-26 11:56   ` Markus Armbruster
2012-07-26 14:50     ` Luiz Capitulino
2012-07-26 16:05       ` Markus Armbruster
2012-07-26 16:52         ` Luiz Capitulino
2012-07-25 16:54 ` [Qemu-devel] [PATCH 11/11] scripts: update check-qerror.sh Luiz Capitulino
2012-07-26 11:57   ` Markus Armbruster

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20120726104749.5be67b6a@doriath.home \
    --to=lcapitulino@redhat.com \
    --cc=aliguori@us.ibm.com \
    --cc=armbru@redhat.com \
    --cc=mdroth@linux.vnet.ibm.com \
    --cc=pbonzini@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).