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

Luiz Capitulino <lcapitulino@redhat.com> writes:

> 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.)

An escape mechanism that can't be escaped sucks :)

>> 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.

I'll leave that to the poor guy who first needs to escape escapes.

[...]

  reply	other threads:[~2012-07-26 16:11 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
2012-07-26 16:11             ` Markus Armbruster [this message]
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=87394ev6x9.fsf@blackfin.pond.sub.org \
    --to=armbru@redhat.com \
    --cc=aliguori@us.ibm.com \
    --cc=lcapitulino@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.