Use a pointer to a structure holding the primitive types and avoid parsing the default value representation.
Signed-off-by: Leandro Dorileo <l...@dorileo.org> --- include/qemu/option.h | 20 +++++++++++++++++++- util/qemu-config.c | 4 ++-- util/qemu-option.c | 45 ++++++++++++++++++++++++++------------------- 3 files changed, 47 insertions(+), 22 deletions(-) diff --git a/include/qemu/option.h b/include/qemu/option.h index c3b0a91..f0d4798 100644 --- a/include/qemu/option.h +++ b/include/qemu/option.h @@ -95,11 +95,29 @@ enum QemuOptType { QEMU_OPT_SIZE, /* size, accepts (K)ilo, (M)ega, (G)iga, (T)era postfix */ }; +#define QEMU_OPT_VAL_STR(_val) \ + &(QemuOptValue) {.s = _val} \ + +#define QEMU_OPT_VAL_NUMBER(_val) \ + &(QemuOptValue) {.n = _val} \ + +#define QEMU_OPT_VAL_SIZE(_val) \ + &(QemuOptValue) {.n = _val} \ + +#define QEMU_OPT_VAL_BOOL(_val) \ + &(QemuOptValue) {.b = _val} \ + +typedef struct QemuOptValue { + bool b; + uint64_t n; + const char *s; +} QemuOptValue; + typedef struct QemuOptDesc { const char *name; enum QemuOptType type; const char *help; - const char *def_value_str; + QemuOptValue *def_val; } QemuOptDesc; struct QemuOptsList { diff --git a/util/qemu-config.c b/util/qemu-config.c index d608b2f..a40711b 100644 --- a/util/qemu-config.c +++ b/util/qemu-config.c @@ -68,9 +68,9 @@ static CommandLineParameterInfoList *query_option_descs(const QemuOptDesc *desc) info->has_help = true; info->help = g_strdup(desc[i].help); } - if (desc[i].def_value_str) { + if (desc[i].def_val) { info->has_q_default = true; - info->q_default = g_strdup(desc[i].def_value_str); + info->q_default = g_strdup(desc[i].def_val->s); } entry = g_malloc0(sizeof(*entry)); diff --git a/util/qemu-option.c b/util/qemu-option.c index 8c0756d..612a966 100644 --- a/util/qemu-option.c +++ b/util/qemu-option.c @@ -573,8 +573,8 @@ const char *qemu_opt_get(QemuOpts *opts, const char *name) if (!opt) { const QemuOptDesc *desc = find_desc_by_name(opts->list->desc, name); - if (desc && desc->def_value_str) { - return desc->def_value_str; + if (desc && desc->def_val) { + return desc->def_val->s; } } return opt ? opt->str : NULL; @@ -598,11 +598,12 @@ bool qemu_opt_get_bool(QemuOpts *opts, const char *name, bool defval) if (opt == NULL) { const QemuOptDesc *desc = find_desc_by_name(opts->list->desc, name); - if (desc && desc->def_value_str) { - parse_option_bool(name, desc->def_value_str, &defval, &error_abort); + if (desc && desc->def_val) { + return desc->def_val->b; } return defval; } + assert(opt->desc && opt->desc->type == QEMU_OPT_BOOL); return opt->value.boolean; } @@ -613,9 +614,8 @@ uint64_t qemu_opt_get_number(QemuOpts *opts, const char *name, uint64_t defval) if (opt == NULL) { const QemuOptDesc *desc = find_desc_by_name(opts->list->desc, name); - if (desc && desc->def_value_str) { - parse_option_number(name, desc->def_value_str, &defval, - &error_abort); + if (desc && desc->def_val) { + return desc->def_val->n; } return defval; } @@ -629,8 +629,8 @@ uint64_t qemu_opt_get_size(QemuOpts *opts, const char *name, uint64_t defval) if (opt == NULL) { const QemuOptDesc *desc = find_desc_by_name(opts->list->desc, name); - if (desc && desc->def_value_str) { - parse_option_size(name, desc->def_value_str, &defval, &error_abort); + if (desc && desc->def_val) { + return desc->def_val->n; } return defval; } @@ -929,21 +929,28 @@ void qemu_opts_print(QemuOpts *opts) } return; } + for (; desc && desc->name; desc++) { - const char *value; - QemuOpt *opt = qemu_opt_find(opts, desc->name); + const char *str; + uint64_t number; + bool bol; - value = opt ? opt->str : desc->def_value_str; - if (!value) { - continue; - } if (desc->type == QEMU_OPT_STRING) { - fprintf(stderr, "%s='%s' ", desc->name, value); - } else { - fprintf(stderr, "%s=%s ", desc->name, value); + str = qemu_opt_get(opts, desc->name); + if (str) { + fprintf(stderr, "%s='%s' ", desc->name, str); + } + } else if (desc->type == QEMU_OPT_BOOL) { + bol = qemu_opt_get_bool(opts, desc->name, false); + fprintf(stderr, "%s=%s ", desc->name, bol ? "true" : "false"); + } else if (desc->type == QEMU_OPT_SIZE) { + number = qemu_opt_get_size(opts, desc->name, 0); + fprintf(stderr, "%s=%"PRId64" ", desc->name, number); + } else if (desc->type == QEMU_OPT_NUMBER) { + number = qemu_opt_get_number(opts, desc->name, 0); + fprintf(stderr, "%s=%"PRId64" ", desc->name, number); } } - fprintf(stderr, "\n"); } static int opts_do_parse(QemuOpts *opts, const char *params, -- 1.9.0