162306a36Sopenharmony_ci#include <stdlib.h>
262306a36Sopenharmony_ci#include <stdint.h>
362306a36Sopenharmony_ci#include <string.h>
462306a36Sopenharmony_ci#include <stdio.h>
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#include "util/debug.h"
762306a36Sopenharmony_ci#include "util/parse-sublevel-options.h"
862306a36Sopenharmony_ci
962306a36Sopenharmony_cistatic int parse_one_sublevel_option(const char *str,
1062306a36Sopenharmony_ci				     struct sublevel_option *opts)
1162306a36Sopenharmony_ci{
1262306a36Sopenharmony_ci	struct sublevel_option *opt = opts;
1362306a36Sopenharmony_ci	char *vstr, *s = strdup(str);
1462306a36Sopenharmony_ci	int v = 1;
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci	if (!s) {
1762306a36Sopenharmony_ci		pr_err("no memory\n");
1862306a36Sopenharmony_ci		return -1;
1962306a36Sopenharmony_ci	}
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci	vstr = strchr(s, '=');
2262306a36Sopenharmony_ci	if (vstr)
2362306a36Sopenharmony_ci		*vstr++ = 0;
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci	while (opt->name) {
2662306a36Sopenharmony_ci		if (!strcmp(s, opt->name))
2762306a36Sopenharmony_ci			break;
2862306a36Sopenharmony_ci		opt++;
2962306a36Sopenharmony_ci	}
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci	if (!opt->name) {
3262306a36Sopenharmony_ci		pr_err("Unknown option name '%s'\n", s);
3362306a36Sopenharmony_ci		free(s);
3462306a36Sopenharmony_ci		return -1;
3562306a36Sopenharmony_ci	}
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci	if (vstr)
3862306a36Sopenharmony_ci		v = atoi(vstr);
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci	*opt->value_ptr = v;
4162306a36Sopenharmony_ci	free(s);
4262306a36Sopenharmony_ci	return 0;
4362306a36Sopenharmony_ci}
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci/* parse options like --foo a=<n>,b,c... */
4662306a36Sopenharmony_ciint perf_parse_sublevel_options(const char *str, struct sublevel_option *opts)
4762306a36Sopenharmony_ci{
4862306a36Sopenharmony_ci	char *s = strdup(str);
4962306a36Sopenharmony_ci	char *p = NULL;
5062306a36Sopenharmony_ci	int ret;
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ci	if (!s) {
5362306a36Sopenharmony_ci		pr_err("no memory\n");
5462306a36Sopenharmony_ci		return -1;
5562306a36Sopenharmony_ci	}
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_ci	p = strtok(s, ",");
5862306a36Sopenharmony_ci	while (p) {
5962306a36Sopenharmony_ci		ret = parse_one_sublevel_option(p, opts);
6062306a36Sopenharmony_ci		if (ret) {
6162306a36Sopenharmony_ci			free(s);
6262306a36Sopenharmony_ci			return ret;
6362306a36Sopenharmony_ci		}
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ci		p = strtok(NULL, ",");
6662306a36Sopenharmony_ci	}
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ci	free(s);
6962306a36Sopenharmony_ci	return 0;
7062306a36Sopenharmony_ci}
71