linux/tools/perf/util/parse-regs-options.c
<<
>>
Prefs
   1#include "perf.h"
   2#include "util/util.h"
   3#include "util/debug.h"
   4#include <subcmd/parse-options.h>
   5#include "util/parse-regs-options.h"
   6
   7int
   8parse_regs(const struct option *opt, const char *str, int unset)
   9{
  10        uint64_t *mode = (uint64_t *)opt->value;
  11        const struct sample_reg *r;
  12        char *s, *os = NULL, *p;
  13        int ret = -1;
  14
  15        if (unset)
  16                return 0;
  17
  18        /*
  19         * cannot set it twice
  20         */
  21        if (*mode)
  22                return -1;
  23
  24        /* str may be NULL in case no arg is passed to -I */
  25        if (str) {
  26                /* because str is read-only */
  27                s = os = strdup(str);
  28                if (!s)
  29                        return -1;
  30
  31                for (;;) {
  32                        p = strchr(s, ',');
  33                        if (p)
  34                                *p = '\0';
  35
  36                        if (!strcmp(s, "?")) {
  37                                fprintf(stderr, "available registers: ");
  38                                for (r = sample_reg_masks; r->name; r++) {
  39                                        fprintf(stderr, "%s ", r->name);
  40                                }
  41                                fputc('\n', stderr);
  42                                /* just printing available regs */
  43                                return -1;
  44                        }
  45                        for (r = sample_reg_masks; r->name; r++) {
  46                                if (!strcasecmp(s, r->name))
  47                                        break;
  48                        }
  49                        if (!r->name) {
  50                                ui__warning("unknown register %s,"
  51                                            " check man page\n", s);
  52                                goto error;
  53                        }
  54
  55                        *mode |= r->mask;
  56
  57                        if (!p)
  58                                break;
  59
  60                        s = p + 1;
  61                }
  62        }
  63        ret = 0;
  64
  65        /* default to all possible regs */
  66        if (*mode == 0)
  67                *mode = PERF_REGS_MASK;
  68error:
  69        free(os);
  70        return ret;
  71}
  72