mirror of https://github.com/xemu-project/xemu.git
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,
|
int qemu_opt_foreach(QemuOpts *opts, qemu_opt_loopfunc func, void *opaque,
|
||||||
Error **errp);
|
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_find(QemuOptsList *list, const char *id);
|
||||||
QemuOpts *qemu_opts_create(QemuOptsList *list, const char *id,
|
QemuOpts *qemu_opts_create(QemuOptsList *list, const char *id,
|
||||||
int fail_if_exists, Error **errp);
|
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;
|
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
|
/* 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.
|
* all in one action. Return a malloced string of the option value.
|
||||||
* Result must be freed by caller with g_free().
|
* Result must be freed by caller with g_free().
|
||||||
|
|
Loading…
Reference in New Issue