Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
alias.c
Go to the documentation of this file.
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