qapi: Move gen_enum(), gen_enum_lookup() back to qapi/types.py
The next commit will split up qapi/common.py. gen_enum() needs QAPISchemaEnumMember, and that's in the way. Move it to qapi/types.py along with its buddy gen_enum_lookup(). Permit me a short a digression on history: how did gen_enum() end up in qapi/common.py? Commit21cd70dfc1
"qapi script: add event support" duplicated qapi-types.py's gen_enum() and gen_enum_lookup() in qapi-event.py. Simply importing them would have been cleaner, but wasn't possible as qapi-types.py was a program, not a module. Commitefd2eaa6c2
"qapi: De-duplicate enum code generation" de-duplicated by moving them to qapi.py, which was a module. Since then, program qapi-types.py has morphed into module types.py. It's where gen_enum() and gen_enum_lookup() started, and where they belong. Signed-off-by: Markus Armbruster <armbru@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Message-Id: <20191018074345.24034-6-armbru@redhat.com>
This commit is contained in:
parent
f01338cce6
commit
61bfb2e1a4
@ -2239,65 +2239,6 @@ def _wrap_ifcond(ifcond, before, after):
|
||||
return out
|
||||
|
||||
|
||||
def gen_enum_lookup(name, members, prefix=None):
|
||||
ret = mcgen('''
|
||||
|
||||
const QEnumLookup %(c_name)s_lookup = {
|
||||
.array = (const char *const[]) {
|
||||
''',
|
||||
c_name=c_name(name))
|
||||
for m in members:
|
||||
ret += gen_if(m.ifcond)
|
||||
index = c_enum_const(name, m.name, prefix)
|
||||
ret += mcgen('''
|
||||
[%(index)s] = "%(name)s",
|
||||
''',
|
||||
index=index, name=m.name)
|
||||
ret += gen_endif(m.ifcond)
|
||||
|
||||
ret += mcgen('''
|
||||
},
|
||||
.size = %(max_index)s
|
||||
};
|
||||
''',
|
||||
max_index=c_enum_const(name, '_MAX', prefix))
|
||||
return ret
|
||||
|
||||
|
||||
def gen_enum(name, members, prefix=None):
|
||||
# append automatically generated _MAX value
|
||||
enum_members = members + [QAPISchemaEnumMember('_MAX', None)]
|
||||
|
||||
ret = mcgen('''
|
||||
|
||||
typedef enum %(c_name)s {
|
||||
''',
|
||||
c_name=c_name(name))
|
||||
|
||||
for m in enum_members:
|
||||
ret += gen_if(m.ifcond)
|
||||
ret += mcgen('''
|
||||
%(c_enum)s,
|
||||
''',
|
||||
c_enum=c_enum_const(name, m.name, prefix))
|
||||
ret += gen_endif(m.ifcond)
|
||||
|
||||
ret += mcgen('''
|
||||
} %(c_name)s;
|
||||
''',
|
||||
c_name=c_name(name))
|
||||
|
||||
ret += mcgen('''
|
||||
|
||||
#define %(c_name)s_str(val) \\
|
||||
qapi_enum_lookup(&%(c_name)s_lookup, (val))
|
||||
|
||||
extern const QEnumLookup %(c_name)s_lookup;
|
||||
''',
|
||||
c_name=c_name(name))
|
||||
return ret
|
||||
|
||||
|
||||
def build_params(arg_type, boxed, extra=None):
|
||||
ret = ''
|
||||
sep = ''
|
||||
|
@ -13,6 +13,7 @@ See the COPYING file in the top-level directory.
|
||||
"""
|
||||
|
||||
from qapi.common import *
|
||||
from qapi.types import gen_enum, gen_enum_lookup
|
||||
|
||||
|
||||
def build_event_send_proto(name, arg_type, boxed):
|
||||
|
@ -21,6 +21,65 @@ from qapi.common import *
|
||||
objects_seen = set()
|
||||
|
||||
|
||||
def gen_enum_lookup(name, members, prefix=None):
|
||||
ret = mcgen('''
|
||||
|
||||
const QEnumLookup %(c_name)s_lookup = {
|
||||
.array = (const char *const[]) {
|
||||
''',
|
||||
c_name=c_name(name))
|
||||
for m in members:
|
||||
ret += gen_if(m.ifcond)
|
||||
index = c_enum_const(name, m.name, prefix)
|
||||
ret += mcgen('''
|
||||
[%(index)s] = "%(name)s",
|
||||
''',
|
||||
index=index, name=m.name)
|
||||
ret += gen_endif(m.ifcond)
|
||||
|
||||
ret += mcgen('''
|
||||
},
|
||||
.size = %(max_index)s
|
||||
};
|
||||
''',
|
||||
max_index=c_enum_const(name, '_MAX', prefix))
|
||||
return ret
|
||||
|
||||
|
||||
def gen_enum(name, members, prefix=None):
|
||||
# append automatically generated _MAX value
|
||||
enum_members = members + [QAPISchemaEnumMember('_MAX', None)]
|
||||
|
||||
ret = mcgen('''
|
||||
|
||||
typedef enum %(c_name)s {
|
||||
''',
|
||||
c_name=c_name(name))
|
||||
|
||||
for m in enum_members:
|
||||
ret += gen_if(m.ifcond)
|
||||
ret += mcgen('''
|
||||
%(c_enum)s,
|
||||
''',
|
||||
c_enum=c_enum_const(name, m.name, prefix))
|
||||
ret += gen_endif(m.ifcond)
|
||||
|
||||
ret += mcgen('''
|
||||
} %(c_name)s;
|
||||
''',
|
||||
c_name=c_name(name))
|
||||
|
||||
ret += mcgen('''
|
||||
|
||||
#define %(c_name)s_str(val) \\
|
||||
qapi_enum_lookup(&%(c_name)s_lookup, (val))
|
||||
|
||||
extern const QEnumLookup %(c_name)s_lookup;
|
||||
''',
|
||||
c_name=c_name(name))
|
||||
return ret
|
||||
|
||||
|
||||
def gen_fwd_object_or_array(name):
|
||||
return mcgen('''
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user