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 <mdr...@linux.vnet.ibm.com> --- scripts/qapi-types.py | 39 +++++++++++++++++++++++---------------- scripts/qapi.py | 7 +++++-- 2 files changed, 28 insertions(+), 18 deletions(-) diff --git a/scripts/qapi-types.py b/scripts/qapi-types.py index 42ad6a5..d645bad 100644 --- a/scripts/qapi-types.py +++ b/scripts/qapi-types.py @@ -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(''' diff --git a/scripts/qapi.py b/scripts/qapi.py index 74533d0..1bc4604 100644 --- a/scripts/qapi.py +++ b/scripts/qapi.py @@ -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 = '' -- 1.7.0.4