| #include <stdlib.h> |
| #include <stdint.h> |
| #include <string.h> |
| #include <stdio.h> |
| |
| #include "util/debug.h" |
| #include "util/parse-sublevel-options.h" |
| |
| static int parse_one_sublevel_option(const char *str, |
| struct sublevel_option *opts) |
| { |
| struct sublevel_option *opt = opts; |
| char *vstr, *s = strdup(str); |
| int v = 1; |
| |
| if (!s) { |
| pr_err("no memory\n"); |
| return -1; |
| } |
| |
| vstr = strchr(s, '='); |
| if (vstr) |
| *vstr++ = 0; |
| |
| while (opt->name) { |
| if (!strcmp(s, opt->name)) |
| break; |
| opt++; |
| } |
| |
| if (!opt->name) { |
| pr_err("Unknown option name '%s'\n", s); |
| free(s); |
| return -1; |
| } |
| |
| if (vstr) |
| v = atoi(vstr); |
| |
| *opt->value_ptr = v; |
| free(s); |
| return 0; |
| } |
| |
| /* parse options like --foo a=<n>,b,c... */ |
| int perf_parse_sublevel_options(const char *str, struct sublevel_option *opts) |
| { |
| char *s = strdup(str); |
| char *p = NULL; |
| int ret; |
| |
| if (!s) { |
| pr_err("no memory\n"); |
| return -1; |
| } |
| |
| p = strtok(s, ","); |
| while (p) { |
| ret = parse_one_sublevel_option(p, opts); |
| if (ret) { |
| free(s); |
| return ret; |
| } |
| |
| p = strtok(NULL, ","); |
| } |
| |
| free(s); |
| return 0; |
| } |