From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:37489) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WQn5y-0000QP-M1 for qemu-devel@nongnu.org; Thu, 20 Mar 2014 20:14:04 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WQn5s-0007WH-Jl for qemu-devel@nongnu.org; Thu, 20 Mar 2014 20:13:58 -0400 Received: from mail-yk0-f174.google.com ([209.85.160.174]:55319) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WQn5s-0007Vz-Ep for qemu-devel@nongnu.org; Thu, 20 Mar 2014 20:13:52 -0400 Received: by mail-yk0-f174.google.com with SMTP id 20so4367486yks.5 for ; Thu, 20 Mar 2014 17:13:52 -0700 (PDT) From: Leandro Dorileo Date: Thu, 20 Mar 2014 21:13:10 -0300 Message-Id: <1395360813-2833-4-git-send-email-l@dorileo.org> In-Reply-To: <1395360813-2833-1-git-send-email-l@dorileo.org> References: <1395360813-2833-1-git-send-email-l@dorileo.org> Subject: [Qemu-devel] [PATCH 03/26] QemuOpt: improve default value List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Kevin Wolf , Fam Zheng , Stefan Hajnoczi , Liu Yuan , Jeff Cody , Markus Armbruster , Peter Lieven , "Richard W.M. Jones" , Luiz Capitulino , Leandro Dorileo , Ronnie Sahlberg , Josh Durgin , Anthony Liguori , Paolo Bonzini , Stefan Weil , Max Reitz , MORITA Kazutaka , Benoit Canet Use a pointer to a structure holding the primitive types and avoid parsing the default value representation. Signed-off-by: Leandro Dorileo --- 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