diff options
author | Markus Armbruster <armbru@redhat.com> | 2015-09-16 13:06:12 +0200 |
---|---|---|
committer | Markus Armbruster <armbru@redhat.com> | 2015-09-21 09:56:47 +0200 |
commit | efd2eaa6c2992c214a13f102b6ddd4dca4697fb3 (patch) | |
tree | a95c9cfc94d98038b0c850c06958c79d86ab08b2 /scripts | |
parent | ee44602857660e79f46547de02e26d65bcaf1519 (diff) | |
download | qemu-efd2eaa6c2992c214a13f102b6ddd4dca4697fb3.tar.gz qemu-efd2eaa6c2992c214a13f102b6ddd4dca4697fb3.tar.bz2 qemu-efd2eaa6c2992c214a13f102b6ddd4dca4697fb3.zip |
qapi: De-duplicate enum code generation
Duplicated in commit 21cd70d. Yes, we can't import qapi-types, but
that's no excuse. Move the helpers from qapi-types.py to qapi.py, and
replace the duplicates in qapi-event.py.
The generated event enumeration type's lookup table becomes
const-correct (see commit 2e4450f), and uses explicit indexes instead
of relying on order (see commit 912ae9c).
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Message-Id: <1442401589-24189-10-git-send-email-armbru@redhat.com>
Reviewed-by: Daniel P. Berrange <berrange@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Diffstat (limited to 'scripts')
-rw-r--r-- | scripts/qapi-event.py | 67 | ||||
-rw-r--r-- | scripts/qapi-types.py | 55 | ||||
-rw-r--r-- | scripts/qapi.py | 55 |
3 files changed, 59 insertions, 118 deletions
diff --git a/scripts/qapi-event.py b/scripts/qapi-event.py index aec2d32259..aed45d620c 100644 --- a/scripts/qapi-event.py +++ b/scripts/qapi-event.py @@ -153,63 +153,6 @@ def generate_event_implement(api_name, event_name, params): return ret - -# Following are the functions that generate an enum type for all defined -# events, similar to qapi-types.py. Here we already have enum name and -# values which were generated before and recorded in event_enum_*. It also -# works around the issue that "import qapi-types" can't work. - -def generate_event_enum_decl(event_enum_name, event_enum_values): - lookup_decl = mcgen(''' - -extern const char *%(event_enum_name)s_lookup[]; -''', - event_enum_name = event_enum_name) - - enum_decl = mcgen(''' -typedef enum %(event_enum_name)s { -''', - event_enum_name = event_enum_name) - - # append automatically generated _MAX value - enum_max_value = c_enum_const(event_enum_name, "MAX") - enum_values = event_enum_values + [ enum_max_value ] - - i = 0 - for value in enum_values: - enum_decl += mcgen(''' - %(value)s = %(i)d, -''', - value = value, - i = i) - i += 1 - - enum_decl += mcgen(''' -} %(event_enum_name)s; -''', - event_enum_name = event_enum_name) - - return lookup_decl + enum_decl - -def generate_event_enum_lookup(event_enum_name, event_enum_strings): - ret = mcgen(''' - -const char *%(event_enum_name)s_lookup[] = { -''', - event_enum_name = event_enum_name) - - for string in event_enum_strings: - ret += mcgen(''' - "%(string)s", -''', - string = string) - - ret += mcgen(''' - NULL, -}; -''') - return ret - (input_file, output_dir, do_c, do_h, prefix, dummy) = parse_command_line() c_comment = ''' @@ -266,8 +209,7 @@ fdecl.write(mcgen(''' exprs = QAPISchema(input_file).get_exprs() event_enum_name = c_name(prefix + "QAPIEvent", protect=False) -event_enum_values = [] -event_enum_strings = [] +event_names = [] for expr in exprs: if expr.has_key('event'): @@ -286,12 +228,11 @@ for expr in exprs: fdef.write(ret) # Record it, and generate enum later - event_enum_values.append(event_enum_value) - event_enum_strings.append(event_name) + event_names.append(event_name) -ret = generate_event_enum_decl(event_enum_name, event_enum_values) +ret = generate_enum(event_enum_name, event_names) fdecl.write(ret) -ret = generate_event_enum_lookup(event_enum_name, event_enum_strings) +ret = generate_enum_lookup(event_enum_name, event_names) fdef.write(ret) close_output(fdef, fdecl) diff --git a/scripts/qapi-types.py b/scripts/qapi-types.py index d78f529647..76c82d96b9 100644 --- a/scripts/qapi-types.py +++ b/scripts/qapi-types.py @@ -80,61 +80,6 @@ struct %(name)s { return ret -def generate_enum_lookup(name, values, prefix=None): - ret = mcgen(''' - -const char *const %(name)s_lookup[] = { -''', - name=c_name(name)) - for value in values: - index = c_enum_const(name, value, prefix) - ret += mcgen(''' - [%(index)s] = "%(value)s", -''', - index = index, value = value) - - max_index = c_enum_const(name, 'MAX', prefix) - ret += mcgen(''' - [%(max_index)s] = NULL, -}; -''', - max_index=max_index) - return ret - -def generate_enum(name, values, prefix=None): - name = c_name(name) - lookup_decl = mcgen(''' - -extern const char *const %(name)s_lookup[]; -''', - name=name) - - enum_decl = mcgen(''' - -typedef enum %(name)s { -''', - name=name) - - # append automatically generated _MAX value - enum_values = values + [ 'MAX' ] - - i = 0 - for value in enum_values: - enum_full_value = c_enum_const(name, value, prefix) - enum_decl += mcgen(''' - %(enum_full_value)s = %(i)d, -''', - enum_full_value = enum_full_value, - i=i) - i += 1 - - enum_decl += mcgen(''' -} %(name)s; -''', - name=name) - - return enum_decl + lookup_decl - def gen_alternate_qtypes_decl(name): return mcgen(''' diff --git a/scripts/qapi.py b/scripts/qapi.py index db5bc8533f..ba32aace99 100644 --- a/scripts/qapi.py +++ b/scripts/qapi.py @@ -1498,6 +1498,61 @@ def guardend(name): ''', name=guardname(name)) +def generate_enum_lookup(name, values, prefix=None): + ret = mcgen(''' + +const char *const %(name)s_lookup[] = { +''', + name=c_name(name)) + for value in values: + index = c_enum_const(name, value, prefix) + ret += mcgen(''' + [%(index)s] = "%(value)s", +''', + index = index, value = value) + + max_index = c_enum_const(name, 'MAX', prefix) + ret += mcgen(''' + [%(max_index)s] = NULL, +}; +''', + max_index=max_index) + return ret + +def generate_enum(name, values, prefix=None): + name = c_name(name) + lookup_decl = mcgen(''' + +extern const char *const %(name)s_lookup[]; +''', + name=name) + + enum_decl = mcgen(''' + +typedef enum %(name)s { +''', + name=name) + + # append automatically generated _MAX value + enum_values = values + [ 'MAX' ] + + i = 0 + for value in enum_values: + enum_full_value = c_enum_const(name, value, prefix) + enum_decl += mcgen(''' + %(enum_full_value)s = %(i)d, +''', + enum_full_value = enum_full_value, + i=i) + i += 1 + + enum_decl += mcgen(''' +} %(name)s; +''', + name=name) + + return enum_decl + lookup_decl + # # Common command line parsing # |