From: "Lluís Vilanova" <vilanova@ac.upc.edu>
To: Luiz Capitulino <lcapitulino@redhat.com>
Cc: Stefan Hajnoczi <stefanha@gmail.com>, qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH 1/2] qapi: Add a primitive to include other files from a QAPI schema file
Date: Mon, 10 Feb 2014 20:44:18 +0100 [thread overview]
Message-ID: <87bnye4ust.fsf@fimbulvetr.bsc.es> (raw)
In-Reply-To: <20140210134726.5529f58b@redhat.com> (Luiz Capitulino's message of "Mon, 10 Feb 2014 13:47:26 -0500")
Luiz Capitulino writes:
> On Thu, 9 Jan 2014 11:59:55 +0100
> Lluís Vilanova <vilanova@ac.upc.edu> wrote:
>> Adds the "include(...)" primitive to the syntax of QAPI schema files.
> I don't know whether/how we want to break existing schema files, but a
> include() primitive will be needed soon or later.
> My only suggestion is that, _maybe_ we should change the scripts to
> take the schema file from the command-line (instead of stdin) and then
> we could use the schema's file path for relative paths (instead having
> the -i option).
That's simple enough, and looks much saner. I'll send a new version later.
Thanks,
Lluis
>>
>> Signed-off-by: Lluís Vilanova <vilanova@ac.upc.edu>
>> ---
>> scripts/qapi-commands.py | 10 +++++++---
>> scripts/qapi-types.py | 9 ++++++---
>> scripts/qapi-visit.py | 9 ++++++---
>> scripts/qapi.py | 25 ++++++++++++++++++++++---
>> 4 files changed, 41 insertions(+), 12 deletions(-)
>>
>> diff --git a/scripts/qapi-commands.py b/scripts/qapi-commands.py
>> index b12b696..c1d6461 100644
>> --- a/scripts/qapi-commands.py
>> +++ b/scripts/qapi-commands.py
>> @@ -389,13 +389,15 @@ def gen_command_def_prologue(prefix="", proxy=False):
>>
>>
>> try:
>> - opts, args = getopt.gnu_getopt(sys.argv[1:], "chp:o:m",
>> + opts, args = getopt.gnu_getopt(sys.argv[1:], "chp:i:o:m",
>> ["source", "header", "prefix=",
>> - "output-dir=", "type=", "middle"])
>> + "input-dir=", "output-dir=",
>> + "type=", "middle"])
>> except getopt.GetoptError, err:
>> print str(err)
>> sys.exit(1)
>>
>> +input_dir = ""
>> output_dir = ""
>> prefix = ""
>> dispatch_type = "sync"
>> @@ -409,6 +411,8 @@ do_h = False
>> for o, a in opts:
>> if o in ("-p", "--prefix"):
>> prefix = a
>> + elif o in ("-i", "--input-dir"):
>> + input_dir = a
>> elif o in ("-o", "--output-dir"):
>> output_dir = a + "/"
>> elif o in ("-t", "--type"):
>> @@ -440,7 +444,7 @@ except os.error, e:
>> if e.errno != errno.EEXIST:
>> raise
>>
>> -exprs = parse_schema(sys.stdin)
>> +exprs = parse_schema(sys.stdin, input_dir)
>> commands = filter(lambda expr: expr.has_key('command'), exprs)
>> commands = filter(lambda expr: not expr.has_key('gen'), commands)
>>
>> diff --git a/scripts/qapi-types.py b/scripts/qapi-types.py
>> index 4a1652b..36ff820 100644
>> --- a/scripts/qapi-types.py
>> +++ b/scripts/qapi-types.py
>> @@ -282,14 +282,15 @@ void qapi_free_%(type)s(%(c_type)s obj)
>>
>>
>> try:
>> - opts, args = getopt.gnu_getopt(sys.argv[1:], "chbp:o:",
>> + opts, args = getopt.gnu_getopt(sys.argv[1:], "chbp:i:o:",
>> ["source", "header", "builtins",
>> - "prefix=", "output-dir="])
>> + "prefix=", "input-dir=", "output-dir="])
>> except getopt.GetoptError, err:
>> print str(err)
>> sys.exit(1)
>>
>> output_dir = ""
>> +input_dir = ""
>> prefix = ""
>> c_file = 'qapi-types.c'
>> h_file = 'qapi-types.h'
>> @@ -301,6 +302,8 @@ do_builtins = False
>> for o, a in opts:
>> if o in ("-p", "--prefix"):
>> prefix = a
>> + elif o in ("-i", "--input-dir"):
>> + input_dir = a
>> elif o in ("-o", "--output-dir"):
>> output_dir = a + "/"
>> elif o in ("-c", "--source"):
>> @@ -381,7 +384,7 @@ fdecl.write(mcgen('''
>> ''',
>> guard=guardname(h_file)))
>>
>> -exprs = parse_schema(sys.stdin)
>> +exprs = parse_schema(sys.stdin, input_dir)
>> exprs = filter(lambda expr: not expr.has_key('gen'), exprs)
>>
>> fdecl.write(guardstart("QAPI_TYPES_BUILTIN_STRUCT_DECL"))
>> diff --git a/scripts/qapi-visit.py b/scripts/qapi-visit.py
>> index 65f1a54..6667e17 100644
>> --- a/scripts/qapi-visit.py
>> +++ b/scripts/qapi-visit.py
>> @@ -383,13 +383,14 @@ void visit_type_%(name)s(Visitor *m, %(name)s * obj, const char *name, Error **e
>> name=name)
>>
>> try:
>> - opts, args = getopt.gnu_getopt(sys.argv[1:], "chbp:o:",
>> + opts, args = getopt.gnu_getopt(sys.argv[1:], "chbp:i:o:",
>> ["source", "header", "builtins", "prefix=",
>> - "output-dir="])
>> + "input-dir=", "output-dir="])
>> except getopt.GetoptError, err:
>> print str(err)
>> sys.exit(1)
>>
>> +input_dir = ""
>> output_dir = ""
>> prefix = ""
>> c_file = 'qapi-visit.c'
>> @@ -402,6 +403,8 @@ do_builtins = False
>> for o, a in opts:
>> if o in ("-p", "--prefix"):
>> prefix = a
>> + elif o in ("-i", "--input-dir"):
>> + input_dir = a
>> elif o in ("-o", "--output-dir"):
>> output_dir = a + "/"
>> elif o in ("-c", "--source"):
>> @@ -480,7 +483,7 @@ fdecl.write(mcgen('''
>> ''',
>> prefix=prefix, guard=guardname(h_file)))
>>
>> -exprs = parse_schema(sys.stdin)
>> +exprs = parse_schema(sys.stdin, input_dir)
>>
>> # to avoid header dependency hell, we always generate declarations
>> # for built-in types in our header files and simply guard them
>> diff --git a/scripts/qapi.py b/scripts/qapi.py
>> index 750e9fb..9491269 100644
>> --- a/scripts/qapi.py
>> +++ b/scripts/qapi.py
>> @@ -11,9 +11,13 @@
>> # This work is licensed under the terms of the GNU GPLv2.
>> # See the COPYING.LIB file in the top-level directory.
>>
>> +import os
>> +import re
>> from ordereddict import OrderedDict
>> import sys
>>
>> +include_cre = re.compile("include\(\"([^\"]*)\"\)")
>> +
>> builtin_types = [
>> 'str', 'int', 'number', 'bool',
>> 'int8', 'int16', 'int32', 'int64',
>> @@ -54,8 +58,9 @@ class QAPISchemaError(Exception):
>>
>> class QAPISchema:
>>
>> - def __init__(self, fp):
>> + def __init__(self, fp, input_dir):
>> self.fp = fp
>> + self.input_dir = input_dir
>> self.src = fp.read()
>> if self.src == '' or self.src[-1] != '\n':
>> self.src += '\n'
>> @@ -100,6 +105,20 @@ class QAPISchema:
>> if self.cursor == len(self.src):
>> self.tok = None
>> return
>> + elif self.tok == 'i':
>> + include_src = self.src[self.cursor-1:]
>> + include_match = include_cre.match(include_src)
>> + if include_match is not None:
>> + include_path = os.path.join(self.input_dir,
>> + include_match.group(1))
>> + if not os.path.isfile(include_path):
>> + raise QAPISchemaError(
>> + self,
>> + 'Non-existing included file "%s"' % include_path)
>> + include_schema = QAPISchema(open(include_path),
>> + self.input_dir)
>> + self.exprs += include_schema.exprs
>> + self.cursor += include_match.span()[1] - 1
>> elif not self.tok.isspace():
>> raise QAPISchemaError(self, 'Stray "%s"' % self.tok)
>>
>> @@ -158,9 +177,9 @@ class QAPISchema:
>> raise QAPISchemaError(self, 'Expected "{", "[" or string')
>> return expr
>>
>> -def parse_schema(fp):
>> +def parse_schema(fp, input_dir):
>> try:
>> - schema = QAPISchema(fp)
>> + schema = QAPISchema(fp, input_dir)
>> except QAPISchemaError, e:
>> print >>sys.stderr, e
>> exit(1)
>>
>>
--
"And it's much the same thing with knowledge, for whenever you learn
something new, the whole world becomes that much richer."
-- The Princess of Pure Reason, as told by Norton Juster in The Phantom
Tollbooth
next prev parent reply other threads:[~2014-02-10 19:44 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-01-09 10:59 [Qemu-devel] [RFC][PATCH 0/2] qapi: Allow modularization of QAPI schema files Lluís Vilanova
2014-01-09 10:59 ` [Qemu-devel] [PATCH 1/2] qapi: Add a primitive to include other files from a QAPI schema file Lluís Vilanova
2014-02-10 18:47 ` Luiz Capitulino
2014-02-10 19:44 ` Lluís Vilanova [this message]
2014-01-09 11:00 ` [Qemu-devel] [PATCH 2/2] qapi: [trivial] Set the input root directory when parsing QAPI files Lluís Vilanova
2014-01-20 11:28 ` [Qemu-devel] [RFC][PATCH 0/2] qapi: Allow modularization of QAPI schema files Lluís Vilanova
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=87bnye4ust.fsf@fimbulvetr.bsc.es \
--to=vilanova@ac.upc.edu \
--cc=lcapitulino@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@gmail.com \
/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.