Store the length in the lookup table, i.e. change it from
const char *const[] to struct { int n, const char *const s[] }.
The following conditional enum entry change will create "hole"
elements in the generated lookup array, that should be skipped.
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
include/qapi/visitor.h | 2 +-
scripts/qapi.py | 11 +++++--
scripts/qapi-types.py | 6 ++++
scripts/qapi-visit.py | 2 +-
include/hw/qdev-core.h | 2 +-
include/qapi/util.h | 6 ++--
include/qom/object.h | 4 +--
qapi/qapi-visit-core.c | 24 +++++++-------
backends/hostmem.c | 4 +--
block.c | 3 +-
block/backup.c | 2 +-
block/blkdebug.c | 4 +--
block/file-posix.c | 17 +++++-----
block/file-win32.c | 6 ++--
block/gluster.c | 12 +++----
block/iscsi.c | 2 +-
block/nfs.c | 2 +-
block/parallels.c | 10 ++++--
block/qcow2.c | 14 ++++----
block/qed.c | 2 +-
block/quorum.c | 4 +--
block/rbd.c | 2 +-
block/sheepdog.c | 2 +-
blockdev.c | 7 ++--
blockjob.c | 6 ++--
chardev/char.c | 4 +--
crypto/block-luks.c | 38 +++++++++-------------
crypto/block.c | 4 +--
crypto/cipher-afalg.c | 2 +-
crypto/cipher-builtin.c | 8 ++---
crypto/cipher-gcrypt.c | 4 +--
crypto/cipher-nettle.c | 8 ++---
crypto/hmac-gcrypt.c | 2 +-
crypto/hmac-glib.c | 2 +-
crypto/hmac-nettle.c | 2 +-
crypto/pbkdf-gcrypt.c | 2 +-
crypto/pbkdf-nettle.c | 2 +-
crypto/secret.c | 2 +-
crypto/tlscreds.c | 2 +-
hmp.c | 64 +++++++++++++++++--------------------
hw/block/fdc.c | 6 ++--
hw/char/escc.c | 2 +-
hw/core/qdev-properties.c | 10 +++---
hw/input/virtio-input-hid.c | 4 +--
migration/colo-failover.c | 4 +--
migration/colo.c | 14 ++++----
migration/global_state.c | 5 ++-
monitor.c | 20 ++++++------
net/filter.c | 2 +-
net/net.c | 4 +--
qapi/qapi-util.c | 13 ++++----
qapi/qmp-dispatch.c | 2 +-
qemu-img.c | 6 ++--
qemu-nbd.c | 3 +-
qom/object.c | 16 +++++-----
tests/check-qom-proplist.c | 7 +++-
tests/test-qapi-util.c | 17 ++++------
tests/test-qobject-input-visitor.c | 8 ++---
tests/test-qobject-output-visitor.c | 2 +-
tests/test-string-input-visitor.c | 4 +--
tests/test-string-output-visitor.c | 4 +--
tpm.c | 4 +--
ui/input-legacy.c | 6 ++--
ui/input.c | 12 +++----
ui/vnc.c | 6 ++--
vl.c | 6 ++--
66 files changed, 241 insertions(+), 248 deletions(-)
diff --git a/include/qapi/visitor.h b/include/qapi/visitor.h
index 0f3b8cb459..62a51a54cb 100644
--- a/include/qapi/visitor.h
+++ b/include/qapi/visitor.h
@@ -469,7 +469,7 @@ bool visit_optional(Visitor *v, const char *name, bool *present);
* that visit_type_str() must have no unwelcome side effects.
*/
void visit_type_enum(Visitor *v, const char *name, int *obj,
- const char *const strings[], Error **errp);
+ const QEnumLookup *lookup, Error **errp);
/*
* Check if visitor is an input visitor.
diff --git a/scripts/qapi.py b/scripts/qapi.py
index a3ac799535..314d7e0365 100644
--- a/scripts/qapi.py
+++ b/scripts/qapi.py
@@ -1851,7 +1851,7 @@ def guardend(name):
def gen_enum_lookup(name, values, prefix=None):
ret = mcgen('''
-const char *const %(c_name)s_lookup[] = {
+static const char *const %(c_name)s_array[] = {
''',
c_name=c_name(name))
for value in values:
@@ -1865,8 +1865,13 @@ const char *const %(c_name)s_lookup[] = {
ret += mcgen('''
[%(max_index)s] = NULL,
};
+
+const QEnumLookup %(c_name)s_lookup = {
+ .array = %(c_name)s_array,
+ .size = %(max_index)s
+};
''',
- max_index=max_index)
+ max_index=max_index, c_name=c_name(name))
return ret
@@ -1896,7 +1901,7 @@ typedef enum %(c_name)s {
ret += mcgen('''
-extern const char *const %(c_name)s_lookup[];
+extern const QEnumLookup %(c_name)s_lookup;
''',
c_name=c_name(name))
return ret
diff --git a/scripts/qapi-types.py b/scripts/qapi-types.py
index b45e7b5634..dc05268917 100644
--- a/scripts/qapi-types.py
+++ b/scripts/qapi-types.py
@@ -179,6 +179,12 @@ class QAPISchemaGenTypeVisitor(QAPISchemaVisitor):
self.defn = ''
self._fwdecl = ''
self._btin = guardstart('QAPI_TYPES_BUILTIN')
+ self._btin += '''
+typedef struct QEnumLookup {
+ const char *const *array;
+ int size;
+} QEnumLookup;
+'''
def visit_end(self):
self.decl = self._fwdecl + self.decl
diff --git a/scripts/qapi-visit.py b/scripts/qapi-visit.py
index bd0b742236..7e1cfc13f0 100644
--- a/scripts/qapi-visit.py
+++ b/scripts/qapi-visit.py
@@ -153,7 +153,7 @@ def gen_visit_enum(name):
void visit_type_%(c_name)s(Visitor *v, const char *name, %(c_name)s *obj, Error **errp)
{
int value = *obj;
- visit_type_enum(v, name, &value, %(c_name)s_lookup, errp);
+ visit_type_enum(v, name, &value, &%(c_name)s_lookup, errp);
*obj = value;
}
''',
diff --git a/include/hw/qdev-core.h b/include/hw/qdev-core.h
index ae317286a4..089146197f 100644
--- a/include/hw/qdev-core.h
+++ b/include/hw/qdev-core.h
@@ -249,7 +249,7 @@ struct Property {
struct PropertyInfo {
const char *name;
const char *description;
- const char * const *enum_table;
+ const QEnumLookup *enum_table;
int (*print)(DeviceState *dev, Property *prop, char *dest, size_t len);
void (*set_default_value)(Object *obj, const Property *prop);
void (*create)(Object *obj, Property *prop, Error **errp);
diff --git a/include/qapi/util.h b/include/qapi/util.h
index 60733b6a80..613f82bdcd 100644
--- a/include/qapi/util.h
+++ b/include/qapi/util.h
@@ -11,10 +11,10 @@
#ifndef QAPI_UTIL_H
#define QAPI_UTIL_H
-const char *qapi_enum_lookup(const char * const lookup[], int val);
+const char *qapi_enum_lookup(const QEnumLookup *lookup, int val);
-int qapi_enum_parse(const char * const lookup[], const char *buf,
- int max, int def, Error **errp);
+int qapi_enum_parse(const QEnumLookup *lookup, const char *buf,
+ int def, Error **errp);
int parse_qapi_name(const char *name, bool complete);
diff --git a/include/qom/object.h b/include/qom/object.h
index 1b828994fa..f3e5cff37a 100644
--- a/include/qom/object.h
+++ b/include/qom/object.h
@@ -1415,14 +1415,14 @@ void object_class_property_add_bool(ObjectClass *klass, const char *name,
*/
void object_property_add_enum(Object *obj, const char *name,
const char *typename,
- const char * const *strings,
+ const QEnumLookup *lookup,
int (*get)(Object *, Error **),
void (*set)(Object *, int, Error **),
Error **errp);
void object_class_property_add_enum(ObjectClass *klass, const char *name,
const char *typename,
- const char * const *strings,
+ const QEnumLookup *lookup,
int (*get)(Object *, Error **),
void (*set)(Object *, int, Error **),
Error **errp);
diff --git a/qapi/qapi-visit-core.c b/qapi/qapi-visit-core.c
index ed6d2af462..8876ecf0cd 100644
--- a/qapi/qapi-visit-core.c
+++ b/qapi/qapi-visit-core.c
@@ -333,24 +333,22 @@ void visit_type_null(Visitor *v, const char *name, QNull **obj,
}
static void output_type_enum(Visitor *v, const char *name, int *obj,
- const char *const strings[], Error **errp)
+ const QEnumLookup *lookup, Error **errp)
{
- int i = 0;
int value = *obj;
char *enum_str;
- while (strings[i++] != NULL);
- if (value < 0 || value >= i - 1) {
+ if (value < 0 || value > lookup->size || !lookup->array[value]) {
error_setg(errp, QERR_INVALID_PARAMETER, name ? name : "null");
return;
}
- enum_str = (char *)strings[value];
+ enum_str = (char *)lookup->array[value];
visit_type_str(v, name, &enum_str, errp);
}
static void input_type_enum(Visitor *v, const char *name, int *obj,
- const char *const strings[], Error **errp)
+ const QEnumLookup *lookup, Error **errp)
{
Error *local_err = NULL;
int64_t value = 0;
@@ -362,14 +360,14 @@ static void input_type_enum(Visitor *v, const char *name, int *obj,
return;
}
- while (strings[value] != NULL) {
- if (strcmp(strings[value], enum_str) == 0) {
+ while (value < lookup->size) {
+ if (!g_strcmp0(lookup->array[value], enum_str)) {
break;
}
value++;
}
- if (strings[value] == NULL) {
+ if (value == lookup->size) {
error_setg(errp, QERR_INVALID_PARAMETER, enum_str);
g_free(enum_str);
return;
@@ -380,16 +378,16 @@ static void input_type_enum(Visitor *v, const char *name, int *obj,
}
void visit_type_enum(Visitor *v, const char *name, int *obj,
- const char *const strings[], Error **errp)
+ const QEnumLookup *lookup, Error **errp)
{
- assert(obj && strings);
+ assert(obj && lookup);
trace_visit_type_enum(v, name, obj);
switch (v->type) {
case VISITOR_INPUT:
- input_type_enum(v, name, obj, strings, errp);
+ input_type_enum(v, name, obj, lookup, errp);
break;
case VISITOR_OUTPUT:
- output_type_enum(v, name, obj, strings, errp);
+ output_type_enum(v, name, obj, lookup, errp);
break;
case VISITOR_CLONE:
/* nothing further to do, scalar value was already copied by
diff --git a/backends/hostmem.c b/backends/hostmem.c
index c4f795475c..ce430f1d14 100644
--- a/backends/hostmem.c
+++ b/backends/hostmem.c
@@ -305,7 +305,7 @@ host_memory_backend_memory_complete(UserCreatable *uc, Error **errp)
return;
} else if (maxnode == 0 && backend->policy != MPOL_DEFAULT) {
error_setg(errp, "host-nodes must be set for policy %s",
- qapi_enum_lookup(HostMemPolicy_lookup, backend->policy));
+ qapi_enum_lookup(&HostMemPolicy_lookup, backend->policy));
return;
}
@@ -396,7 +396,7 @@ host_memory_backend_class_init(ObjectClass *oc, void *data)
host_memory_backend_set_host_nodes,
NULL, NULL, &error_abort);
object_class_property_add_enum(oc, "policy", "HostMemPolicy",
- HostMemPolicy_lookup,
+ &HostMemPolicy_lookup,
host_memory_backend_get_policy,
host_memory_backend_set_policy, &error_abort);
object_class_property_add_str(oc, "id", get_id, set_id, &error_abort);
diff --git a/block.c b/block.c
index 3615a6809e..ffb1f8db13 100644
--- a/block.c
+++ b/block.c
@@ -1333,9 +1333,8 @@ static int bdrv_open_common(BlockDriverState *bs, BlockBackend *file,
detect_zeroes = qemu_opt_get(opts, "detect-zeroes");
if (detect_zeroes) {
BlockdevDetectZeroesOptions value =
- qapi_enum_parse(BlockdevDetectZeroesOptions_lookup,
+ qapi_enum_parse(&BlockdevDetectZeroesOptions_lookup,
detect_zeroes,
- BLOCKDEV_DETECT_ZEROES_OPTIONS__MAX,
BLOCKDEV_DETECT_ZEROES_OPTIONS_OFF,
&local_err);
if (local_err) {
diff --git a/block/backup.c b/block/backup.c
index a700cc0315..8d4f3bcc13 100644
--- a/block/backup.c
+++ b/block/backup.c
@@ -597,7 +597,7 @@ BlockJob *backup_job_create(const char *job_id, BlockDriverState *bs,
error_setg(errp,
"a sync_bitmap was provided to backup_run, "
"but received an incompatible sync_mode (%s)",
- qapi_enum_lookup(MirrorSyncMode_lookup, sync_mode));
+ qapi_enum_lookup(&MirrorSyncMode_lookup, sync_mode));
return NULL;
}
diff --git a/block/blkdebug.c b/block/blkdebug.c
index 50edda2a31..94068156dc 100644
--- a/block/blkdebug.c
+++ b/block/blkdebug.c
@@ -170,7 +170,7 @@ static int add_rule(void *opaque, QemuOpts *opts, Error **errp)
error_setg(errp, "Missing event name for rule");
return -1;
}
- event = qapi_enum_parse(BlkdebugEvent_lookup, event_name, BLKDBG__MAX, -1, errp);
+ event = qapi_enum_parse(&BlkdebugEvent_lookup, event_name, -1, errp);
if (event < 0) {
return -1;
}
@@ -733,7 +733,7 @@ static int blkdebug_debug_breakpoint(BlockDriverState *bs, const char *event,
struct BlkdebugRule *rule;
int blkdebug_event;
- blkdebug_event = qapi_enum_parse(BlkdebugEvent_lookup, event, BLKDBG__MAX, -1, NULL);
+ blkdebug_event = qapi_enum_parse(&BlkdebugEvent_lookup, event, -1, NULL);
if (blkdebug_event < 0) {
return -ENOENT;
}
diff --git a/block/file-posix.c b/block/file-posix.c
index 48200aef0b..578f9aae39 100644
--- a/block/file-posix.c
+++ b/block/file-posix.c
@@ -438,8 +438,8 @@ static int raw_open_common(BlockDriverState *bs, QDict *options,
aio_default = (bdrv_flags & BDRV_O_NATIVE_AIO)
? BLOCKDEV_AIO_OPTIONS_NATIVE
: BLOCKDEV_AIO_OPTIONS_THREADS;
- aio = qapi_enum_parse(BlockdevAioOptions_lookup, qemu_opt_get(opts, "aio"),
- BLOCKDEV_AIO_OPTIONS__MAX, aio_default, &local_err);
+ aio = qapi_enum_parse(&BlockdevAioOptions_lookup, qemu_opt_get(opts, "aio"),
+ aio_default, &local_err);
if (local_err) {
error_propagate(errp, local_err);
ret = -EINVAL;
@@ -447,8 +447,8 @@ static int raw_open_common(BlockDriverState *bs, QDict *options,
}
s->use_linux_aio = (aio == BLOCKDEV_AIO_OPTIONS_NATIVE);
- locking = qapi_enum_parse(OnOffAuto_lookup, qemu_opt_get(opts, "locking"),
- ON_OFF_AUTO__MAX, ON_OFF_AUTO_AUTO, &local_err);
+ locking = qapi_enum_parse(&OnOffAuto_lookup, qemu_opt_get(opts, "locking"),
+ ON_OFF_AUTO_AUTO, &local_err);
if (local_err) {
error_propagate(errp, local_err);
ret = -EINVAL;
@@ -1725,7 +1725,7 @@ static int raw_regular_truncate(int fd, int64_t offset, PreallocMode prealloc,
default:
result = -ENOTSUP;
error_setg(errp, "Unsupported preallocation mode: %s",
- qapi_enum_lookup(PreallocMode_lookup, prealloc));
+ qapi_enum_lookup(&PreallocMode_lookup, prealloc));
return result;
}
@@ -1760,7 +1760,7 @@ static int raw_truncate(BlockDriverState *bs, int64_t offset,
if (prealloc != PREALLOC_MODE_OFF) {
error_setg(errp, "Preallocation mode '%s' unsupported for this "
- "non-regular file", qapi_enum_lookup(PreallocMode_lookup,
+ "non-regular file", qapi_enum_lookup(&PreallocMode_lookup,
prealloc));
return -ENOTSUP;
}
@@ -1975,9 +1975,8 @@ static int raw_create(const char *filename, QemuOpts *opts, Error **errp)
BDRV_SECTOR_SIZE);
nocow = qemu_opt_get_bool(opts, BLOCK_OPT_NOCOW, false);
buf = qemu_opt_get_del(opts, BLOCK_OPT_PREALLOC);
- prealloc = qapi_enum_parse(PreallocMode_lookup, buf,
- PREALLOC_MODE__MAX, PREALLOC_MODE_OFF,
- &local_err);
+ prealloc = qapi_enum_parse(&PreallocMode_lookup, buf,
+ PREALLOC_MODE_OFF, &local_err);
g_free(buf);
if (local_err) {
error_propagate(errp, local_err);
diff --git a/block/file-win32.c b/block/file-win32.c
index 2f3975f040..be4146e030 100644
--- a/block/file-win32.c
+++ b/block/file-win32.c
@@ -303,8 +303,8 @@ static bool get_aio_option(QemuOpts *opts, int flags, Error **errp)
aio_default = (flags & BDRV_O_NATIVE_AIO) ? BLOCKDEV_AIO_OPTIONS_NATIVE
: BLOCKDEV_AIO_OPTIONS_THREADS;
- aio = qapi_enum_parse(BlockdevAioOptions_lookup, qemu_opt_get(opts, "aio"),
- BLOCKDEV_AIO_OPTIONS__MAX, aio_default, errp);
+ aio = qapi_enum_parse(&BlockdevAioOptions_lookup, qemu_opt_get(opts, "aio"),
+ aio_default, errp);
switch (aio) {
case BLOCKDEV_AIO_OPTIONS_NATIVE:
@@ -470,7 +470,7 @@ static int raw_truncate(BlockDriverState *bs, int64_t offset,
if (prealloc != PREALLOC_MODE_OFF) {
error_setg(errp, "Unsupported preallocation mode '%s'",
- qapi_enum_lookup(reallocMode_lookup, prealloc));
+ qapi_enum_lookup(&reallocMode_lookup, prealloc));
return -ENOTSUP;
}
diff --git a/block/gluster.c b/block/gluster.c
index 934f459014..bc8eff5dd3 100644
--- a/block/gluster.c
+++ b/block/gluster.c
@@ -544,8 +544,7 @@ static int qemu_gluster_parse_json(BlockdevOptionsGluster *gconf,
if (!strcmp(ptr, "tcp")) {
ptr = "inet"; /* accept legacy "tcp" */
}
- type = qapi_enum_parse(SocketAddressType_lookup, ptr,
- SOCKET_ADDRESS_TYPE__MAX, -1, NULL);
+ type = qapi_enum_parse(&SocketAddressType_lookup, ptr, -1, NULL);
if (type != SOCKET_ADDRESS_TYPE_INET
&& type != SOCKET_ADDRESS_TYPE_UNIX) {
error_setg(&local_err,
@@ -1002,9 +1001,8 @@ static int qemu_gluster_create(const char *filename,
BDRV_SECTOR_SIZE);
tmp = qemu_opt_get_del(opts, BLOCK_OPT_PREALLOC);
- prealloc = qapi_enum_parse(PreallocMode_lookup, tmp,
- PREALLOC_MODE__MAX, PREALLOC_MODE_OFF,
- &local_err);
+ prealloc = qapi_enum_parse(&PreallocMode_lookup, tmp,
+ PREALLOC_MODE_OFF, &local_err);
g_free(tmp);
if (local_err) {
error_propagate(errp, local_err);
@@ -1050,7 +1048,7 @@ static int qemu_gluster_create(const char *filename,
default:
ret = -EINVAL;
error_setg(errp, "Unsupported preallocation mode: %s",
- qapi_enum_lookup(PreallocMode_lookup, prealloc));
+ qapi_enum_lookup(&PreallocMode_lookup, prealloc));
break;
}
@@ -1102,7 +1100,7 @@ static int qemu_gluster_truncate(BlockDriverState *bs, int64_t offset,
if (prealloc != PREALLOC_MODE_OFF) {
error_setg(errp, "Unsupported preallocation mode '%s'",
- qapi_enum_lookup(PreallocMode_lookup, prealloc));
+ qapi_enum_lookup(&PreallocMode_lookup, prealloc));
return -ENOTSUP;
}
diff --git a/block/iscsi.c b/block/iscsi.c
index 5c1870340b..c6bb0049bf 100644
--- a/block/iscsi.c
+++ b/block/iscsi.c
@@ -2088,7 +2088,7 @@ static int iscsi_truncate(BlockDriverState *bs, int64_t offset,
if (prealloc != PREALLOC_MODE_OFF) {
error_setg(errp, "Unsupported preallocation mode '%s'",
- qapi_enum_lookup(PreallocMode_lookup, prealloc));
+ qapi_enum_lookup(&PreallocMode_lookup, prealloc));
return -ENOTSUP;
}
diff --git a/block/nfs.c b/block/nfs.c
index 953728ae31..f0ac050169 100644
--- a/block/nfs.c
+++ b/block/nfs.c
@@ -773,7 +773,7 @@ static int nfs_file_truncate(BlockDriverState *bs, int64_t offset,
if (prealloc != PREALLOC_MODE_OFF) {
error_setg(errp, "Unsupported preallocation mode '%s'",
- qapi_enum_lookup(PreallocMode_lookup, prealloc));
+ qapi_enum_lookup(&PreallocMode_lookup, prealloc));
return -ENOTSUP;
}
diff --git a/block/parallels.c b/block/parallels.c
index e1e06d23cc..f870bbac3e 100644
--- a/block/parallels.c
+++ b/block/parallels.c
@@ -69,12 +69,16 @@ typedef enum ParallelsPreallocMode {
PRL_PREALLOC_MODE__MAX = 2,
} ParallelsPreallocMode;
-static const char *prealloc_mode_lookup[] = {
+static const char *prealloc_mode_array[] = {
"falloc",
"truncate",
NULL,
};
+static QEnumLookup prealloc_mode_lookup = {
+ .array = prealloc_mode_array,
+ .size = G_N_ELEMENTS(prealloc_mode_array),
+};
typedef struct BDRVParallelsState {
/** Locking is conservative, the lock protects
@@ -696,8 +700,8 @@ static int parallels_open(BlockDriverState *bs, QDict *options, int flags,
qemu_opt_get_size_del(opts, PARALLELS_OPT_PREALLOC_SIZE, 0);
s->prealloc_size = MAX(s->tracks, s->prealloc_size >> BDRV_SECTOR_BITS);
buf = qemu_opt_get_del(opts, PARALLELS_OPT_PREALLOC_MODE);
- s->prealloc_mode = qapi_enum_parse(prealloc_mode_lookup, buf,
- PRL_PREALLOC_MODE__MAX, PRL_PREALLOC_MODE_FALLOCATE, &local_err);
+ s->prealloc_mode = qapi_enum_parse(&prealloc_mode_lookup, buf,
+ PRL_PREALLOC_MODE_FALLOCATE, &local_err);
g_free(buf);
if (local_err != NULL) {
goto fail_options;
diff --git a/block/qcow2.c b/block/qcow2.c
index 45b0579caa..c72fa2b476 100644
--- a/block/qcow2.c
+++ b/block/qcow2.c
@@ -2733,7 +2733,7 @@ static int qcow2_create2(const char *filename, int64_t total_size,
qcow2_calc_prealloc_size(total_size, cluster_size, refcount_order);
qemu_opt_set_number(opts, BLOCK_OPT_SIZE, prealloc_size, &error_abort);
qemu_opt_set(opts, BLOCK_OPT_PREALLOC,
- qapi_enum_lookup(PreallocMode_lookup, prealloc),
+ qapi_enum_lookup(&PreallocMode_lookup, prealloc),
&error_abort);
}
@@ -2933,9 +2933,8 @@ static int qcow2_create(const char *filename, QemuOpts *opts, Error **errp)
goto finish;
}
buf = qemu_opt_get_del(opts, BLOCK_OPT_PREALLOC);
- prealloc = qapi_enum_parse(PreallocMode_lookup, buf,
- PREALLOC_MODE__MAX, PREALLOC_MODE_OFF,
- &local_err);
+ prealloc = qapi_enum_parse(&PreallocMode_lookup, buf,
+ PREALLOC_MODE_OFF, &local_err);
if (local_err) {
error_propagate(errp, local_err);
ret = -EINVAL;
@@ -3099,7 +3098,7 @@ static int qcow2_truncate(BlockDriverState *bs, int64_t offset,
prealloc != PREALLOC_MODE_FALLOC && prealloc != PREALLOC_MODE_FULL)
{
error_setg(errp, "Unsupported preallocation mode '%s'",
- qapi_enum_lookup(PreallocMode_lookup, prealloc));
+ qapi_enum_lookup(&PreallocMode_lookup, prealloc));
return -ENOTSUP;
}
@@ -3624,9 +3623,8 @@ static BlockMeasureInfo *qcow2_measure(QemuOpts *opts, BlockDriverState *in_bs,
}
optstr = qemu_opt_get_del(opts, BLOCK_OPT_PREALLOC);
- prealloc = qapi_enum_parse(PreallocMode_lookup, optstr,
- PREALLOC_MODE__MAX, PREALLOC_MODE_OFF,
- &local_err);
+ prealloc = qapi_enum_parse(&PreallocMode_lookup, optstr,
+ PREALLOC_MODE_OFF, &local_err);
g_free(optstr);
if (local_err) {
goto err;
diff --git a/block/qed.c b/block/qed.c
index 756fcb85a7..aec2a559ce 100644
--- a/block/qed.c
+++ b/block/qed.c
@@ -1400,7 +1400,7 @@ static int bdrv_qed_truncate(BlockDriverState *bs, int64_t offset,
if (prealloc != PREALLOC_MODE_OFF) {
error_setg(errp, "Unsupported preallocation mode '%s'",
- qapi_enum_lookup(PreallocMode_lookup, prealloc));
+ qapi_enum_lookup(&PreallocMode_lookup, prealloc));
return -ENOTSUP;
}
diff --git a/block/quorum.c b/block/quorum.c
index e4271caa7a..44acd2702c 100644
--- a/block/quorum.c
+++ b/block/quorum.c
@@ -911,9 +911,9 @@ static int quorum_open(BlockDriverState *bs, QDict *options, int flags,
if (!qemu_opt_get(opts, QUORUM_OPT_READ_PATTERN)) {
ret = QUORUM_READ_PATTERN_QUORUM;
} else {
- ret = qapi_enum_parse(QuorumReadPattern_lookup,
+ ret = qapi_enum_parse(&QuorumReadPattern_lookup,
qemu_opt_get(opts, QUORUM_OPT_READ_PATTERN),
- QUORUM_READ_PATTERN__MAX, -EINVAL, NULL);
+ -EINVAL, NULL);
}
if (ret < 0) {
error_setg(&local_err, "Please set read-pattern as fifo or quorum");
diff --git a/block/rbd.c b/block/rbd.c
index 09f8d18d1b..ff71259f05 100644
--- a/block/rbd.c
+++ b/block/rbd.c
@@ -945,7 +945,7 @@ static int qemu_rbd_truncate(BlockDriverState *bs, int64_t offset,
if (prealloc != PREALLOC_MODE_OFF) {
error_setg(errp, "Unsupported preallocation mode '%s'",
- qapi_enum_lookup(PreallocMode_lookup, prealloc));
+ qapi_enum_lookup(&PreallocMode_lookup, prealloc));
return -ENOTSUP;
}
diff --git a/block/sheepdog.c b/block/sheepdog.c
index 69d49fb720..9eac7c0ec7 100644
--- a/block/sheepdog.c
+++ b/block/sheepdog.c
@@ -2177,7 +2177,7 @@ static int sd_truncate(BlockDriverState *bs, int64_t offset,
if (prealloc != PREALLOC_MODE_OFF) {
error_setg(errp, "Unsupported preallocation mode '%s'",
- qapi_enum_lookup(PreallocMode_lookup, prealloc));
+ qapi_enum_lookup(&PreallocMode_lookup, prealloc));
return -ENOTSUP;
}
diff --git a/blockdev.c b/blockdev.c
index 6a067e81bf..7834b8830e 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -438,9 +438,8 @@ static void extract_common_blockdev_options(QemuOpts *opts, int *bdrv_flags,
if (detect_zeroes) {
*detect_zeroes =
- qapi_enum_parse(BlockdevDetectZeroesOptions_lookup,
+ qapi_enum_parse(&BlockdevDetectZeroesOptions_lookup,
qemu_opt_get(opts, "detect-zeroes"),
- BLOCKDEV_DETECT_ZEROES_OPTIONS__MAX,
BLOCKDEV_DETECT_ZEROES_OPTIONS_OFF,
&local_error);
if (local_error) {
@@ -1468,9 +1467,9 @@ static int action_check_completion_mode(BlkActionState *s, Error **errp)
error_setg(errp,
"Action '%s' does not support Transaction property "
"completion-mode = %s",
- qapi_enum_lookup(TransactionActionKind_lookup,
+ qapi_enum_lookup(&TransactionActionKind_lookup,
s->action->type),
- qapi_enum_lookup(ActionCompletionMode_lookup,
+ qapi_enum_lookup(&ActionCompletionMode_lookup,
s->txn_props->completion_mode));
return -1;
}
diff --git a/blockjob.c b/blockjob.c
index fca71123e0..3c815b89e4 100644
--- a/blockjob.c
+++ b/blockjob.c
@@ -209,7 +209,7 @@ static char *child_job_get_parent_desc(BdrvChild *c)
{
BlockJob *job = c->opaque;
return g_strdup_printf("%s job '%s'",
- qapi_enum_lookup(BlockJobType_lookup,
+ qapi_enum_lookup(&BlockJobType_lookup,
job->driver->job_type),
job->id);
}
@@ -555,7 +555,7 @@ BlockJobInfo *block_job_query(BlockJob *job, Error **errp)
return NULL;
}
info = g_new0(BlockJobInfo, 1);
- info->type = g_strdup(qapi_enum_lookup(BlockJobType_lookup,
+ info->type = g_strdup(qapi_enum_lookup(&BlockJobType_lookup,
job->driver->job_type));
info->device = g_strdup(job->id);
info->len = job->len;
@@ -669,7 +669,7 @@ void *block_job_create(const char *job_id, const BlockJobDriver *driver,
job->refcnt = 1;
error_setg(&job->blocker, "block device is in use by block job: %s",
- qapi_enum_lookup(BlockJobType_lookup, driver->job_type));
+ qapi_enum_lookup(&BlockJobType_lookup, driver->job_type));
block_job_add_bdrv(job, "main node", bs, 0, BLK_PERM_ALL, &error_abort);
bs->job = job;
diff --git a/chardev/char.c b/chardev/char.c
index 4408d12a08..ba2d110ae5 100644
--- a/chardev/char.c
+++ b/chardev/char.c
@@ -932,7 +932,7 @@ ChardevReturn *qmp_chardev_add(const char *id, ChardevBackend *backend,
ChardevReturn *ret;
Chardev *chr;
- cc = char_get_class(qapi_enum_lookup(ChardevBackendKind_lookup,
+ cc = char_get_class(qapi_enum_lookup(&ChardevBackendKind_lookup,
backend->type), errp);
if (!cc) {
return NULL;
@@ -991,7 +991,7 @@ ChardevReturn *qmp_chardev_change(const char *id, ChardevBackend *backend,
return NULL;
}
- cc = char_get_class(qapi_enum_lookup(ChardevBackendKind_lookup,
+ cc = char_get_class(qapi_enum_lookup(&ChardevBackendKind_lookup,
backend->type), errp);
if (!cc) {
return NULL;
diff --git a/crypto/block-luks.c b/crypto/block-luks.c
index b78a6345f3..a3c96d768b 100644
--- a/crypto/block-luks.c
+++ b/crypto/block-luks.c
@@ -258,47 +258,39 @@ qcrypto_block_luks_cipher_alg_lookup(QCryptoCipherAlgorithm alg,
}
error_setg(errp, "Algorithm '%s' not supported",
- qapi_enum_lookup(QCryptoCipherAlgorithm_lookup, alg));
+ qapi_enum_lookup(&QCryptoCipherAlgorithm_lookup, alg));
return NULL;
}
-/* XXX replace with qapi_enum_parse() in future, when we can
+/* XXX replace with qapi_enum_parse(&) in future, when we can
* make that function emit a more friendly error message */
static int qcrypto_block_luks_name_lookup(const char *name,
- const char *const *map,
- size_t maplen,
+ const QEnumLookup *lookup,
const char *type,
Error **errp)
{
- size_t i;
- for (i = 0; i < maplen; i++) {
- if (g_str_equal(map[i], name)) {
- return i;
- }
+ int i = qapi_enum_parse(lookup, name, -1, NULL);
+ if (i < 0) {
+ error_setg(errp, "%s %s not supported", type, name);
}
-
- error_setg(errp, "%s %s not supported", type, name);
- return 0;
+ return i;
}
#define qcrypto_block_luks_cipher_mode_lookup(name, errp) \
qcrypto_block_luks_name_lookup(name, \
- QCryptoCipherMode_lookup, \
- QCRYPTO_CIPHER_MODE__MAX, \
+ &QCryptoCipherMode_lookup, \
"Cipher mode", \
errp)
#define qcrypto_block_luks_hash_name_lookup(name, errp) \
qcrypto_block_luks_name_lookup(name, \
- QCryptoHashAlgorithm_lookup, \
- QCRYPTO_HASH_ALG__MAX, \
+ &QCryptoHashAlgorithm_lookup, \
"Hash algorithm", \
errp)
#define qcrypto_block_luks_ivgen_name_lookup(name, errp) \
qcrypto_block_luks_name_lookup(name, \
- QCryptoIVGenAlgorithm_lookup, \
- QCRYPTO_IVGEN_ALG__MAX, \
+ &QCryptoIVGenAlgorithm_lookup, \
"IV generator", \
errp)
@@ -399,7 +391,7 @@ qcrypto_block_luks_essiv_cipher(QCryptoCipherAlgorithm cipher,
break;
default:
error_setg(errp, "Cipher %s not supported with essiv",
- qapi_enum_lookup(QCryptoCipherAlgorithm_lookup, cipher));
+ qapi_enum_lookup(&QCryptoCipherAlgorithm_lookup, cipher));
return 0;
}
}
@@ -969,19 +961,19 @@ qcrypto_block_luks_create(QCryptoBlock *block,
goto error;
}
- cipher_mode = qapi_enum_lookup(QCryptoCipherMode_lookup,
+ cipher_mode = qapi_enum_lookup(&QCryptoCipherMode_lookup,
luks_opts.cipher_mode);
- ivgen_alg = qapi_enum_lookup(QCryptoIVGenAlgorithm_lookup,
+ ivgen_alg = qapi_enum_lookup(&QCryptoIVGenAlgorithm_lookup,
luks_opts.ivgen_alg);
if (luks_opts.has_ivgen_hash_alg) {
- ivgen_hash_alg = qapi_enum_lookup(QCryptoHashAlgorithm_lookup,
+ ivgen_hash_alg = qapi_enum_lookup(&QCryptoHashAlgorithm_lookup,
luks_opts.ivgen_hash_alg);
cipher_mode_spec = g_strdup_printf("%s-%s:%s", cipher_mode, ivgen_alg,
ivgen_hash_alg);
} else {
cipher_mode_spec = g_strdup_printf("%s-%s", cipher_mode, ivgen_alg);
}
- hash_alg = qapi_enum_lookup(QCryptoHashAlgorithm_lookup,
+ hash_alg = qapi_enum_lookup(&QCryptoHashAlgorithm_lookup,
luks_opts.hash_alg);
diff --git a/crypto/block.c b/crypto/block.c
index 2140e55426..99606fe63a 100644
--- a/crypto/block.c
+++ b/crypto/block.c
@@ -62,7 +62,7 @@ QCryptoBlock *qcrypto_block_open(QCryptoBlockOpenOptions *options,
if (options->format >= G_N_ELEMENTS(qcrypto_block_drivers) ||
!qcrypto_block_drivers[options->format]) {
error_setg(errp, "Unsupported block driver %s",
- qapi_enum_lookup(QCryptoBlockFormat_lookup, options->format));
+ qapi_enum_lookup(&QCryptoBlockFormat_lookup, options->format));
g_free(block);
return NULL;
}
@@ -93,7 +93,7 @@ QCryptoBlock *qcrypto_block_create(QCryptoBlockCreateOptions *options,
if (options->format >= G_N_ELEMENTS(qcrypto_block_drivers) ||
!qcrypto_block_drivers[options->format]) {
error_setg(errp, "Unsupported block driver %s",
- qapi_enum_lookup(QCryptoBlockFormat_lookup, options->format));
+ qapi_enum_lookup(&QCryptoBlockFormat_lookup, options->format));
g_free(block);
return NULL;
}
diff --git a/crypto/cipher-afalg.c b/crypto/cipher-afalg.c
index 24d7ba8277..f15fb2a9c8 100644
--- a/crypto/cipher-afalg.c
+++ b/crypto/cipher-afalg.c
@@ -52,7 +52,7 @@ qcrypto_afalg_cipher_format_name(QCryptoCipherAlgorithm alg,
return NULL;
}
- mode_name = qapi_enum_lookup(QCryptoCipherMode_lookup, mode);
+ mode_name = qapi_enum_lookup(&QCryptoCipherMode_lookup, mode);
name = g_strdup_printf("%s(%s)", mode_name, alg_name);
return name;
diff --git a/crypto/cipher-builtin.c b/crypto/cipher-builtin.c
index 76c76fb05b..e956cc5a53 100644
--- a/crypto/cipher-builtin.c
+++ b/crypto/cipher-builtin.c
@@ -247,7 +247,7 @@ qcrypto_cipher_init_aes(QCryptoCipherMode mode,
mode != QCRYPTO_CIPHER_MODE_ECB &&
mode != QCRYPTO_CIPHER_MODE_XTS) {
error_setg(errp, "Unsupported cipher mode %s",
- qapi_enum_lookup(QCryptoCipherMode_lookup, mode));
+ qapi_enum_lookup(&QCryptoCipherMode_lookup, mode));
return NULL;
}
@@ -379,7 +379,7 @@ qcrypto_cipher_init_des_rfb(QCryptoCipherMode mode,
if (mode != QCRYPTO_CIPHER_MODE_ECB) {
error_setg(errp, "Unsupported cipher mode %s",
- qapi_enum_lookup(QCryptoCipherMode_lookup, mode));
+ qapi_enum_lookup(&QCryptoCipherMode_lookup, mode));
return NULL;
}
@@ -440,7 +440,7 @@ static QCryptoCipherBuiltin *qcrypto_cipher_ctx_new(QCryptoCipherAlgorithm alg,
break;
default:
error_setg(errp, "Unsupported cipher mode %s",
- qapi_enum_lookup(QCryptoCipherMode_lookup, mode));
+ qapi_enum_lookup(&QCryptoCipherMode_lookup, mode));
return NULL;
}
@@ -460,7 +460,7 @@ static QCryptoCipherBuiltin *qcrypto_cipher_ctx_new(QCryptoCipherAlgorithm alg,
default:
error_setg(errp,
"Unsupported cipher algorithm %s",
- qapi_enum_lookup(QCryptoCipherAlgorithm_lookup, alg));
+ qapi_enum_lookup(&QCryptoCipherAlgorithm_lookup, alg));
return NULL;
}
diff --git a/crypto/cipher-gcrypt.c b/crypto/cipher-gcrypt.c
index 09210195a4..3e46ee7502 100644
--- a/crypto/cipher-gcrypt.c
+++ b/crypto/cipher-gcrypt.c
@@ -105,7 +105,7 @@ static QCryptoCipherGcrypt *qcrypto_cipher_ctx_new(QCryptoCipherAlgorithm alg,
break;
default:
error_setg(errp, "Unsupported cipher mode %s",
- qapi_enum_lookup(QCryptoCipherMode_lookup, mode));
+ qapi_enum_lookup(&QCryptoCipherMode_lookup, mode));
return NULL;
}
@@ -160,7 +160,7 @@ static QCryptoCipherGcrypt *qcrypto_cipher_ctx_new(QCryptoCipherAlgorithm alg,
default:
error_setg(errp, "Unsupported cipher algorithm %s",
- qapi_enum_lookup(QCryptoCipherAlgorithm_lookup, alg));
+ qapi_enum_lookup(&QCryptoCipherAlgorithm_lookup, alg));
return NULL;
}
diff --git a/crypto/cipher-nettle.c b/crypto/cipher-nettle.c
index 7c02b3e7a2..5e70c7984a 100644
--- a/crypto/cipher-nettle.c
+++ b/crypto/cipher-nettle.c
@@ -281,7 +281,7 @@ static QCryptoCipherNettle *qcrypto_cipher_ctx_new(QCryptoCipherAlgorithm alg,
break;
default:
error_setg(errp, "Unsupported cipher mode %s",
- qapi_enum_lookup(QCryptoCipherMode_lookup, mode));
+ qapi_enum_lookup(&QCryptoCipherMode_lookup, mode));
return NULL;
}
@@ -420,7 +420,7 @@ static QCryptoCipherNettle *qcrypto_cipher_ctx_new(QCryptoCipherAlgorithm alg,
default:
error_setg(errp, "Unsupported cipher algorithm %s",
- qapi_enum_lookup(QCryptoCipherAlgorithm_lookup, alg));
+ qapi_enum_lookup(&QCryptoCipherAlgorithm_lookup, alg));
goto error;
}
@@ -491,7 +491,7 @@ qcrypto_nettle_cipher_encrypt(QCryptoCipher *cipher,
default:
error_setg(errp, "Unsupported cipher mode %s",
- qapi_enum_lookup(QCryptoCipherMode_lookup, cipher->mode));
+ qapi_enum_lookup(&QCryptoCipherMode_lookup, cipher->mode));
return -1;
}
return 0;
@@ -537,7 +537,7 @@ qcrypto_nettle_cipher_decrypt(QCryptoCipher *cipher,
default:
error_setg(errp, "Unsupported cipher mode %s",
- qapi_enum_lookup(QCryptoCipherMode_lookup, cipher->mode));
+ qapi_enum_lookup(&QCryptoCipherMode_lookup, cipher->mode));
return -1;
}
return 0;
diff --git a/crypto/hmac-gcrypt.c b/crypto/hmac-gcrypt.c
index 0784795269..f24d5a48c2 100644
--- a/crypto/hmac-gcrypt.c
+++ b/crypto/hmac-gcrypt.c
@@ -52,7 +52,7 @@ void *qcrypto_hmac_ctx_new(QCryptoHashAlgorithm alg,
if (!qcrypto_hmac_supports(alg)) {
error_setg(errp, "Unsupported hmac algorithm %s",
- qapi_enum_lookup(QCryptoHashAlgorithm_lookup, alg));
+ qapi_enum_lookup(&QCryptoHashAlgorithm_lookup, alg));
return NULL;
}
diff --git a/crypto/hmac-glib.c b/crypto/hmac-glib.c
index 56b71dbf85..aac4b217c0 100644
--- a/crypto/hmac-glib.c
+++ b/crypto/hmac-glib.c
@@ -59,7 +59,7 @@ void *qcrypto_hmac_ctx_new(QCryptoHashAlgorithm alg,
if (!qcrypto_hmac_supports(alg)) {
error_setg(errp, "Unsupported hmac algorithm %s",
- qapi_enum_lookup(QCryptoHashAlgorithm_lookup, alg));
+ qapi_enum_lookup(&QCryptoHashAlgorithm_lookup, alg));
return NULL;
}
diff --git a/crypto/hmac-nettle.c b/crypto/hmac-nettle.c
index be43511252..07cc8af9b9 100644
--- a/crypto/hmac-nettle.c
+++ b/crypto/hmac-nettle.c
@@ -107,7 +107,7 @@ void *qcrypto_hmac_ctx_new(QCryptoHashAlgorithm alg,
if (!qcrypto_hmac_supports(alg)) {
error_setg(errp, "Unsupported hmac algorithm %s",
- qapi_enum_lookup(QCryptoHashAlgorithm_lookup, alg));
+ qapi_enum_lookup(&QCryptoHashAlgorithm_lookup, alg));
return NULL;
}
diff --git a/crypto/pbkdf-gcrypt.c b/crypto/pbkdf-gcrypt.c
index a815138c46..eff037f08f 100644
--- a/crypto/pbkdf-gcrypt.c
+++ b/crypto/pbkdf-gcrypt.c
@@ -69,7 +69,7 @@ int qcrypto_pbkdf2(QCryptoHashAlgorithm hash,
hash_map[hash] == GCRY_MD_NONE) {
error_setg_errno(errp, ENOSYS,
"PBKDF does not support hash algorithm %s",
- qapi_enum_lookup(QCryptoHashAlgorithm_lookup, hash));
+ qapi_enum_lookup(&QCryptoHashAlgorithm_lookup, hash));
return -1;
}
diff --git a/crypto/pbkdf-nettle.c b/crypto/pbkdf-nettle.c
index 84977fdd69..bb6454b80c 100644
--- a/crypto/pbkdf-nettle.c
+++ b/crypto/pbkdf-nettle.c
@@ -110,7 +110,7 @@ int qcrypto_pbkdf2(QCryptoHashAlgorithm hash,
default:
error_setg_errno(errp, ENOSYS,
"PBKDF does not support hash algorithm %s",
- qapi_enum_lookup(QCryptoHashAlgorithm_lookup, hash));
+ qapi_enum_lookup(&QCryptoHashAlgorithm_lookup, hash));
return -1;
}
return 0;
diff --git a/crypto/secret.c b/crypto/secret.c
index 285ab7a63c..388abd7df5 100644
--- a/crypto/secret.c
+++ b/crypto/secret.c
@@ -378,7 +378,7 @@ qcrypto_secret_class_init(ObjectClass *oc, void *data)
NULL);
object_class_property_add_enum(oc, "format",
"QCryptoSecretFormat",
- QCryptoSecretFormat_lookup,
+ &QCryptoSecretFormat_lookup,
qcrypto_secret_prop_get_format,
qcrypto_secret_prop_set_format,
NULL);
diff --git a/crypto/tlscreds.c b/crypto/tlscreds.c
index a8965531b6..3cd41035bb 100644
--- a/crypto/tlscreds.c
+++ b/crypto/tlscreds.c
@@ -233,7 +233,7 @@ qcrypto_tls_creds_class_init(ObjectClass *oc, void *data)
NULL);
object_class_property_add_enum(oc, "endpoint",
"QCryptoTLSCredsEndpoint",
- QCryptoTLSCredsEndpoint_lookup,
+ &QCryptoTLSCredsEndpoint_lookup,
qcrypto_tls_creds_prop_get_endpoint,
qcrypto_tls_creds_prop_set_endpoint,
NULL);
diff --git a/hmp.c b/hmp.c
index ccc58e6d88..0eb318f938 100644
--- a/hmp.c
+++ b/hmp.c
@@ -108,7 +108,7 @@ void hmp_info_status(Monitor *mon, const QDict *qdict)
if (!info->running && info->status != RUN_STATE_PAUSED) {
monitor_printf(mon, " (%s)",
- qapi_enum_lookup(RunState_lookup, info->status));
+ qapi_enum_lookup(&RunState_lookup, info->status));
}
monitor_printf(mon, "\n");
@@ -173,7 +173,7 @@ void hmp_info_migrate(Monitor *mon, const QDict *qdict)
monitor_printf(mon, "capabilities: ");
for (cap = caps; cap; cap = cap->next) {
monitor_printf(mon, "%s: %s ",
- qapi_enum_lookup(MigrationCapability_lookup,
+ qapi_enum_lookup(&MigrationCapability_lookup,
cap->value->capability),
cap->value->state ? "on" : "off");
}
@@ -182,7 +182,7 @@ void hmp_info_migrate(Monitor *mon, const QDict *qdict)
if (info->has_status) {
monitor_printf(mon, "Migration status: %s",
- qapi_enum_lookup(MigrationStatus_lookup, info->status));
+ qapi_enum_lookup(&MigrationStatus_lookup, info->status));
if (info->status == MIGRATION_STATUS_FAILED &&
info->has_error_desc) {
monitor_printf(mon, " (%s)\n", info->error_desc);
@@ -280,7 +280,7 @@ void hmp_info_migrate_capabilities(Monitor *mon, const QDict *qdict)
if (caps) {
for (cap = caps; cap; cap = cap->next) {
monitor_printf(mon, "%s: %s\n",
- qapi_enum_lookup(MigrationCapability_lookup,
+ qapi_enum_lookup(&MigrationCapability_lookup,
cap->value->capability),
cap->value->state ? "on" : "off");
}
@@ -298,57 +298,57 @@ void hmp_info_migrate_parameters(Monitor *mon, const QDict *qdict)
if (params) {
assert(params->has_compress_level);
monitor_printf(mon, "%s: %" PRId64 "\n",
- qapi_enum_lookup(MigrationParameter_lookup,
+ qapi_enum_lookup(&MigrationParameter_lookup,
MIGRATION_PARAMETER_COMPRESS_LEVEL),
params->compress_level);
assert(params->has_compress_threads);
monitor_printf(mon, "%s: %" PRId64 "\n",
- qapi_enum_lookup(MigrationParameter_lookup,
+ qapi_enum_lookup(&MigrationParameter_lookup,
MIGRATION_PARAMETER_COMPRESS_THREADS),
params->compress_threads);
assert(params->has_decompress_threads);
monitor_printf(mon, "%s: %" PRId64 "\n",
- qapi_enum_lookup(MigrationParameter_lookup,
+ qapi_enum_lookup(&MigrationParameter_lookup,
MIGRATION_PARAMETER_DECOMPRESS_THREADS),
params->decompress_threads);
assert(params->has_cpu_throttle_initial);
monitor_printf(mon, "%s: %" PRId64 "\n",
- qapi_enum_lookup(MigrationParameter_lookup,
+ qapi_enum_lookup(&MigrationParameter_lookup,
MIGRATION_PARAMETER_CPU_THROTTLE_INITIAL),
params->cpu_throttle_initial);
assert(params->has_cpu_throttle_increment);
monitor_printf(mon, "%s: %" PRId64 "\n",
- qapi_enum_lookup(MigrationParameter_lookup,
+ qapi_enum_lookup(&MigrationParameter_lookup,
MIGRATION_PARAMETER_CPU_THROTTLE_INCREMENT),
params->cpu_throttle_increment);
assert(params->has_tls_creds);
monitor_printf(mon, "%s: '%s'\n",
- qapi_enum_lookup(MigrationParameter_lookup,
+ qapi_enum_lookup(&MigrationParameter_lookup,
MIGRATION_PARAMETER_TLS_CREDS),
params->tls_creds);
assert(params->has_tls_hostname);
monitor_printf(mon, "%s: '%s'\n",
- qapi_enum_lookup(MigrationParameter_lookup,
+ qapi_enum_lookup(&MigrationParameter_lookup,
MIGRATION_PARAMETER_TLS_HOSTNAME),
params->tls_hostname);
assert(params->has_max_bandwidth);
monitor_printf(mon, "%s: %" PRId64 " bytes/second\n",
- qapi_enum_lookup(MigrationParameter_lookup,
+ qapi_enum_lookup(&MigrationParameter_lookup,
MIGRATION_PARAMETER_MAX_BANDWIDTH),
params->max_bandwidth);
assert(params->has_downtime_limit);
monitor_printf(mon, "%s: %" PRId64 " milliseconds\n",
- qapi_enum_lookup(MigrationParameter_lookup,
+ qapi_enum_lookup(&MigrationParameter_lookup,
MIGRATION_PARAMETER_DOWNTIME_LIMIT),
params->downtime_limit);
assert(params->has_x_checkpoint_delay);
monitor_printf(mon, "%s: %" PRId64 "\n",
- qapi_enum_lookup(MigrationParameter_lookup,
+ qapi_enum_lookup(&MigrationParameter_lookup,
MIGRATION_PARAMETER_X_CHECKPOINT_DELAY),
params->x_checkpoint_delay);
assert(params->has_block_incremental);
monitor_printf(mon, "%s: %s\n",
- qapi_enum_lookup(MigrationParameter_lookup,
+ qapi_enum_lookup(&MigrationParameter_lookup,
MIGRATION_PARAMETER_BLOCK_INCREMENTAL),
params->block_incremental ? "on" : "off");
}
@@ -446,7 +446,7 @@ static void print_block_info(Monitor *mon, BlockInfo *info,
}
if (info->has_io_status && info->io_status != BLOCK_DEVICE_IO_STATUS_OK) {
monitor_printf(mon, " I/O status: %s\n",
- qapi_enum_lookup(BlockDeviceIoStatus_lookup, info->io_status));
+ qapi_enum_lookup(&BlockDeviceIoStatus_lookup, info->io_status));
}
if (info->removable) {
@@ -476,7 +476,7 @@ static void print_block_info(Monitor *mon, BlockInfo *info,
if (inserted->detect_zeroes != BLOCKDEV_DETECT_ZEROES_OPTIONS_OFF) {
monitor_printf(mon, " Detect zeroes: %s\n",
- qapi_enum_lookup(BlockdevDetectZeroesOptions_lookup,
+ qapi_enum_lookup(&BlockdevDetectZeroesOptions_lookup,
inserted->detect_zeroes));
}
@@ -628,7 +628,7 @@ static void hmp_info_VncBasicInfo(Monitor *mon, VncBasicInfo *info,
name,
info->host,
info->service,
- qapi_enum_lookup(NetworkAddressFamily_lookup, info->family),
+ qapi_enum_lookup(&NetworkAddressFamily_lookup, info->family),
info->websocket ? " (Websocket)" : "");
}
@@ -638,8 +638,8 @@ static void hmp_info_vnc_authcrypt(Monitor *mon, const char *indent,
VncVencryptSubAuth *vencrypt)
{
monitor_printf(mon, "%sAuth: %s (Sub: %s)\n", indent,
- qapi_enum_lookup(VncPrimaryAuth_lookup, auth),
- vencrypt ? qapi_enum_lookup(VncVencryptSubAuth_lookup, *vencrypt)
+ qapi_enum_lookup(&VncPrimaryAuth_lookup, auth),
+ vencrypt ? qapi_enum_lookup(&VncVencryptSubAuth_lookup, *vencrypt)
: "none");
}
@@ -755,7 +755,7 @@ void hmp_info_spice(Monitor *mon, const QDict *qdict)
monitor_printf(mon, " auth: %s\n", info->auth);
monitor_printf(mon, " compiled: %s\n", info->compiled_version);
monitor_printf(mon, " mouse-mode: %s\n",
- qapi_enum_lookup(SpiceQueryMouseMode_lookup, info->mouse_mode));
+ qapi_enum_lookup(&SpiceQueryMouseMode_lookup, info->mouse_mode));
if (!info->has_channels || info->channels == NULL) {
monitor_printf(mon, "Channels: none\n");
@@ -1026,10 +1026,10 @@ void hmp_info_tpm(Monitor *mon, const QDict *qdict)
for (info = info_list; info; info = info->next) {
TPMInfo *ti = info->value;
monitor_printf(mon, " tpm%d: model=%s\n",
- c, qapi_enum_lookup(TpmModel_lookup, ti->model));
+ c, qapi_enum_lookup(&TpmModel_lookup, ti->model));
monitor_printf(mon, " \\ %s: type=%s",
- ti->id, qapi_enum_lookup(TpmTypeOptionsKind_lookup,
+ ti->id, qapi_enum_lookup(&TpmTypeOptionsKind_lookup,
ti->options->type));
switch (ti->options->type) {
@@ -1546,8 +1546,7 @@ void hmp_migrate_set_capability(Monitor *mon, const QDict *qdict)
MigrationCapabilityStatusList *caps = g_malloc0(sizeof(*caps));
int val;
- val = qapi_enum_parse(MigrationCapability_lookup, cap,
- MIGRATION_CAPABILITY__MAX, -1, &err);
+ val = qapi_enum_parse(&MigrationCapability_lookup, cap, -1, &err);
if (val < 0) {
goto end;
}
@@ -1576,8 +1575,7 @@ void hmp_migrate_set_parameter(Monitor *mon, const QDict *qdict)
Error *err = NULL;
int val, ret;
- val = qapi_enum_parse(MigrationParameter_lookup, param,
- MIGRATION_PARAMETER__MAX, -1, &err);
+ val = qapi_enum_parse(&MigrationParameter_lookup, param, -1, &err);
if (val < 0) {
goto cleanup;
}
@@ -1752,10 +1750,8 @@ void hmp_change(Monitor *mon, const QDict *qdict)
qmp_change("vnc", target, !!arg, arg, &err);
} else {
if (read_only) {
- read_only_mode =
- qapi_enum_parse(BlockdevChangeReadOnlyMode_lookup,
- read_only, BLOCKDEV_CHANGE_READ_ONLY_MODE__MAX,
- BLOCKDEV_CHANGE_READ_ONLY_MODE_RETAIN, &err);
+ read_only_mode = qapi_enum_parse(&BlockdevChangeReadOnlyMode_lookup,
+ read_only, BLOCKDEV_CHANGE_READ_ONLY_MODE_RETAIN, &err);
if (err) {
hmp_handle_error(mon, &err);
return;
@@ -2386,7 +2382,7 @@ void hmp_info_memdev(Monitor *mon, const QDict *qdict)
monitor_printf(mon, " prealloc: %s\n",
m->value->prealloc ? "true" : "false");
monitor_printf(mon, " policy: %s\n",
- qapi_enum_lookup(HostMemPolicy_lookup, m->value->policy));
+ qapi_enum_lookup(&HostMemPolicy_lookup, m->value->policy));
visit_complete(v, &str);
monitor_printf(mon, " host nodes: %s\n", str);
@@ -2417,7 +2413,7 @@ void hmp_info_memory_devices(Monitor *mon, const QDict *qdict)
di = value->u.dimm.data;
monitor_printf(mon, "Memory device [%s]: \"%s\"\n",
- qapi_enum_lookup(MemoryDeviceInfoKind_lookup, value->type),
+ qapi_enum_lookup(&MemoryDeviceInfoKind_lookup, value->type),
di->id ? di->id : "");
monitor_printf(mon, " addr: 0x%" PRIx64 "\n", di->addr);
monitor_printf(mon, " slot: %" PRId64 "\n", di->slot);
@@ -2812,7 +2808,7 @@ void hmp_info_dump(Monitor *mon, const QDict *qdict)
assert(result && result->status < DUMP_STATUS__MAX);
monitor_printf(mon, "Status: %s\n",
- qapi_enum_lookup(DumpStatus_lookup, result->status));
+ qapi_enum_lookup(&DumpStatus_lookup, result->status));
if (result->status == DUMP_STATUS_ACTIVE) {
float percent = 0;
diff --git a/hw/block/fdc.c b/hw/block/fdc.c
index 8ebe08d1af..df35f3e1cc 100644
--- a/hw/block/fdc.c
+++ b/hw/block/fdc.c
@@ -393,10 +393,10 @@ static int pick_geometry(FDrive *drv)
FLOPPY_DPRINTF("User requested floppy drive type '%s', "
"but inserted medium appears to be a "
"%"PRId64" sector '%s' type\n",
- qapi_enum_lookup(FloppyDriveType_lookup,
+ qapi_enum_lookup(&FloppyDriveType_lookup,
drv->drive),
nb_sectors,
- qapi_enum_lookup(FloppyDriveType_lookup,
+ qapi_enum_lookup(&FloppyDriveType_lookup,
parse->drive));
}
match = type_match;
@@ -406,7 +406,7 @@ static int pick_geometry(FDrive *drv)
if (match == -1) {
error_setg(&error_abort, "No candidate geometries present in table "
" for floppy drive type '%s'",
- qapi_enum_lookup(FloppyDriveType_lookup, drv->drive));
+ qapi_enum_lookup(&FloppyDriveType_lookup, drv->drive));
}
parse = &(fd_formats[match]);
diff --git a/hw/char/escc.c b/hw/char/escc.c
index 5c1d7b0e29..d5aba2a8a4 100644
--- a/hw/char/escc.c
+++ b/hw/char/escc.c
@@ -849,7 +849,7 @@ static void sunkbd_handle_event(DeviceState *dev, QemuConsole *src,
assert(evt->type == INPUT_EVENT_KIND_KEY);
key = evt->u.key.data;
qcode = qemu_input_key_value_to_qcode(key->key);
- trace_escc_sunkbd_event_in(qcode, qapi_enum_lookup(QKeyCode_lookup, qcode),
+ trace_escc_sunkbd_event_in(qcode, qapi_enum_lookup(&QKeyCode_lookup, qcode),
key->down);
if (qcode == Q_KEY_CODE_CAPS_LOCK) {
diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c
index c82c693bca..ee4fc9812b 100644
--- a/hw/core/qdev-properties.c
+++ b/hw/core/qdev-properties.c
@@ -587,7 +587,7 @@ const PropertyInfo qdev_prop_macaddr = {
const PropertyInfo qdev_prop_on_off_auto = {
.name = "OnOffAuto",
.description = "on/off/auto",
- .enum_table = OnOffAuto_lookup,
+ .enum_table = &OnOffAuto_lookup,
.get = get_enum,
.set = set_enum,
.set_default_value = set_default_value_enum,
@@ -599,7 +599,7 @@ QEMU_BUILD_BUG_ON(sizeof(LostTickPolicy) != sizeof(int));
const PropertyInfo qdev_prop_losttickpolicy = {
.name = "LostTickPolicy",
- .enum_table = LostTickPolicy_lookup,
+ .enum_table = &LostTickPolicy_lookup,
.get = get_enum,
.set = set_enum,
.set_default_value = set_default_value_enum,
@@ -613,7 +613,7 @@ const PropertyInfo qdev_prop_blockdev_on_error = {
.name = "BlockdevOnError",
.description = "Error handling policy, "
"report/ignore/enospc/stop/auto",
- .enum_table = BlockdevOnError_lookup,
+ .enum_table = &BlockdevOnError_lookup,
.get = get_enum,
.set = set_enum,
.set_default_value = set_default_value_enum,
@@ -627,7 +627,7 @@ const PropertyInfo qdev_prop_bios_chs_trans = {
.name = "BiosAtaTranslation",
.description = "Logical CHS translation algorithm, "
"auto/none/lba/large/rechs",
- .enum_table = BiosAtaTranslation_lookup,
+ .enum_table = &BiosAtaTranslation_lookup,
.get = get_enum,
.set = set_enum,
.set_default_value = set_default_value_enum,
@@ -639,7 +639,7 @@ const PropertyInfo qdev_prop_fdc_drive_type = {
.name = "FdcDriveType",
.description = "FDC drive type, "
"144/288/120/none/auto",
- .enum_table = FloppyDriveType_lookup,
+ .enum_table = &FloppyDriveType_lookup,
.get = get_enum,
.set = set_enum,
.set_default_value = set_default_value_enum,
diff --git a/hw/input/virtio-input-hid.c b/hw/input/virtio-input-hid.c
index 64039236f1..235b11082f 100644
--- a/hw/input/virtio-input-hid.c
+++ b/hw/input/virtio-input-hid.c
@@ -210,7 +210,7 @@ static void virtio_input_handle_event(DeviceState *dev, QemuConsole *src,
} else {
if (key->down) {
fprintf(stderr, "%s: unmapped key: %d [%s]\n", __func__,
- qcode, qapi_enum_lookup(QKeyCode_lookup, qcode));
+ qcode, qapi_enum_lookup(&QKeyCode_lookup, qcode));
}
}
break;
@@ -225,7 +225,7 @@ static void virtio_input_handle_event(DeviceState *dev, QemuConsole *src,
if (btn->down) {
fprintf(stderr, "%s: unmapped button: %d [%s]\n", __func__,
btn->button,
- qapi_enum_lookup(InputButton_lookup, btn->button));
+ qapi_enum_lookup(&InputButton_lookup, btn->button));
}
}
break;
diff --git a/migration/colo-failover.c b/migration/colo-failover.c
index e5394ba631..c3dd0969d6 100644
--- a/migration/colo-failover.c
+++ b/migration/colo-failover.c
@@ -35,7 +35,7 @@ static void colo_failover_bh(void *opaque)
FAILOVER_STATUS_ACTIVE);
if (old_state != FAILOVER_STATUS_REQUIRE) {
error_report("Unknown error for failover, old_state = %s",
- qapi_enum_lookup(FailoverStatus_lookup, old_state));
+ qapi_enum_lookup(&FailoverStatus_lookup, old_state));
return;
}
@@ -65,7 +65,7 @@ FailoverStatus failover_set_state(FailoverStatus old_state,
old = atomic_cmpxchg(&failover_state, old_state, new_state);
if (old == old_state) {
- trace_colo_failover_set_state(qapi_enum_lookup(FailoverStatus_lookup,
+ trace_colo_failover_set_state(qapi_enum_lookup(&FailoverStatus_lookup,
new_state));
}
return old;
diff --git a/migration/colo.c b/migration/colo.c
index 2b683a0afc..8bd7ef0531 100644
--- a/migration/colo.c
+++ b/migration/colo.c
@@ -63,7 +63,7 @@ static void secondary_vm_do_failover(void)
if (old_state != FAILOVER_STATUS_ACTIVE) {
error_report("Unknown error while do failover for secondary VM,"
"old_state: %s",
- qapi_enum_lookup(FailoverStatus_lookup, old_state));
+ qapi_enum_lookup(&FailoverStatus_lookup, old_state));
}
return;
}
@@ -94,7 +94,7 @@ static void secondary_vm_do_failover(void)
if (old_state != FAILOVER_STATUS_ACTIVE) {
error_report("Incorrect state (%s) while doing failover for "
"secondary VM",
- qapi_enum_lookup(FailoverStatus_lookup, old_state));
+ qapi_enum_lookup(&FailoverStatus_lookup, old_state));
return;
}
/* Notify COLO incoming thread that failover work is finished */
@@ -129,7 +129,7 @@ static void primary_vm_do_failover(void)
FAILOVER_STATUS_COMPLETED);
if (old_state != FAILOVER_STATUS_ACTIVE) {
error_report("Incorrect state (%s) while doing failover for Primary VM",
- qapi_enum_lookup(FailoverStatus_lookup, old_state));
+ qapi_enum_lookup(&FailoverStatus_lookup, old_state));
return;
}
/* Notify COLO thread that failover work is finished */
@@ -225,7 +225,7 @@ static void colo_send_message(QEMUFile *f, COLOMessage msg,
if (ret < 0) {
error_setg_errno(errp, -ret, "Can't send COLO message");
}
- trace_colo_send_message(qapi_enum_lookup(COLOMessage_lookup, msg));
+ trace_colo_send_message(qapi_enum_lookup(&COLOMessage_lookup, msg));
}
static void colo_send_message_value(QEMUFile *f, COLOMessage msg,
@@ -245,7 +245,7 @@ static void colo_send_message_value(QEMUFile *f, COLOMessage msg,
ret = qemu_file_get_error(f);
if (ret < 0) {
error_setg_errno(errp, -ret, "Failed to send value for message:%s",
- qapi_enum_lookup(COLOMessage_lookup, msg));
+ qapi_enum_lookup(&COLOMessage_lookup, msg));
}
}
@@ -264,7 +264,7 @@ static COLOMessage colo_receive_message(QEMUFile *f, Error **errp)
error_setg(errp, "%s: Invalid message", __func__);
return msg;
}
- trace_colo_receive_message(qapi_enum_lookup(COLOMessage_lookup, msg));
+ trace_colo_receive_message(qapi_enum_lookup(&COLOMessage_lookup, msg));
return msg;
}
@@ -302,7 +302,7 @@ static uint64_t colo_receive_message_value(QEMUFile *f, uint32_t expect_msg,
ret = qemu_file_get_error(f);
if (ret < 0) {
error_setg_errno(errp, -ret, "Failed to get value for COLO message: %s",
- qapi_enum_lookup(COLOMessage_lookup, expect_msg));
+ qapi_enum_lookup(&COLOMessage_lookup, expect_msg));
}
return value;
}
diff --git a/migration/global_state.c b/migration/global_state.c
index 4d57a9c5f2..486979c4cc 100644
--- a/migration/global_state.c
+++ b/migration/global_state.c
@@ -42,7 +42,7 @@ int global_state_store(void)
void global_state_store_running(void)
{
- const char *state = qapi_enum_lookup(RunState_lookup, RUN_STATE_RUNNING);
+ const char *state = qapi_enum_lookup(&RunState_lookup, RUN_STATE_RUNNING);
strncpy((char *)global_state.runstate,
state, sizeof(global_state.runstate));
}
@@ -89,8 +89,7 @@ static int global_state_post_load(void *opaque, int version_id)
s->received = true;
trace_migrate_global_state_post_load(runstate);
- r = qapi_enum_parse(RunState_lookup, runstate, RUN_STATE__MAX,
- -1, &local_err);
+ r = qapi_enum_parse(&RunState_lookup, runstate, -1, &local_err);
if (r == -1) {
if (local_err) {
diff --git a/monitor.c b/monitor.c
index ee2fdfd4f1..228f246fcc 100644
--- a/monitor.c
+++ b/monitor.c
@@ -929,7 +929,7 @@ EventInfoList *qmp_query_events(Error **errp)
QAPIEvent e;
for (e = 0 ; e < QAPI_EVENT__MAX ; e++) {
- const char *event_name = qapi_enum_lookup(QAPIEvent_lookup, e);
+ const char *event_name = qapi_enum_lookup(&QAPIEvent_lookup, e);
assert(event_name != NULL);
info = g_malloc0(sizeof(*info));
info->value = g_malloc0(sizeof(*info->value));
@@ -3250,9 +3250,9 @@ void netdev_add_completion(ReadLineState *rs, int nb_args, const char *str)
}
len = strlen(str);
readline_set_completion_index(rs, len);
- for (i = 0; qapi_enum_lookup(NetClientDriver_lookup, i); i++) {
+ for (i = 0; qapi_enum_lookup(&NetClientDriver_lookup, i); i++) {
add_completion_option(rs, str,
- qapi_enum_lookup(NetClientDriver_lookup, i));
+ qapi_enum_lookup(&NetClientDriver_lookup, i));
}
}
@@ -3436,8 +3436,8 @@ void sendkey_completion(ReadLineState *rs, int nb_args, const char *str)
len = strlen(str);
readline_set_completion_index(rs, len);
for (i = 0; i < Q_KEY_CODE__MAX; i++) {
- if (!strncmp(str, qapi_enum_lookup(QKeyCode_lookup, i), len)) {
- readline_add_completion(rs, qapi_enum_lookup(QKeyCode_lookup, i));
+ if (!strncmp(str, qapi_enum_lookup(&QKeyCode_lookup, i), len)) {
+ readline_add_completion(rs, qapi_enum_lookup(&QKeyCode_lookup, i));
}
}
}
@@ -3539,9 +3539,9 @@ void watchdog_action_completion(ReadLineState *rs, int nb_args, const char *str)
return;
}
readline_set_completion_index(rs, strlen(str));
- for (i = 0; qapi_enum_lookup(WatchdogExpirationAction_lookup, i); i++) {
+ for (i = 0; qapi_enum_lookup(&WatchdogExpirationAction_lookup, i); i++) {
add_completion_option(rs, str,
- qapi_enum_lookup(WatchdogExpirationAction_lookup, i));
+ qapi_enum_lookup(&WatchdogExpirationAction_lookup, i));
}
}
@@ -3555,7 +3555,7 @@ void migrate_set_capability_completion(ReadLineState *rs, int nb_args,
if (nb_args == 2) {
int i;
for (i = 0; i < MIGRATION_CAPABILITY__MAX; i++) {
- const char *name = qapi_enum_lookup(MigrationCapability_lookup, i);
+ const char *name = qapi_enum_lookup(&MigrationCapability_lookup, i);
if (!strncmp(str, name, len)) {
readline_add_completion(rs, name);
}
@@ -3576,7 +3576,7 @@ void migrate_set_parameter_completion(ReadLineState *rs, int nb_args,
if (nb_args == 2) {
int i;
for (i = 0; i < MIGRATION_PARAMETER__MAX; i++) {
- const char *name = qapi_enum_lookup(MigrationParameter_lookup, i);
+ const char *name = qapi_enum_lookup(&MigrationParameter_lookup, i);
if (!strncmp(str, name, len)) {
readline_add_completion(rs, name);
}
@@ -3855,7 +3855,7 @@ static void handle_qmp_command(JSONMessageParser *parser, GQueue *tokens)
qdict = qdict_get_qdict(qobject_to_qdict(rsp), "error");
if (qdict
&& !g_strcmp0(qdict_get_try_str(qdict, "class"),
- qapi_enum_lookup(QapiErrorClass_lookup,
+ qapi_enum_lookup(&QapiErrorClass_lookup,
ERROR_CLASS_COMMAND_NOT_FOUND))) {
/* Provide a more useful error message */
qdict_del(qdict, "desc");
diff --git a/net/filter.c b/net/filter.c
index 1dfd2caa23..2fd7d7d663 100644
--- a/net/filter.c
+++ b/net/filter.c
@@ -179,7 +179,7 @@ static void netfilter_init(Object *obj)
netfilter_get_netdev_id, netfilter_set_netdev_id,
NULL);
object_property_add_enum(obj, "queue", "NetFilterDirection",
- NetFilterDirection_lookup,
+ &NetFilterDirection_lookup,
netfilter_get_direction, netfilter_set_direction,
NULL);
object_property_add_str(obj, "status",
diff --git a/net/net.c b/net/net.c
index efe2252c59..f4b8739b0b 100644
--- a/net/net.c
+++ b/net/net.c
@@ -1065,7 +1065,7 @@ static int net_client_init1(const void *object, bool is_netdev, Error **errp)
/* FIXME drop when all init functions store an Error */
if (errp && !*errp) {
error_setg(errp, QERR_DEVICE_INIT_FAILED,
- qapi_enum_lookup(NetClientDriver_lookup, netdev->type));
+ qapi_enum_lookup(&NetClientDriver_lookup, netdev->type));
}
return -1;
}
@@ -1289,7 +1289,7 @@ void print_net_client(Monitor *mon, NetClientState *nc)
monitor_printf(mon, "%s: index=%d,type=%s,%s\n", nc->name,
nc->queue_index,
- qapi_enum_lookup(NetClientDriver_lookup, nc->info->type),
+ qapi_enum_lookup(&NetClientDriver_lookup, nc->info->type),
nc->info_str);
if (!QTAILQ_EMPTY(&nc->filters)) {
monitor_printf(mon, "filters:\n");
diff --git a/qapi/qapi-util.c b/qapi/qapi-util.c
index 7677caa51e..363214efb1 100644
--- a/qapi/qapi-util.c
+++ b/qapi/qapi-util.c
@@ -15,8 +15,8 @@
#include "qemu-common.h"
#include "qapi/util.h"
-int qapi_enum_parse(const char * const lookup[], const char *buf,
- int max, int def, Error **errp)
+int qapi_enum_parse(const QEnumLookup *lookup, const char *buf,
+ int def, Error **errp)
{
int i;
@@ -24,8 +24,8 @@ int qapi_enum_parse(const char * const lookup[], const char *buf,
return def;
}
- for (i = 0; i < max; i++) {
- if (!strcmp(buf, lookup[i])) {
+ for (i = 0; i < lookup->size; i++) {
+ if (!g_strcmp0(buf, lookup->array[i])) {
return i;
}
}
@@ -34,11 +34,12 @@ int qapi_enum_parse(const char * const lookup[], const char *buf,
return def;
}
-const char *qapi_enum_lookup(const char * const lookup[], int val)
+const char *qapi_enum_lookup(const QEnumLookup *lookup, int val)
{
assert(val >= 0);
+ assert(val < lookup->size);
- return lookup[val];
+ return lookup->array[val];
}
/*
diff --git a/qapi/qmp-dispatch.c b/qapi/qmp-dispatch.c
index 06f1470516..7f3302ad3c 100644
--- a/qapi/qmp-dispatch.c
+++ b/qapi/qmp-dispatch.c
@@ -119,7 +119,7 @@ static QObject *do_qmp_dispatch(QmpCommandList *cmds, QObject *request,
QObject *qmp_build_error_object(Error *err)
{
return qobject_from_jsonf("{ 'class': %s, 'desc': %s }",
- qapi_enum_lookup(QapiErrorClass_lookup,
+ qapi_enum_lookup(&QapiErrorClass_lookup,
error_get_class(err)),
error_get_pretty(err));
}
diff --git a/qemu-img.c b/qemu-img.c
index 56ef49e214..19f1996f90 100644
--- a/qemu-img.c
+++ b/qemu-img.c
@@ -3490,10 +3490,8 @@ static int img_resize(int argc, char **argv)
image_opts = true;
break;
case OPTION_PREALLOCATION:
- prealloc = qapi_enum_parse(PreallocMode_lookup, optarg,
- PREALLOC_MODE__MAX, PREALLOC_MODE__MAX,
- NULL);
- if (prealloc == PREALLOC_MODE__MAX) {
+ prealloc = qapi_enum_parse(&PreallocMode_lookup, optarg, -1, NULL);
+ if (prealloc == -1) {
error_report("Invalid preallocation mode '%s'", optarg);
return 1;
}
diff --git a/qemu-nbd.c b/qemu-nbd.c
index 27164b8205..0dda0cce05 100644
--- a/qemu-nbd.c
+++ b/qemu-nbd.c
@@ -639,9 +639,8 @@ int main(int argc, char **argv)
break;
case QEMU_NBD_OPT_DETECT_ZEROES:
detect_zeroes =
- qapi_enum_parse(BlockdevDetectZeroesOptions_lookup,
+ qapi_enum_parse(&BlockdevDetectZeroesOptions_lookup,
optarg,
- BLOCKDEV_DETECT_ZEROES_OPTIONS__MAX,
BLOCKDEV_DETECT_ZEROES_OPTIONS_OFF,
&local_err);
if (local_err) {
diff --git a/qom/object.c b/qom/object.c
index fe6e744b4d..3e18537e9b 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -1246,7 +1246,7 @@ uint64_t object_property_get_uint(Object *obj, const char *name,
}
typedef struct EnumProperty {
- const char * const *strings;
+ const QEnumLookup *lookup;
int (*get)(Object *, Error **);
void (*set)(Object *, int, Error **);
} EnumProperty;
@@ -1284,7 +1284,7 @@ int object_property_get_enum(Object *obj, const char *name,
visit_complete(v, &str);
visit_free(v);
v = string_input_visitor_new(str);
- visit_type_enum(v, name, &ret, enumprop->strings, errp);
+ visit_type_enum(v, name, &ret, enumprop->lookup, errp);
g_free(str);
visit_free(v);
@@ -1950,7 +1950,7 @@ static void property_get_enum(Object *obj, Visitor *v, const char *name,
return;
}
- visit_type_enum(v, name, &value, prop->strings, errp);
+ visit_type_enum(v, name, &value, prop->lookup, errp);
}
static void property_set_enum(Object *obj, Visitor *v, const char *name,
@@ -1960,7 +1960,7 @@ static void property_set_enum(Object *obj, Visitor *v, const char *name,
int value;
Error *err = NULL;
- visit_type_enum(v, name, &value, prop->strings, &err);
+ visit_type_enum(v, name, &value, prop->lookup, &err);
if (err) {
error_propagate(errp, err);
return;
@@ -1977,7 +1977,7 @@ static void property_release_enum(Object *obj, const char *name,
void object_property_add_enum(Object *obj, const char *name,
const char *typename,
- const char * const *strings,
+ const QEnumLookup *lookup,
int (*get)(Object *, Error **),
void (*set)(Object *, int, Error **),
Error **errp)
@@ -1985,7 +1985,7 @@ void object_property_add_enum(Object *obj, const char *name,
Error *local_err = NULL;
EnumProperty *prop = g_malloc(sizeof(*prop));
- prop->strings = strings;
+ prop->lookup = lookup;
prop->get = get;
prop->set = set;
@@ -2002,7 +2002,7 @@ void object_property_add_enum(Object *obj, const char *name,
void object_class_property_add_enum(ObjectClass *klass, const char *name,
const char *typename,
- const char * const *strings,
+ const QEnumLookup *lookup,
int (*get)(Object *, Error **),
void (*set)(Object *, int, Error **),
Error **errp)
@@ -2010,7 +2010,7 @@ void object_class_property_add_enum(ObjectClass *klass, const char *name,
Error *local_err = NULL;
EnumProperty *prop = g_malloc(sizeof(*prop));
- prop->strings = strings;
+ prop->lookup = lookup;
prop->get = get;
prop->set = set;
diff --git a/tests/check-qom-proplist.c b/tests/check-qom-proplist.c
index c51e6e734d..0ba8b55ce1 100644
--- a/tests/check-qom-proplist.c
+++ b/tests/check-qom-proplist.c
@@ -53,6 +53,11 @@ static const char *const dummy_animal_map[DUMMY_LAST + 1] = {
[DUMMY_LAST] = NULL,
};
+const QEnumLookup dummy_animal_lookup = {
+ .array = dummy_animal_map,
+ .size = DUMMY_LAST
+};
+
struct DummyObject {
Object parent_obj;
@@ -142,7 +147,7 @@ static void dummy_class_init(ObjectClass *cls, void *data)
NULL);
object_class_property_add_enum(cls, "av",
"DummyAnimal",
- dummy_animal_map,
+ &dummy_animal_lookup,
dummy_get_av,
dummy_set_av,
NULL);
diff --git a/tests/test-qapi-util.c b/tests/test-qapi-util.c
index e8697577a5..fc9436ff94 100644
--- a/tests/test-qapi-util.c
+++ b/tests/test-qapi-util.c
@@ -20,24 +20,21 @@ static void test_qapi_enum_parse(void)
Error *err = NULL;
int ret;
- ret = qapi_enum_parse(QType_lookup, NULL, QTYPE__MAX, QTYPE_NONE,
- &error_abort);
+ ret = qapi_enum_parse(&QType_lookup, NULL, QTYPE_NONE, &error_abort);
g_assert_cmpint(ret, ==, QTYPE_NONE);
- ret = qapi_enum_parse(QType_lookup, "junk", QTYPE__MAX, -1,
- NULL);
+ ret = qapi_enum_parse(&QType_lookup, "junk", -1, NULL);
g_assert_cmpint(ret, ==, -1);
- ret = qapi_enum_parse(QType_lookup, "junk", QTYPE__MAX, -1,
- &err);
+ ret = qapi_enum_parse(&QType_lookup, "junk", -1, &err);
error_free_or_abort(&err);
- ret = qapi_enum_parse(QType_lookup, "none", QTYPE__MAX, -1,
- &error_abort);
+ ret = qapi_enum_parse(&QType_lookup, "none", -1, &error_abort);
g_assert_cmpint(ret, ==, QTYPE_NONE);
- ret = qapi_enum_parse(QType_lookup, QType_lookup[QTYPE__MAX - 1],
- QTYPE__MAX, QTYPE__MAX - 1,
+ ret = qapi_enum_parse(&QType_lookup,
+ qapi_enum_lookup(&QType_lookup, QTYPE__MAX - 1),
+ QTYPE__MAX - 1,
&error_abort);
g_assert_cmpint(ret, ==, QTYPE__MAX - 1);
}
diff --git a/tests/test-qobject-input-visitor.c b/tests/test-qobject-input-visitor.c
index bdd00f6bd8..be7d7ea654 100644
--- a/tests/test-qobject-input-visitor.c
+++ b/tests/test-qobject-input-visitor.c
@@ -382,10 +382,10 @@ static void test_visitor_in_enum(TestInputVisitorData *data,
Visitor *v;
EnumOne i;
- for (i = 0; EnumOne_lookup[i]; i++) {
+ for (i = 0; i < EnumOne_lookup.size; i++) {
EnumOne res = -1;
- v = visitor_input_test_init(data, "%s", EnumOne_lookup[i]);
+ v = visitor_input_test_init(data, "%s", EnumOne_lookup.array[i]);
visit_type_EnumOne(v, NULL, &res, &error_abort);
g_assert_cmpint(i, ==, res);
@@ -699,7 +699,7 @@ static void test_native_list_integer_helper(TestInputVisitorData *data,
}
}
g_string_append_printf(gstr_union, "{ 'type': '%s', 'data': [ %s ] }",
- UserDefNativeListUnionKind_lookup[kind],
+ UserDefNativeListUnionKind_lookup.array[kind],
gstr_list->str);
v = visitor_input_test_init_raw(data, gstr_union->str);
@@ -1110,7 +1110,7 @@ static void test_visitor_in_fail_struct_missing(TestInputVisitorData *data,
error_free_or_abort(&err);
visit_optional(v, "optional", &present);
g_assert(!present);
- visit_type_enum(v, "enum", &en, EnumOne_lookup, &err);
+ visit_type_enum(v, "enum", &en, &EnumOne_lookup, &err);
error_free_or_abort(&err);
visit_type_int(v, "i64", &i64, &err);
error_free_or_abort(&err);
diff --git a/tests/test-qobject-output-visitor.c b/tests/test-qobject-output-visitor.c
index bb2d66b666..55a8c932e0 100644
--- a/tests/test-qobject-output-visitor.c
+++ b/tests/test-qobject-output-visitor.c
@@ -135,7 +135,7 @@ static void test_visitor_out_enum(TestOutputVisitorData *data,
qstr = qobject_to_qstring(visitor_get(data));
g_assert(qstr);
g_assert_cmpstr(qstring_get_str(qstr), ==,
- qapi_enum_lookup(EnumOne_lookup, i));
+ qapi_enum_lookup(&EnumOne_lookup, i));
visitor_reset(data);
}
}
diff --git a/tests/test-string-input-visitor.c b/tests/test-string-input-visitor.c
index 79313a7f7a..5828359830 100644
--- a/tests/test-string-input-visitor.c
+++ b/tests/test-string-input-visitor.c
@@ -279,10 +279,10 @@ static void test_visitor_in_enum(TestInputVisitorData *data,
Visitor *v;
EnumOne i;
- for (i = 0; EnumOne_lookup[i]; i++) {
+ for (i = 0; i < EnumOne_lookup.size; i++) {
EnumOne res = -1;
- v = visitor_input_test_init(data, EnumOne_lookup[i]);
+ v = visitor_input_test_init(data, EnumOne_lookup.array[i]);
visit_type_EnumOne(v, NULL, &res, &err);
g_assert(!err);
diff --git a/tests/test-string-output-visitor.c b/tests/test-string-output-visitor.c
index 0b2087d312..a5d26ac0ca 100644
--- a/tests/test-string-output-visitor.c
+++ b/tests/test-string-output-visitor.c
@@ -196,12 +196,12 @@ static void test_visitor_out_enum(TestOutputVisitorData *data,
str = visitor_get(data);
if (data->human) {
char *str_human =
- g_strdup_printf("\"%s\"", qapi_enum_lookup(EnumOne_lookup, i));
+ g_strdup_printf("\"%s\"", qapi_enum_lookup(&EnumOne_lookup, i));
g_assert_cmpstr(str, ==, str_human);
g_free(str_human);
} else {
- g_assert_cmpstr(str, ==, qapi_enum_lookup(EnumOne_lookup, i));
+ g_assert_cmpstr(str, ==, qapi_enum_lookup(&EnumOne_lookup, i));
}
visitor_reset(data);
}
diff --git a/tpm.c b/tpm.c
index f175661bfe..3ddd889906 100644
--- a/tpm.c
+++ b/tpm.c
@@ -63,7 +63,7 @@ static bool tpm_model_is_registered(enum TpmModel model)
const TPMDriverOps *tpm_get_backend_driver(const char *type)
{
- int i = qapi_enum_parse(TpmType_lookup, type, TPM_TYPE__MAX, -1, NULL);
+ int i = qapi_enum_parse(&TpmType_lookup, type, -1, NULL);
return i >= 0 ? be_drivers[i] : NULL;
}
@@ -92,7 +92,7 @@ static void tpm_display_backend_drivers(void)
continue;
}
fprintf(stderr, "%12s %s\n",
- qapi_enum_lookup(TpmType_lookup, i),
+ qapi_enum_lookup(&TpmType_lookup, i),
be_drivers[i]->desc());
}
fprintf(stderr, "\n");
diff --git a/ui/input-legacy.c b/ui/input-legacy.c
index 7159747404..c597bdc711 100644
--- a/ui/input-legacy.c
+++ b/ui/input-legacy.c
@@ -61,9 +61,9 @@ int index_from_key(const char *key, size_t key_length)
{
int i;
- for (i = 0; QKeyCode_lookup[i] != NULL; i++) {
- if (!strncmp(key, QKeyCode_lookup[i], key_length) &&
- !QKeyCode_lookup[i][key_length]) {
+ for (i = 0; QKeyCode_lookup.array[i] != NULL; i++) {
+ if (!strncmp(key, QKeyCode_lookup.array[i], key_length) &&
+ !QKeyCode_lookup.array[i][key_length]) {
break;
}
}
diff --git a/ui/input.c b/ui/input.c
index 6bceb6b825..dfae347154 100644
--- a/ui/input.c
+++ b/ui/input.c
@@ -152,7 +152,7 @@ void qmp_input_send_event(bool has_device, const char *device,
if (!qemu_input_find_handler(1 << event->type, con)) {
error_setg(errp, "Input handler not found for "
"event type %s",
- qapi_enum_lookup(InputEventKind_lookup, event->type));
+ qapi_enum_lookup(&InputEventKind_lookup, event->type));
return;
}
}
@@ -214,12 +214,12 @@ static void qemu_input_event_trace(QemuConsole *src, InputEvent *evt)
switch (key->key->type) {
case KEY_VALUE_KIND_NUMBER:
qcode = qemu_input_key_number_to_qcode(key->key->u.number.data);
- name = qapi_enum_lookup(QKeyCode_lookup, qcode);
+ name = qapi_enum_lookup(&QKeyCode_lookup, qcode);
trace_input_event_key_number(idx, key->key->u.number.data,
name, key->down);
break;
case KEY_VALUE_KIND_QCODE:
- name = qapi_enum_lookup(QKeyCode_lookup, key->key->u.qcode.data);
+ name = qapi_enum_lookup(&QKeyCode_lookup, key->key->u.qcode.data);
trace_input_event_key_qcode(idx, name, key->down);
break;
case KEY_VALUE_KIND__MAX:
@@ -229,17 +229,17 @@ static void qemu_input_event_trace(QemuConsole *src, InputEvent *evt)
break;
case INPUT_EVENT_KIND_BTN:
btn = evt->u.btn.data;
- name = qapi_enum_lookup(InputButton_lookup, btn->button);
+ name = qapi_enum_lookup(&InputButton_lookup, btn->button);
trace_input_event_btn(idx, name, btn->down);
break;
case INPUT_EVENT_KIND_REL:
move = evt->u.rel.data;
- name = qapi_enum_lookup(InputAxis_lookup, move->axis);
+ name = qapi_enum_lookup(&InputAxis_lookup, move->axis);
trace_input_event_rel(idx, name, move->value);
break;
case INPUT_EVENT_KIND_ABS:
move = evt->u.abs.data;
- name = qapi_enum_lookup(InputAxis_lookup, move->axis);
+ name = qapi_enum_lookup(&InputAxis_lookup, move->axis);
trace_input_event_abs(idx, name, move->value);
break;
case INPUT_EVENT_KIND__MAX:
diff --git a/ui/vnc.c b/ui/vnc.c
index 20a45a7241..afe46dd8ae 100644
--- a/ui/vnc.c
+++ b/ui/vnc.c
@@ -132,7 +132,7 @@ static void vnc_init_basic_info(SocketAddress *addr,
case SOCKET_ADDRESS_TYPE_VSOCK:
case SOCKET_ADDRESS_TYPE_FD:
error_setg(errp, "Unsupported socket address type %s",
- qapi_enum_lookup(SocketAddressType_lookup, addr->type));
+ qapi_enum_lookup(&SocketAddressType_lookup, addr->type));
break;
default:
abort();
@@ -417,7 +417,7 @@ VncInfo *qmp_query_vnc(Error **errp)
case SOCKET_ADDRESS_TYPE_VSOCK:
case SOCKET_ADDRESS_TYPE_FD:
error_setg(errp, "Unsupported socket address type %s",
- qapi_enum_lookup(SocketAddressType_lookup, addr->type));
+ qapi_enum_lookup(&SocketAddressType_lookup, addr->type));
goto out_error;
default:
abort();
@@ -1840,7 +1840,7 @@ static void vnc_release_modifiers(VncState *vs)
static const char *code2name(int keycode)
{
- return qapi_enum_lookup(QKeyCode_lookup,
+ return qapi_enum_lookup(&QKeyCode_lookup,
qemu_input_key_number_to_qcode(keycode));
}
diff --git a/vl.c b/vl.c
index def4f5f05f..adeb6ed479 100644
--- a/vl.c
+++ b/vl.c
@@ -689,7 +689,7 @@ bool runstate_check(RunState state)
bool runstate_store(char *str, size_t size)
{
- const char *state = qapi_enum_lookup(RunState_lookup, current_run_state);
+ const char *state = qapi_enum_lookup(&RunState_lookup, current_run_state);
size_t len = strlen(state) + 1;
if (len > size) {
@@ -722,8 +722,8 @@ void runstate_set(RunState new_state)
if (!runstate_valid_transitions[current_run_state][new_state]) {
error_report("invalid runstate transition: '%s' -> '%s'",
- qapi_enum_lookup(RunState_lookup, current_run_state),
- qapi_enum_lookup(RunState_lookup, new_state));
+ qapi_enum_lookup(&RunState_lookup, current_run_state),
+ qapi_enum_lookup(&RunState_lookup, new_state));
abort();
}
trace_runstate_set(new_state);
--
2.14.1.146.gd35faa819
Marc-André Lureau <marcandre.lureau@redhat.com> writes:
> Store the length in the lookup table, i.e. change it from
> const char *const[] to struct { int n, const char *const s[] }.
>
> The following conditional enum entry change will create "hole"
> elements in the generated lookup array, that should be skipped.
The commit message could use some love. I know what the "conditional
enum entry change" will be about, but most other's won't, and even I may
not remember it in a few months.
>
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
> 66 files changed, 241 insertions(+), 248 deletions(-)
Lot's of churn because we need to take the address of FOO_lookup now.
Macros in PATCH 06 could perhaps limit the churn to that patch. I'll
play with it.
> diff --git a/include/qapi/visitor.h b/include/qapi/visitor.h
> index 0f3b8cb459..62a51a54cb 100644
> --- a/include/qapi/visitor.h
> +++ b/include/qapi/visitor.h
> @@ -469,7 +469,7 @@ bool visit_optional(Visitor *v, const char *name, bool *present);
> * that visit_type_str() must have no unwelcome side effects.
> */
> void visit_type_enum(Visitor *v, const char *name, int *obj,
> - const char *const strings[], Error **errp);
> + const QEnumLookup *lookup, Error **errp);
>
> /*
> * Check if visitor is an input visitor.
> diff --git a/scripts/qapi.py b/scripts/qapi.py
> index a3ac799535..314d7e0365 100644
> --- a/scripts/qapi.py
> +++ b/scripts/qapi.py
> @@ -1851,7 +1851,7 @@ def guardend(name):
> def gen_enum_lookup(name, values, prefix=None):
> ret = mcgen('''
>
> -const char *const %(c_name)s_lookup[] = {
> +static const char *const %(c_name)s_array[] = {
> ''',
> c_name=c_name(name))
> for value in values:
> @@ -1865,8 +1865,13 @@ const char *const %(c_name)s_lookup[] = {
> ret += mcgen('''
> [%(max_index)s] = NULL,
> };
> +
> +const QEnumLookup %(c_name)s_lookup = {
> + .array = %(c_name)s_array,
> + .size = %(max_index)s
> +};
> ''',
> - max_index=max_index)
> + max_index=max_index, c_name=c_name(name))
> return ret
>
>
This generates
static const char *const ACPISlotType_array[] = {
[ACPI_SLOT_TYPE_DIMM] = "DIMM",
[ACPI_SLOT_TYPE_CPU] = "CPU",
[ACPI_SLOT_TYPE__MAX] = NULL,
};
const QEnumLookup ACPISlotType_lookup = {
.array = ACPISlotType_array,
.size = ACPI_SLOT_TYPE__MAX
};
Old-fashioned. We can avoid the extra variable easily:
const QEnumLookup ACPISlotType_lookup = {
.array = (const char *const[]) {
[ACPI_SLOT_TYPE_DIMM] = "DIMM",
[ACPI_SLOT_TYPE_CPU] = "CPU",
[ACPI_SLOT_TYPE__MAX] = NULL,
},
.size = ACPI_SLOT_TYPE__MAX
};
Could be done in a followup. Extra churn. Up to you.
> @@ -1896,7 +1901,7 @@ typedef enum %(c_name)s {
>
> ret += mcgen('''
>
> -extern const char *const %(c_name)s_lookup[];
> +extern const QEnumLookup %(c_name)s_lookup;
> ''',
> c_name=c_name(name))
> return ret
> diff --git a/scripts/qapi-types.py b/scripts/qapi-types.py
> index b45e7b5634..dc05268917 100644
> --- a/scripts/qapi-types.py
> +++ b/scripts/qapi-types.py
> @@ -179,6 +179,12 @@ class QAPISchemaGenTypeVisitor(QAPISchemaVisitor):
> self.defn = ''
> self._fwdecl = ''
> self._btin = guardstart('QAPI_TYPES_BUILTIN')
> + self._btin += '''
> +typedef struct QEnumLookup {
> + const char *const *array;
> + int size;
> +} QEnumLookup;
> +'''
>
> def visit_end(self):
> self.decl = self._fwdecl + self.decl
> diff --git a/scripts/qapi-visit.py b/scripts/qapi-visit.py
> index bd0b742236..7e1cfc13f0 100644
> --- a/scripts/qapi-visit.py
> +++ b/scripts/qapi-visit.py
> @@ -153,7 +153,7 @@ def gen_visit_enum(name):
> void visit_type_%(c_name)s(Visitor *v, const char *name, %(c_name)s *obj, Error **errp)
> {
> int value = *obj;
> - visit_type_enum(v, name, &value, %(c_name)s_lookup, errp);
> + visit_type_enum(v, name, &value, &%(c_name)s_lookup, errp);
> *obj = value;
> }
> ''',
> diff --git a/include/hw/qdev-core.h b/include/hw/qdev-core.h
> index ae317286a4..089146197f 100644
> --- a/include/hw/qdev-core.h
> +++ b/include/hw/qdev-core.h
> @@ -249,7 +249,7 @@ struct Property {
> struct PropertyInfo {
> const char *name;
> const char *description;
> - const char * const *enum_table;
> + const QEnumLookup *enum_table;
> int (*print)(DeviceState *dev, Property *prop, char *dest, size_t len);
> void (*set_default_value)(Object *obj, const Property *prop);
> void (*create)(Object *obj, Property *prop, Error **errp);
> diff --git a/include/qapi/util.h b/include/qapi/util.h
> index 60733b6a80..613f82bdcd 100644
> --- a/include/qapi/util.h
> +++ b/include/qapi/util.h
> @@ -11,10 +11,10 @@
> #ifndef QAPI_UTIL_H
> #define QAPI_UTIL_H
>
> -const char *qapi_enum_lookup(const char * const lookup[], int val);
> +const char *qapi_enum_lookup(const QEnumLookup *lookup, int val);
>
> -int qapi_enum_parse(const char * const lookup[], const char *buf,
> - int max, int def, Error **errp);
> +int qapi_enum_parse(const QEnumLookup *lookup, const char *buf,
> + int def, Error **errp);
>
> int parse_qapi_name(const char *name, bool complete);
>
> diff --git a/include/qom/object.h b/include/qom/object.h
> index 1b828994fa..f3e5cff37a 100644
> --- a/include/qom/object.h
> +++ b/include/qom/object.h
> @@ -1415,14 +1415,14 @@ void object_class_property_add_bool(ObjectClass *klass, const char *name,
> */
> void object_property_add_enum(Object *obj, const char *name,
> const char *typename,
> - const char * const *strings,
> + const QEnumLookup *lookup,
> int (*get)(Object *, Error **),
> void (*set)(Object *, int, Error **),
> Error **errp);
>
> void object_class_property_add_enum(ObjectClass *klass, const char *name,
> const char *typename,
> - const char * const *strings,
> + const QEnumLookup *lookup,
> int (*get)(Object *, Error **),
> void (*set)(Object *, int, Error **),
> Error **errp);
> diff --git a/qapi/qapi-visit-core.c b/qapi/qapi-visit-core.c
> index ed6d2af462..8876ecf0cd 100644
> --- a/qapi/qapi-visit-core.c
> +++ b/qapi/qapi-visit-core.c
> @@ -333,24 +333,22 @@ void visit_type_null(Visitor *v, const char *name, QNull **obj,
> }
>
> static void output_type_enum(Visitor *v, const char *name, int *obj,
> - const char *const strings[], Error **errp)
> + const QEnumLookup *lookup, Error **errp)
> {
> - int i = 0;
> int value = *obj;
> char *enum_str;
>
> - while (strings[i++] != NULL);
> - if (value < 0 || value >= i - 1) {
> + if (value < 0 || value > lookup->size || !lookup->array[value]) {
!lookup->array[value] feels premature. Hole support should be done in a
later patch, possibly a separate one.
> error_setg(errp, QERR_INVALID_PARAMETER, name ? name : "null");
> return;
> }
>
> - enum_str = (char *)strings[value];
> + enum_str = (char *)lookup->array[value];
Why not qapi_enum_lookup()? In PATCH 06?
> visit_type_str(v, name, &enum_str, errp);
> }
>
> static void input_type_enum(Visitor *v, const char *name, int *obj,
> - const char *const strings[], Error **errp)
> + const QEnumLookup *lookup, Error **errp)
> {
> Error *local_err = NULL;
> int64_t value = 0;
> @@ -362,14 +360,14 @@ static void input_type_enum(Visitor *v, const char *name, int *obj,
> return;
> }
>
> - while (strings[value] != NULL) {
> - if (strcmp(strings[value], enum_str) == 0) {
> + while (value < lookup->size) {
> + if (!g_strcmp0(lookup->array[value], enum_str)) {
> break;
> }
> value++;
> }
>
> - if (strings[value] == NULL) {
> + if (value == lookup->size) {
> error_setg(errp, QERR_INVALID_PARAMETER, enum_str);
> g_free(enum_str);
> return;
Can we use qapi_enum_parse() here? In a preparatory patch like PATCH
07-11?
> @@ -380,16 +378,16 @@ static void input_type_enum(Visitor *v, const char *name, int *obj,
> }
>
> void visit_type_enum(Visitor *v, const char *name, int *obj,
> - const char *const strings[], Error **errp)
> + const QEnumLookup *lookup, Error **errp)
> {
> - assert(obj && strings);
> + assert(obj && lookup);
> trace_visit_type_enum(v, name, obj);
> switch (v->type) {
> case VISITOR_INPUT:
> - input_type_enum(v, name, obj, strings, errp);
> + input_type_enum(v, name, obj, lookup, errp);
> break;
> case VISITOR_OUTPUT:
> - output_type_enum(v, name, obj, strings, errp);
> + output_type_enum(v, name, obj, lookup, errp);
> break;
> case VISITOR_CLONE:
> /* nothing further to do, scalar value was already copied by
[Skipping churn I hope to reduce...]
> diff --git a/block/parallels.c b/block/parallels.c
> index e1e06d23cc..f870bbac3e 100644
> --- a/block/parallels.c
> +++ b/block/parallels.c
> @@ -69,12 +69,16 @@ typedef enum ParallelsPreallocMode {
> PRL_PREALLOC_MODE__MAX = 2,
> } ParallelsPreallocMode;
>
> -static const char *prealloc_mode_lookup[] = {
> +static const char *prealloc_mode_array[] = {
> "falloc",
> "truncate",
> NULL,
> };
>
> +static QEnumLookup prealloc_mode_lookup = {
> + .array = prealloc_mode_array,
> + .size = G_N_ELEMENTS(prealloc_mode_array),
> +};
>
> typedef struct BDRVParallelsState {
> /** Locking is conservative, the lock protects
My comment on scripts/qapi.py applies.
> @@ -696,8 +700,8 @@ static int parallels_open(BlockDriverState *bs, QDict *options, int flags,
> qemu_opt_get_size_del(opts, PARALLELS_OPT_PREALLOC_SIZE, 0);
> s->prealloc_size = MAX(s->tracks, s->prealloc_size >> BDRV_SECTOR_BITS);
> buf = qemu_opt_get_del(opts, PARALLELS_OPT_PREALLOC_MODE);
> - s->prealloc_mode = qapi_enum_parse(prealloc_mode_lookup, buf,
> - PRL_PREALLOC_MODE__MAX, PRL_PREALLOC_MODE_FALLOCATE, &local_err);
> + s->prealloc_mode = qapi_enum_parse(&prealloc_mode_lookup, buf,
> + PRL_PREALLOC_MODE_FALLOCATE, &local_err);
> g_free(buf);
> if (local_err != NULL) {
> goto fail_options;
[Skipping more churn...]
> diff --git a/crypto/block-luks.c b/crypto/block-luks.c
> index b78a6345f3..a3c96d768b 100644
> --- a/crypto/block-luks.c
> +++ b/crypto/block-luks.c
> @@ -258,47 +258,39 @@ qcrypto_block_luks_cipher_alg_lookup(QCryptoCipherAlgorithm alg,
> }
>
> error_setg(errp, "Algorithm '%s' not supported",
> - qapi_enum_lookup(QCryptoCipherAlgorithm_lookup, alg));
> + qapi_enum_lookup(&QCryptoCipherAlgorithm_lookup, alg));
> return NULL;
> }
>
> -/* XXX replace with qapi_enum_parse() in future, when we can
> +/* XXX replace with qapi_enum_parse(&) in future, when we can
Whoops!
> * make that function emit a more friendly error message */
> static int qcrypto_block_luks_name_lookup(const char *name,
> - const char *const *map,
> - size_t maplen,
> + const QEnumLookup *lookup,
> const char *type,
> Error **errp)
> {
> - size_t i;
> - for (i = 0; i < maplen; i++) {
> - if (g_str_equal(map[i], name)) {
> - return i;
> - }
> + int i = qapi_enum_parse(lookup, name, -1, NULL);
> + if (i < 0) {
> + error_setg(errp, "%s %s not supported", type, name);
> }
> -
> - error_setg(errp, "%s %s not supported", type, name);
> - return 0;
> + return i;
> }
Here, you do use qapi_enum_parse(). Good, but let's do it in a
separate, preparatory patch like PATCH 07-11.
[Skipping more churn...]
> diff --git a/qapi/qapi-util.c b/qapi/qapi-util.c
> index 7677caa51e..363214efb1 100644
> --- a/qapi/qapi-util.c
> +++ b/qapi/qapi-util.c
> @@ -15,8 +15,8 @@
> #include "qemu-common.h"
> #include "qapi/util.h"
>
> -int qapi_enum_parse(const char * const lookup[], const char *buf,
> - int max, int def, Error **errp)
> +int qapi_enum_parse(const QEnumLookup *lookup, const char *buf,
> + int def, Error **errp)
> {
> int i;
>
> @@ -24,8 +24,8 @@ int qapi_enum_parse(const char * const lookup[], const char *buf,
> return def;
> }
>
> - for (i = 0; i < max; i++) {
> - if (!strcmp(buf, lookup[i])) {
> + for (i = 0; i < lookup->size; i++) {
> + if (!g_strcmp0(buf, lookup->array[i])) {
> return i;
> }
> }
Why switch from strcmp() to g_strcmp0()?
If it's to support holes: hole support should be done in a later patch,
possibly a separate one.
> @@ -34,11 +34,12 @@ int qapi_enum_parse(const char * const lookup[], const char *buf,
> return def;
> }
>
> -const char *qapi_enum_lookup(const char * const lookup[], int val)
> +const char *qapi_enum_lookup(const QEnumLookup *lookup, int val)
> {
> assert(val >= 0);
> + assert(val < lookup->size);
The additional bounds check is a nice extra. But let's fuse the
assertions.
The patch that introduces hole support should additionally assert
lookup->array[val].
>
> - return lookup[val];
> + return lookup->array[val];
> }
>
> /*
[Skipping more churn...]
> diff --git a/tests/check-qom-proplist.c b/tests/check-qom-proplist.c
> index c51e6e734d..0ba8b55ce1 100644
> --- a/tests/check-qom-proplist.c
> +++ b/tests/check-qom-proplist.c
> @@ -53,6 +53,11 @@ static const char *const dummy_animal_map[DUMMY_LAST + 1] = {
> [DUMMY_LAST] = NULL,
> };
>
> +const QEnumLookup dummy_animal_lookup = {
> + .array = dummy_animal_map,
> + .size = DUMMY_LAST
> +};
> +
> struct DummyObject {
> Object parent_obj;
>
My comment on scripts/qapi.py applies.
> @@ -142,7 +147,7 @@ static void dummy_class_init(ObjectClass *cls, void *data)
> NULL);
> object_class_property_add_enum(cls, "av",
> "DummyAnimal",
> - dummy_animal_map,
> + &dummy_animal_lookup,
> dummy_get_av,
> dummy_set_av,
> NULL);
[Skipping more churn...]
> index bdd00f6bd8..be7d7ea654 100644
> --- a/tests/test-qobject-input-visitor.c
> +++ b/tests/test-qobject-input-visitor.c
> @@ -382,10 +382,10 @@ static void test_visitor_in_enum(TestInputVisitorData *data,
> Visitor *v;
> EnumOne i;
>
> - for (i = 0; EnumOne_lookup[i]; i++) {
> + for (i = 0; i < EnumOne_lookup.size; i++) {
> EnumOne res = -1;
>
> - v = visitor_input_test_init(data, "%s", EnumOne_lookup[i]);
> + v = visitor_input_test_init(data, "%s", EnumOne_lookup.array[i]);
>
> visit_type_EnumOne(v, NULL, &res, &error_abort);
> g_assert_cmpint(i, ==, res);
> @@ -699,7 +699,7 @@ static void test_native_list_integer_helper(TestInputVisitorData *data,
> }
> }
> g_string_append_printf(gstr_union, "{ 'type': '%s', 'data': [ %s ] }",
> - UserDefNativeListUnionKind_lookup[kind],
> + UserDefNativeListUnionKind_lookup.array[kind],
PATCH 06 should have changed this to qapi_enum_lookup(), as noted in my
review there.
> gstr_list->str);
> v = visitor_input_test_init_raw(data, gstr_union->str);
>
> @@ -1110,7 +1110,7 @@ static void test_visitor_in_fail_struct_missing(TestInputVisitorData *data,
> error_free_or_abort(&err);
> visit_optional(v, "optional", &present);
> g_assert(!present);
> - visit_type_enum(v, "enum", &en, EnumOne_lookup, &err);
> + visit_type_enum(v, "enum", &en, &EnumOne_lookup, &err);
> error_free_or_abort(&err);
> visit_type_int(v, "i64", &i64, &err);
> error_free_or_abort(&err);
> diff --git a/tests/test-qobject-output-visitor.c b/tests/test-qobject-output-visitor.c
> index bb2d66b666..55a8c932e0 100644
> --- a/tests/test-qobject-output-visitor.c
> +++ b/tests/test-qobject-output-visitor.c
> @@ -135,7 +135,7 @@ static void test_visitor_out_enum(TestOutputVisitorData *data,
> qstr = qobject_to_qstring(visitor_get(data));
> g_assert(qstr);
> g_assert_cmpstr(qstring_get_str(qstr), ==,
> - qapi_enum_lookup(EnumOne_lookup, i));
> + qapi_enum_lookup(&EnumOne_lookup, i));
> visitor_reset(data);
> }
> }
> diff --git a/tests/test-string-input-visitor.c b/tests/test-string-input-visitor.c
> index 79313a7f7a..5828359830 100644
> --- a/tests/test-string-input-visitor.c
> +++ b/tests/test-string-input-visitor.c
> @@ -279,10 +279,10 @@ static void test_visitor_in_enum(TestInputVisitorData *data,
> Visitor *v;
> EnumOne i;
>
> - for (i = 0; EnumOne_lookup[i]; i++) {
> + for (i = 0; i < EnumOne_lookup.size; i++) {
> EnumOne res = -1;
>
> - v = visitor_input_test_init(data, EnumOne_lookup[i]);
> + v = visitor_input_test_init(data, EnumOne_lookup.array[i]);
>
> visit_type_EnumOne(v, NULL, &res, &err);
Likewise.
> g_assert(!err);
> diff --git a/tests/test-string-output-visitor.c b/tests/test-string-output-visitor.c
> index 0b2087d312..a5d26ac0ca 100644
> --- a/tests/test-string-output-visitor.c
> +++ b/tests/test-string-output-visitor.c
> @@ -196,12 +196,12 @@ static void test_visitor_out_enum(TestOutputVisitorData *data,
> str = visitor_get(data);
> if (data->human) {
> char *str_human =
> - g_strdup_printf("\"%s\"", qapi_enum_lookup(EnumOne_lookup, i));
> + g_strdup_printf("\"%s\"", qapi_enum_lookup(&EnumOne_lookup, i));
>
> g_assert_cmpstr(str, ==, str_human);
> g_free(str_human);
> } else {
> - g_assert_cmpstr(str, ==, qapi_enum_lookup(EnumOne_lookup, i));
> + g_assert_cmpstr(str, ==, qapi_enum_lookup(&EnumOne_lookup, i));
> }
> visitor_reset(data);
> }
> diff --git a/tpm.c b/tpm.c
> index f175661bfe..3ddd889906 100644
> --- a/tpm.c
> +++ b/tpm.c
> @@ -63,7 +63,7 @@ static bool tpm_model_is_registered(enum TpmModel model)
>
> const TPMDriverOps *tpm_get_backend_driver(const char *type)
> {
> - int i = qapi_enum_parse(TpmType_lookup, type, TPM_TYPE__MAX, -1, NULL);
> + int i = qapi_enum_parse(&TpmType_lookup, type, -1, NULL);
>
> return i >= 0 ? be_drivers[i] : NULL;
> }
> @@ -92,7 +92,7 @@ static void tpm_display_backend_drivers(void)
> continue;
> }
> fprintf(stderr, "%12s %s\n",
> - qapi_enum_lookup(TpmType_lookup, i),
> + qapi_enum_lookup(&TpmType_lookup, i),
> be_drivers[i]->desc());
> }
> fprintf(stderr, "\n");
> diff --git a/ui/input-legacy.c b/ui/input-legacy.c
> index 7159747404..c597bdc711 100644
> --- a/ui/input-legacy.c
> +++ b/ui/input-legacy.c
> @@ -61,9 +61,9 @@ int index_from_key(const char *key, size_t key_length)
> {
> int i;
>
> - for (i = 0; QKeyCode_lookup[i] != NULL; i++) {
> - if (!strncmp(key, QKeyCode_lookup[i], key_length) &&
> - !QKeyCode_lookup[i][key_length]) {
> + for (i = 0; QKeyCode_lookup.array[i] != NULL; i++) {
> + if (!strncmp(key, QKeyCode_lookup.array[i], key_length) &&
> + !QKeyCode_lookup.array[i][key_length]) {
> break;
> }
> }
This is almost qapi_enum_parse(), but not quite: the key isn't
zero-terminated. Pity, because it looks like the last user that dots
into QEnumLookup. If we get rid of it, we can make it opaque. I'd do
it right away, but if you prefer to leave it for later, I can accept
that.
[Skipping more churn...]
I may well have missed issues in the stuff I skipped here. Hopefully, I
can reduce the churn and make this patch reviewable in full.
© 2016 - 2026 Red Hat, Inc.