| Ingo Molnar | 0780060 | 2009-04-20 15:00:56 +0200 | [diff] [blame] | 1 | #include "cache.h" | 
 | 2 |  | 
 | 3 | static const char *alias_key; | 
 | 4 | static char *alias_val; | 
 | 5 |  | 
| Ingo Molnar | f37a291 | 2009-07-01 12:37:06 +0200 | [diff] [blame] | 6 | static int alias_lookup_cb(const char *k, const char *v, void *cb __used) | 
| Ingo Molnar | 0780060 | 2009-04-20 15:00:56 +0200 | [diff] [blame] | 7 | { | 
 | 8 | 	if (!prefixcmp(k, "alias.") && !strcmp(k+6, alias_key)) { | 
 | 9 | 		if (!v) | 
 | 10 | 			return config_error_nonbool(k); | 
 | 11 | 		alias_val = strdup(v); | 
 | 12 | 		return 0; | 
 | 13 | 	} | 
 | 14 | 	return 0; | 
 | 15 | } | 
 | 16 |  | 
 | 17 | char *alias_lookup(const char *alias) | 
 | 18 | { | 
 | 19 | 	alias_key = alias; | 
 | 20 | 	alias_val = NULL; | 
 | 21 | 	perf_config(alias_lookup_cb, NULL); | 
 | 22 | 	return alias_val; | 
 | 23 | } | 
 | 24 |  | 
 | 25 | int split_cmdline(char *cmdline, const char ***argv) | 
 | 26 | { | 
 | 27 | 	int src, dst, count = 0, size = 16; | 
 | 28 | 	char quoted = 0; | 
 | 29 |  | 
 | 30 | 	*argv = malloc(sizeof(char*) * size); | 
 | 31 |  | 
 | 32 | 	/* split alias_string */ | 
 | 33 | 	(*argv)[count++] = cmdline; | 
 | 34 | 	for (src = dst = 0; cmdline[src];) { | 
 | 35 | 		char c = cmdline[src]; | 
 | 36 | 		if (!quoted && isspace(c)) { | 
 | 37 | 			cmdline[dst++] = 0; | 
 | 38 | 			while (cmdline[++src] | 
 | 39 | 					&& isspace(cmdline[src])) | 
 | 40 | 				; /* skip */ | 
 | 41 | 			if (count >= size) { | 
 | 42 | 				size += 16; | 
 | 43 | 				*argv = realloc(*argv, sizeof(char*) * size); | 
 | 44 | 			} | 
 | 45 | 			(*argv)[count++] = cmdline + dst; | 
 | 46 | 		} else if (!quoted && (c == '\'' || c == '"')) { | 
 | 47 | 			quoted = c; | 
 | 48 | 			src++; | 
 | 49 | 		} else if (c == quoted) { | 
 | 50 | 			quoted = 0; | 
 | 51 | 			src++; | 
 | 52 | 		} else { | 
 | 53 | 			if (c == '\\' && quoted != '\'') { | 
 | 54 | 				src++; | 
 | 55 | 				c = cmdline[src]; | 
 | 56 | 				if (!c) { | 
 | 57 | 					free(*argv); | 
 | 58 | 					*argv = NULL; | 
 | 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 | 		free(*argv); | 
 | 71 | 		*argv = NULL; | 
 | 72 | 		return error("unclosed quote"); | 
 | 73 | 	} | 
 | 74 |  | 
 | 75 | 	return count; | 
 | 76 | } | 
 | 77 |  |