Home | History | Annotate | Download | only in util
      1 #include "cache.h"
      2 
      3 static const char *alias_key;
      4 static char *alias_val;
      5 
      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 
     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 
     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