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