18c2ecf20Sopenharmony_ci#include <stdlib.h>
28c2ecf20Sopenharmony_ci#include <stdint.h>
38c2ecf20Sopenharmony_ci#include <string.h>
48c2ecf20Sopenharmony_ci#include <stdio.h>
58c2ecf20Sopenharmony_ci
68c2ecf20Sopenharmony_ci#include "util/debug.h"
78c2ecf20Sopenharmony_ci#include "util/parse-sublevel-options.h"
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_cistatic int parse_one_sublevel_option(const char *str,
108c2ecf20Sopenharmony_ci				     struct sublevel_option *opts)
118c2ecf20Sopenharmony_ci{
128c2ecf20Sopenharmony_ci	struct sublevel_option *opt = opts;
138c2ecf20Sopenharmony_ci	char *vstr, *s = strdup(str);
148c2ecf20Sopenharmony_ci	int v = 1;
158c2ecf20Sopenharmony_ci
168c2ecf20Sopenharmony_ci	if (!s) {
178c2ecf20Sopenharmony_ci		pr_err("no memory\n");
188c2ecf20Sopenharmony_ci		return -1;
198c2ecf20Sopenharmony_ci	}
208c2ecf20Sopenharmony_ci
218c2ecf20Sopenharmony_ci	vstr = strchr(s, '=');
228c2ecf20Sopenharmony_ci	if (vstr)
238c2ecf20Sopenharmony_ci		*vstr++ = 0;
248c2ecf20Sopenharmony_ci
258c2ecf20Sopenharmony_ci	while (opt->name) {
268c2ecf20Sopenharmony_ci		if (!strcmp(s, opt->name))
278c2ecf20Sopenharmony_ci			break;
288c2ecf20Sopenharmony_ci		opt++;
298c2ecf20Sopenharmony_ci	}
308c2ecf20Sopenharmony_ci
318c2ecf20Sopenharmony_ci	if (!opt->name) {
328c2ecf20Sopenharmony_ci		pr_err("Unknown option name '%s'\n", s);
338c2ecf20Sopenharmony_ci		free(s);
348c2ecf20Sopenharmony_ci		return -1;
358c2ecf20Sopenharmony_ci	}
368c2ecf20Sopenharmony_ci
378c2ecf20Sopenharmony_ci	if (vstr)
388c2ecf20Sopenharmony_ci		v = atoi(vstr);
398c2ecf20Sopenharmony_ci
408c2ecf20Sopenharmony_ci	*opt->value_ptr = v;
418c2ecf20Sopenharmony_ci	free(s);
428c2ecf20Sopenharmony_ci	return 0;
438c2ecf20Sopenharmony_ci}
448c2ecf20Sopenharmony_ci
458c2ecf20Sopenharmony_ci/* parse options like --foo a=<n>,b,c... */
468c2ecf20Sopenharmony_ciint perf_parse_sublevel_options(const char *str, struct sublevel_option *opts)
478c2ecf20Sopenharmony_ci{
488c2ecf20Sopenharmony_ci	char *s = strdup(str);
498c2ecf20Sopenharmony_ci	char *p = NULL;
508c2ecf20Sopenharmony_ci	int ret;
518c2ecf20Sopenharmony_ci
528c2ecf20Sopenharmony_ci	if (!s) {
538c2ecf20Sopenharmony_ci		pr_err("no memory\n");
548c2ecf20Sopenharmony_ci		return -1;
558c2ecf20Sopenharmony_ci	}
568c2ecf20Sopenharmony_ci
578c2ecf20Sopenharmony_ci	p = strtok(s, ",");
588c2ecf20Sopenharmony_ci	while (p) {
598c2ecf20Sopenharmony_ci		ret = parse_one_sublevel_option(p, opts);
608c2ecf20Sopenharmony_ci		if (ret) {
618c2ecf20Sopenharmony_ci			free(s);
628c2ecf20Sopenharmony_ci			return ret;
638c2ecf20Sopenharmony_ci		}
648c2ecf20Sopenharmony_ci
658c2ecf20Sopenharmony_ci		p = strtok(NULL, ",");
668c2ecf20Sopenharmony_ci	}
678c2ecf20Sopenharmony_ci
688c2ecf20Sopenharmony_ci	free(s);
698c2ecf20Sopenharmony_ci	return 0;
708c2ecf20Sopenharmony_ci}
71