X-Git-Url: http://git.tremily.us/?a=blobdiff_plain;f=alias.c;h=372b7d809301f9e3e936459e405cd6f2627bd4a9;hb=e294030fe89efcdd92430b60cf9568ffbe7317a8;hp=995f3e6a0ac84fa71c3196de6673225d4a5d8231;hpb=afce435000030e3ad076ef1dd413e0fa314cdcbb;p=git.git diff --git a/alias.c b/alias.c index 995f3e6a0..372b7d809 100644 --- a/alias.c +++ b/alias.c @@ -21,3 +21,57 @@ char *alias_lookup(const char *alias) git_config(alias_lookup_cb, NULL); return alias_val; } + +int split_cmdline(char *cmdline, const char ***argv) +{ + int src, dst, count = 0, size = 16; + char quoted = 0; + + *argv = xmalloc(sizeof(char *) * size); + + /* split alias_string */ + (*argv)[count++] = cmdline; + for (src = dst = 0; cmdline[src];) { + char c = cmdline[src]; + if (!quoted && isspace(c)) { + cmdline[dst++] = 0; + while (cmdline[++src] + && isspace(cmdline[src])) + ; /* skip */ + ALLOC_GROW(*argv, count+1, size); + (*argv)[count++] = cmdline + dst; + } else if (!quoted && (c == '\'' || c == '"')) { + quoted = c; + src++; + } else if (c == quoted) { + quoted = 0; + src++; + } else { + if (c == '\\' && quoted != '\'') { + src++; + c = cmdline[src]; + if (!c) { + free(*argv); + *argv = NULL; + return error("cmdline ends with \\"); + } + } + cmdline[dst++] = c; + src++; + } + } + + cmdline[dst] = 0; + + if (quoted) { + free(*argv); + *argv = NULL; + return error("unclosed quote"); + } + + ALLOC_GROW(*argv, count+1, size); + (*argv)[count] = NULL; + + return count; +} +