Whether or not user mis-type wrong data type to set config,
normalize the value. If a config user enter isn't contained
in default configs, just pass as it is.
For the examples,

   # perf config report.queue-size=1M
   # perf config report.queue-size
   report.queue-size=1048576

Cc: Namhyung Kim <namhy...@kernel.org>
Cc: Jiri Olsa <jo...@kernel.org>
Signed-off-by: Taeung Song <treeze.tae...@gmail.com>
---
 tools/perf/builtin-config.c | 54 ++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 49 insertions(+), 5 deletions(-)

diff --git a/tools/perf/builtin-config.c b/tools/perf/builtin-config.c
index d2587c5..bad8182 100644
--- a/tools/perf/builtin-config.c
+++ b/tools/perf/builtin-config.c
@@ -444,6 +444,54 @@ static int show_spec_config(struct list_head *sections,
        return -1;
 }
 
+static char *normalize_value(const char *section_name, const char *name, const 
char *value)
+{
+       int i, ret = 0;
+       char *endptr;
+       char key[BUFSIZ];
+       char *normalized;
+
+       scnprintf(key, sizeof(key), "%s.%s", section_name, name);
+       for (i = 0; default_configs[i].type != CONFIG_END; i++) {
+               struct config_item *config = &default_configs[i];
+
+               if (!strcmp(config->section, section_name) &&
+                   !strcmp(config->name, name)) {
+                       if (config->type == CONFIG_TYPE_BOOL)
+                               ret = asprintf(&normalized, "%s",
+                                              perf_config_bool(key, value) ? 
"true" : "false");
+                       else if (config->type == CONFIG_TYPE_INT ||
+                                config->type == CONFIG_TYPE_LONG)
+                               ret = asprintf(&normalized, "%d",
+                                              perf_config_int(key, value));
+                       else if (config->type == CONFIG_TYPE_U64)
+                               ret = asprintf(&normalized, "%"PRId64,
+                                              perf_config_u64(key, value));
+                       else if (config->type == CONFIG_TYPE_FLOAT)
+                               ret = asprintf(&normalized, "%f",
+                                              strtof(value, &endptr));
+                       else if (config->type == CONFIG_TYPE_DOUBLE)
+                               ret = asprintf(&normalized, "%f",
+                                              strtod(value, &endptr));
+                       else
+                               ret = asprintf(&normalized, "%s", value);
+
+                       if (ret < 0)
+                               return NULL;
+
+                       return normalized;
+               }
+       }
+
+       normalized = strdup(value);
+       if (!normalized) {
+               pr_err("%s: strdup failed\n", __func__);
+               return NULL;
+       }
+
+       return normalized;
+}
+
 static int set_config(struct list_head *sections, const char *config_file_name,
                      const char *section_name, const char *name, char *value)
 {
@@ -452,11 +500,7 @@ static int set_config(struct list_head *sections, const 
char *config_file_name,
 
        find_config(sections, &section, &element, section_name, name);
        if (value != NULL) {
-               value = strdup(value);
-               if (!value) {
-                       pr_err("%s: strdup failed\n", __func__);
-                       return -1;
-               }
+               value = normalize_value(section_name, name, value);
 
                /* if there isn't existent section, add a new section */
                if (!section) {
-- 
2.5.0

Reply via email to