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