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