1 #include "cache.h"
2 
3 static const char *alias_key;
4 static char *alias_val;
5 
alias_lookup_cb(const char * k,const char * v,void * cb __maybe_unused)6 static 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 
alias_lookup(const char * alias)18 char *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 
split_cmdline(char * cmdline,const char *** argv)26 int 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 					free(*argv);
59 					*argv = NULL;
60 					return error("cmdline ends with \\");
61 				}
62 			}
63 			cmdline[dst++] = c;
64 			src++;
65 		}
66 	}
67 
68 	cmdline[dst] = 0;
69 
70 	if (quoted) {
71 		free(*argv);
72 		*argv = NULL;
73 		return error("unclosed quote");
74 	}
75 
76 	return count;
77 }
78 
79