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
>
next prev parent 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).