mirror of
https://github.com/qemu/qemu.git
synced 2024-11-26 21:33:40 +08:00
util: add iterators for QemuOpts values
To iterate over all QemuOpts currently requires using a callback function which is inconvenient for control flow. Add support for using iterator functions more directly QemuOptsIter iter; QemuOpt *opt; qemu_opts_iter_init(&iter, opts, "repeated-key"); while ((opt = qemu_opts_iter_next(&iter)) != NULL) { ....do something... } Reviewed-by: Eric Blake <eblake@redhat.com> Signed-off-by: Daniel P. Berrange <berrange@redhat.com> Message-id: 20170203120649.15637-8-berrange@redhat.com Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
parent
57a6d6d538
commit
e998e2090f
@ -100,6 +100,15 @@ typedef int (*qemu_opt_loopfunc)(void *opaque,
|
||||
int qemu_opt_foreach(QemuOpts *opts, qemu_opt_loopfunc func, void *opaque,
|
||||
Error **errp);
|
||||
|
||||
typedef struct {
|
||||
QemuOpts *opts;
|
||||
QemuOpt *opt;
|
||||
const char *name;
|
||||
} QemuOptsIter;
|
||||
|
||||
void qemu_opt_iter_init(QemuOptsIter *iter, QemuOpts *opts, const char *name);
|
||||
const char *qemu_opt_iter_next(QemuOptsIter *iter);
|
||||
|
||||
QemuOpts *qemu_opts_find(QemuOptsList *list, const char *id);
|
||||
QemuOpts *qemu_opts_create(QemuOptsList *list, const char *id,
|
||||
int fail_if_exists, Error **errp);
|
||||
|
@ -332,6 +332,25 @@ const char *qemu_opt_get(QemuOpts *opts, const char *name)
|
||||
return opt ? opt->str : NULL;
|
||||
}
|
||||
|
||||
void qemu_opt_iter_init(QemuOptsIter *iter, QemuOpts *opts, const char *name)
|
||||
{
|
||||
iter->opts = opts;
|
||||
iter->opt = QTAILQ_FIRST(&opts->head);
|
||||
iter->name = name;
|
||||
}
|
||||
|
||||
const char *qemu_opt_iter_next(QemuOptsIter *iter)
|
||||
{
|
||||
QemuOpt *ret = iter->opt;
|
||||
if (iter->name) {
|
||||
while (ret && !g_str_equal(iter->name, ret->name)) {
|
||||
ret = QTAILQ_NEXT(ret, next);
|
||||
}
|
||||
}
|
||||
iter->opt = ret ? QTAILQ_NEXT(ret, next) : NULL;
|
||||
return ret ? ret->str : NULL;
|
||||
}
|
||||
|
||||
/* Get a known option (or its default) and remove it from the list
|
||||
* all in one action. Return a malloced string of the option value.
|
||||
* Result must be freed by caller with g_free().
|
||||
|
Loading…
Reference in New Issue
Block a user