alias.con commit completion: For consistency, change "git rev-parse" to __gitdir calls (fa26a40)
   1#include "cache.h"
   2
   3static const char *alias_key;
   4static char *alias_val;
   5
   6static int alias_lookup_cb(const char *k, const char *v, void *cb)
   7{
   8        if (!prefixcmp(k, "alias.") && !strcmp(k+6, alias_key)) {
   9                if (!v)
  10                        return config_error_nonbool(k);
  11                alias_val = xstrdup(v);
  12                return 0;
  13        }
  14        return 0;
  15}
  16
  17char *alias_lookup(const char *alias)
  18{
  19        alias_key = alias;
  20        alias_val = NULL;
  21        git_config(alias_lookup_cb, NULL);
  22        return alias_val;
  23}
  24
  25int split_cmdline(char *cmdline, const char ***argv)
  26{
  27        int src, dst, count = 0, size = 16;
  28        char quoted = 0;
  29
  30        *argv = xmalloc(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 = xrealloc(*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