@matheusbsbs / matheus-bagliano / commits / 0989fe9623
Fork 0

Move split_cmdline() to alias.c

split_cmdline() is currently used for aliases only, but later it can be useful for other builtins as well. Move it to alias.c for now, indicating that originally it's for aliases, but we'll have it in libgit this way. Signed-off-by: Miklos Vajna <vmiklos@frugalware.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Miklos Vajna committed Jun 27, 2008 at 18:21 UTC 0989fe9623dc8d98033f6acdcc0c84ec28571b19
3 files changed +55 -53
alias.c
+54
@@ -21,3 +21,57 @@ char *alias_lookup(const char *alias)
21 git_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 = 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 +
cache.h
+1
@@ -831,5 +831,6 @@ int report_path_error(const char *ps_matched, const char **pathspec, int prefix_
831 void overlay_tree_on_cache(const char *tree_name, const char *prefix);
832
833 char *alias_lookup(const char *alias);
834 +int split_cmdline(char *cmdline, const char ***argv);
835
836 #endif /* CACHE_H */
git.c
-53
@@ -90,59 +90,6 @@ static int handle_options(const char*** argv, int* argc, int* envchanged)
90 return handled;
91 }
92
93 -static int split_cmdline(char *cmdline, const char ***argv)
94 -{
95 - int src, dst, count = 0, size = 16;
96 - char quoted = 0;
97 -
98 - *argv = xmalloc(sizeof(char*) * size);
99 -
100 - /* split alias_string */
101 - (*argv)[count++] = cmdline;
102 - for (src = dst = 0; cmdline[src];) {
103 - char c = cmdline[src];
104 - if (!quoted && isspace(c)) {
105 - cmdline[dst++] = 0;
106 - while (cmdline[++src]
107 - && isspace(cmdline[src]))
108 - ; /* skip */
109 - if (count >= size) {
110 - size += 16;
111 - *argv = xrealloc(*argv, sizeof(char*) * size);
112 - }
113 - (*argv)[count++] = cmdline + dst;
114 - } else if(!quoted && (c == '\'' || c == '"')) {
115 - quoted = c;
116 - src++;
117 - } else if (c == quoted) {
118 - quoted = 0;
119 - src++;
120 - } else {
121 - if (c == '\\' && quoted != '\'') {
122 - src++;
123 - c = cmdline[src];
124 - if (!c) {
125 - free(*argv);
126 - *argv = NULL;
127 - return error("cmdline ends with \\");
128 - }
129 - }
130 - cmdline[dst++] = c;
131 - src++;
132 - }
133 - }
134 -
135 - cmdline[dst] = 0;
136 -
137 - if (quoted) {
138 - free(*argv);
139 - *argv = NULL;
140 - return error("unclosed quote");
141 - }
142 -
143 - return count;
144 -}
145 -
93 static int handle_alias(int *argcp, const char ***argv)
94 {
95 int envchanged = 0, ret = 0, saved_errno = errno;