@@ -4,7 +4,6 @@ import sys
def generate_fwd_struct(name, members):
return mcgen('''
-
typedef struct %(name)s %(name)s;
typedef struct %(name)sList
@@ -15,34 +14,40 @@ typedef struct %(name)sList
''',
name=name)
-def generate_struct(name, members):
+def generate_struct(structname, fieldname, members):
ret = mcgen('''
-
struct %(name)s
{
''',
- name=name)
+ name=structname)
- for argname, argtype, optional in parse_args(members):
+ for argname, argentry, optional, structured in parse_args(members):
if optional:
ret += mcgen('''
bool has_%(c_name)s;
''',
c_name=c_var(argname))
- ret += mcgen('''
+ if structured:
+ push_indent()
+ ret += generate_struct("", argname, argentry)
+ pop_indent()
+ else:
+ ret += mcgen('''
%(c_type)s %(c_name)s;
''',
- c_type=c_type(argtype), c_name=c_var(argname))
+ c_type=c_type(argentry), c_name=c_var(argname))
+ if len(fieldname):
+ fieldname = " " + fieldname
ret += mcgen('''
-};
-''')
+}%(field)s;
+''',
+ field=fieldname)
return ret
def generate_handle(name, typeinfo):
return mcgen('''
-
typedef struct %(name)s
{
%(c_type)s handle;
@@ -58,7 +63,6 @@ typedef struct %(name)sList
def generate_enum(name, values):
ret = mcgen('''
-
typedef enum %(name)s
{
''',
@@ -83,7 +87,6 @@ typedef enum %(name)s
def generate_union(name, typeinfo):
ret = mcgen('''
-
struct %(name)s
{
%(name)sKind kind;
@@ -117,7 +120,7 @@ fdecl.write('''/* AUTOMATICALLY GENERATED, DO NOT MODIFY */
''')
for expr in exprs:
- ret = ''
+ ret = "\n"
if expr.has_key('type'):
ret += generate_fwd_struct(expr['type'], expr['data'])
elif expr.has_key('enum'):
@@ -125,18 +128,22 @@ for expr in exprs:
ret += generate_enum(expr['enum'], expr['data'])
elif expr.has_key('union'):
add_enum('%sKind' % expr['union'])
- ret += generate_fwd_struct(expr['union'], expr['data'])
+ ret += generate_fwd_struct(expr['union'], expr['data']) + "\n"
ret += generate_enum('%sKind' % expr['union'], expr['data'].keys())
+ else:
+ continue
fdecl.write(ret)
for expr in exprs:
- ret = ''
+ ret = "\n"
if expr.has_key('type'):
- ret += generate_struct(expr['type'], expr['data'])
+ ret += generate_struct(expr['type'], "", expr['data'])
elif expr.has_key('handle'):
ret += generate_handle(expr['handle'], expr['data'])
elif expr.has_key('union'):
ret += generate_union(expr['union'], expr['data'])
+ else:
+ continue
fdecl.write(ret)
fdecl.write('''
@@ -74,12 +74,15 @@ def parse_schema(fp):
def parse_args(typeinfo):
for member in typeinfo:
argname = member
- argtype = typeinfo[member]
+ argentry = typeinfo[member]
optional = False
+ structured = False
if member.startswith('*'):
argname = member[1:]
optional = True
- yield (argname, argtype, optional)
+ if isinstance(argentry, OrderedDict):
+ structured = True
+ yield (argname, argentry, optional, structured)
def de_camel_case(name):
new_name = ''
This generalizes the generate_struct() function to support generating structs for top-level named structs as well anonymous nested structs. generate_struct() now calls itself recursively to support arbitrary nesting by checking if a fields "type" is actually an OrderedDict. Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com> --- scripts/qapi-types.py | 39 +++++++++++++++++++++++---------------- scripts/qapi.py | 7 +++++-- 2 files changed, 28 insertions(+), 18 deletions(-)