linux/tools/perf/util/alias.c
<<
>>
Prefs
   1#include "cache.h"
   2
   3static const char *alias_key;
   4static char *alias_val;
   5
   6static int alias_lookup_cb(const char *k, const char *v,
   7                           void *cb __maybe_unused)
   8{
   9        if (!prefixcmp(k, "alias.") && !strcmp(k+6, alias_key)) {
  10                if (!v)
  11                        return config_error_nonbool(k);
  12                alias_val = strdup(v);
  13                return 0;
  14        }
  15        return 0;
  16}
  17
  18char *alias_lookup(const char *alias)
  19{
  20        alias_key = alias;
  21        alias_val = NULL;
  22        perf_config(alias_lookup_cb, NULL);
  23        return alias_val;
  24}
  25
  26int split_cmdline(char *cmdline, const char ***argv)
  27{
  28        int src, dst, count = 0, size = 16;
  29        char quoted = 0;
  30
  31        *argv = malloc(sizeof(char*) * size);
  32
  33        /* split alias_string */
  34        (*argv)[count++] = cmdline;
  35        for (src = dst = 0; cmdline[src];) {
  36                char c = cmdline[src];
  37                if (!quoted && isspace(c)) {
  38                        cmdline[dst++] = 0;
  39                        while (cmdline[++src]
  40                                        && isspace(cmdline[src]))
  41                                ; /* skip */
  42                        if (count >= size) {
  43                                size += 16;
  44                                *argv = realloc(*argv, sizeof(char*) * size);
  45                        }
  46                        (*argv)[count++] = cmdline + dst;
  47                } else if (!quoted && (c == '\'' || c == '"')) {
  48                        quoted = c;
  49                        src++;
  50                } else if (c == quoted) {
  51                        quoted = 0;
  52                        src++;
  53                } else {
  54                        if (c == '\\' && quoted != '\'') {
  55                                src++;
  56                                c = cmdline[src];
  57                                if (!c) {
  58                                        zfree(argv);
  59                                        return error("cmdline ends with \\");
  60                                }
  61                        }
  62                        cmdline[dst++] = c;
  63                        src++;
  64                }
  65        }
  66
  67        cmdline[dst] = 0;
  68
  69        if (quoted) {
  70                zfree(argv);
  71                return error("unclosed quote");
  72        }
  73
  74        return count;
  75}
  76
  77