root/tools/perf/util/parse-sublevel-options.c
#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;
}