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