| #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; | |
| } |