1*4882a593Smuzhiyun #include <stdlib.h>
2*4882a593Smuzhiyun #include <stdint.h>
3*4882a593Smuzhiyun #include <string.h>
4*4882a593Smuzhiyun #include <stdio.h>
5*4882a593Smuzhiyun
6*4882a593Smuzhiyun #include "util/debug.h"
7*4882a593Smuzhiyun #include "util/parse-sublevel-options.h"
8*4882a593Smuzhiyun
parse_one_sublevel_option(const char * str,struct sublevel_option * opts)9*4882a593Smuzhiyun static int parse_one_sublevel_option(const char *str,
10*4882a593Smuzhiyun struct sublevel_option *opts)
11*4882a593Smuzhiyun {
12*4882a593Smuzhiyun struct sublevel_option *opt = opts;
13*4882a593Smuzhiyun char *vstr, *s = strdup(str);
14*4882a593Smuzhiyun int v = 1;
15*4882a593Smuzhiyun
16*4882a593Smuzhiyun if (!s) {
17*4882a593Smuzhiyun pr_err("no memory\n");
18*4882a593Smuzhiyun return -1;
19*4882a593Smuzhiyun }
20*4882a593Smuzhiyun
21*4882a593Smuzhiyun vstr = strchr(s, '=');
22*4882a593Smuzhiyun if (vstr)
23*4882a593Smuzhiyun *vstr++ = 0;
24*4882a593Smuzhiyun
25*4882a593Smuzhiyun while (opt->name) {
26*4882a593Smuzhiyun if (!strcmp(s, opt->name))
27*4882a593Smuzhiyun break;
28*4882a593Smuzhiyun opt++;
29*4882a593Smuzhiyun }
30*4882a593Smuzhiyun
31*4882a593Smuzhiyun if (!opt->name) {
32*4882a593Smuzhiyun pr_err("Unknown option name '%s'\n", s);
33*4882a593Smuzhiyun free(s);
34*4882a593Smuzhiyun return -1;
35*4882a593Smuzhiyun }
36*4882a593Smuzhiyun
37*4882a593Smuzhiyun if (vstr)
38*4882a593Smuzhiyun v = atoi(vstr);
39*4882a593Smuzhiyun
40*4882a593Smuzhiyun *opt->value_ptr = v;
41*4882a593Smuzhiyun free(s);
42*4882a593Smuzhiyun return 0;
43*4882a593Smuzhiyun }
44*4882a593Smuzhiyun
45*4882a593Smuzhiyun /* parse options like --foo a=<n>,b,c... */
perf_parse_sublevel_options(const char * str,struct sublevel_option * opts)46*4882a593Smuzhiyun int perf_parse_sublevel_options(const char *str, struct sublevel_option *opts)
47*4882a593Smuzhiyun {
48*4882a593Smuzhiyun char *s = strdup(str);
49*4882a593Smuzhiyun char *p = NULL;
50*4882a593Smuzhiyun int ret;
51*4882a593Smuzhiyun
52*4882a593Smuzhiyun if (!s) {
53*4882a593Smuzhiyun pr_err("no memory\n");
54*4882a593Smuzhiyun return -1;
55*4882a593Smuzhiyun }
56*4882a593Smuzhiyun
57*4882a593Smuzhiyun p = strtok(s, ",");
58*4882a593Smuzhiyun while (p) {
59*4882a593Smuzhiyun ret = parse_one_sublevel_option(p, opts);
60*4882a593Smuzhiyun if (ret) {
61*4882a593Smuzhiyun free(s);
62*4882a593Smuzhiyun return ret;
63*4882a593Smuzhiyun }
64*4882a593Smuzhiyun
65*4882a593Smuzhiyun p = strtok(NULL, ",");
66*4882a593Smuzhiyun }
67*4882a593Smuzhiyun
68*4882a593Smuzhiyun free(s);
69*4882a593Smuzhiyun return 0;
70*4882a593Smuzhiyun }
71