Revision 81beeec4
b/cmd.c | ||
---|---|---|
45 | 45 |
((const cmdinfo_t *)b)->name); |
46 | 46 |
} |
47 | 47 |
|
48 |
void |
|
49 |
add_command( |
|
50 |
const cmdinfo_t *ci) |
|
48 |
void add_command(const cmdinfo_t *ci) |
|
51 | 49 |
{ |
52 |
cmdtab = realloc((void *)cmdtab, ++ncmds * sizeof(*cmdtab));
|
|
53 |
cmdtab[ncmds - 1] = *ci;
|
|
54 |
qsort(cmdtab, ncmds, sizeof(*cmdtab), compare);
|
|
50 |
cmdtab = realloc((void *)cmdtab, ++ncmds * sizeof(*cmdtab));
|
|
51 |
cmdtab[ncmds - 1] = *ci;
|
|
52 |
qsort(cmdtab, ncmds, sizeof(*cmdtab), compare);
|
|
55 | 53 |
} |
56 | 54 |
|
57 | 55 |
static int |
... | ... | |
122 | 120 |
return NULL; |
123 | 121 |
} |
124 | 122 |
|
125 |
void |
|
126 |
add_user_command(char *optarg) |
|
123 |
void add_user_command(char *optarg) |
|
127 | 124 |
{ |
128 |
ncmdline++;
|
|
129 |
cmdline = realloc(cmdline, sizeof(char*) * (ncmdline));
|
|
130 |
if (!cmdline) {
|
|
131 |
perror("realloc");
|
|
132 |
exit(1);
|
|
133 |
}
|
|
134 |
cmdline[ncmdline-1] = optarg;
|
|
125 |
ncmdline++;
|
|
126 |
cmdline = realloc(cmdline, ncmdline * sizeof(char *));
|
|
127 |
if (!cmdline) {
|
|
128 |
perror("realloc");
|
|
129 |
exit(1);
|
|
130 |
}
|
|
131 |
cmdline[ncmdline-1] = optarg;
|
|
135 | 132 |
} |
136 | 133 |
|
137 | 134 |
static int |
... | ... | |
160 | 157 |
|
161 | 158 |
static char *get_prompt(void); |
162 | 159 |
|
163 |
void |
|
164 |
command_loop(void) |
|
160 |
void command_loop(void) |
|
165 | 161 |
{ |
166 |
int c, i, j = 0, done = 0, fetchable = 0, prompted = 0; |
|
167 |
char *input; |
|
168 |
char **v; |
|
169 |
const cmdinfo_t *ct; |
|
170 |
|
|
171 |
for (i = 0; !done && i < ncmdline; i++) { |
|
172 |
input = strdup(cmdline[i]); |
|
173 |
if (!input) { |
|
174 |
fprintf(stderr, |
|
175 |
_("cannot strdup command '%s': %s\n"), |
|
176 |
cmdline[i], strerror(errno)); |
|
177 |
exit(1); |
|
178 |
} |
|
179 |
v = breakline(input, &c); |
|
180 |
if (c) { |
|
181 |
ct = find_command(v[0]); |
|
182 |
if (ct) { |
|
183 |
if (ct->flags & CMD_FLAG_GLOBAL) |
|
184 |
done = command(ct, c, v); |
|
185 |
else { |
|
186 |
j = 0; |
|
187 |
while (!done && (j = args_command(j))) |
|
188 |
done = command(ct, c, v); |
|
189 |
} |
|
190 |
} else |
|
191 |
fprintf(stderr, _("command \"%s\" not found\n"), |
|
192 |
v[0]); |
|
193 |
} |
|
194 |
doneline(input, v); |
|
195 |
} |
|
196 |
if (cmdline) { |
|
197 |
free(cmdline); |
|
198 |
return; |
|
162 |
int c, i, j = 0, done = 0, fetchable = 0, prompted = 0; |
|
163 |
char *input; |
|
164 |
char **v; |
|
165 |
const cmdinfo_t *ct; |
|
166 |
|
|
167 |
for (i = 0; !done && i < ncmdline; i++) { |
|
168 |
input = strdup(cmdline[i]); |
|
169 |
if (!input) { |
|
170 |
fprintf(stderr, _("cannot strdup command '%s': %s\n"), |
|
171 |
cmdline[i], strerror(errno)); |
|
172 |
exit(1); |
|
173 |
} |
|
174 |
v = breakline(input, &c); |
|
175 |
if (c) { |
|
176 |
ct = find_command(v[0]); |
|
177 |
if (ct) { |
|
178 |
if (ct->flags & CMD_FLAG_GLOBAL) { |
|
179 |
done = command(ct, c, v); |
|
180 |
} else { |
|
181 |
j = 0; |
|
182 |
while (!done && (j = args_command(j))) { |
|
183 |
done = command(ct, c, v); |
|
184 |
} |
|
185 |
} |
|
186 |
} else { |
|
187 |
fprintf(stderr, _("command \"%s\" not found\n"), v[0]); |
|
188 |
} |
|
199 | 189 |
} |
190 |
doneline(input, v); |
|
191 |
} |
|
192 |
if (cmdline) { |
|
193 |
free(cmdline); |
|
194 |
return; |
|
195 |
} |
|
200 | 196 |
|
201 |
while (!done) {
|
|
197 |
while (!done) {
|
|
202 | 198 |
if (!prompted) { |
203 | 199 |
printf("%s", get_prompt()); |
204 | 200 |
fflush(stdout); |
... | ... | |
212 | 208 |
if (!fetchable) { |
213 | 209 |
continue; |
214 | 210 |
} |
215 |
if ((input = fetchline()) == NULL) |
|
216 |
break; |
|
217 |
v = breakline(input, &c); |
|
218 |
if (c) { |
|
219 |
ct = find_command(v[0]); |
|
220 |
if (ct) |
|
221 |
done = command(ct, c, v); |
|
222 |
else |
|
223 |
fprintf(stderr, _("command \"%s\" not found\n"), |
|
224 |
v[0]); |
|
225 |
} |
|
226 |
doneline(input, v); |
|
211 |
input = fetchline(); |
|
212 |
if (input == NULL) { |
|
213 |
break; |
|
214 |
} |
|
215 |
v = breakline(input, &c); |
|
216 |
if (c) { |
|
217 |
ct = find_command(v[0]); |
|
218 |
if (ct) { |
|
219 |
done = command(ct, c, v); |
|
220 |
} else { |
|
221 |
fprintf(stderr, _("command \"%s\" not found\n"), v[0]); |
|
222 |
} |
|
223 |
} |
|
224 |
doneline(input, v); |
|
227 | 225 |
|
228 | 226 |
prompted = 0; |
229 | 227 |
fetchable = 0; |
230 |
}
|
|
228 |
}
|
|
231 | 229 |
qemu_aio_set_fd_handler(STDIN_FILENO, NULL, NULL, NULL, NULL, NULL); |
232 | 230 |
} |
233 | 231 |
|
... | ... | |
331 | 329 |
return result; |
332 | 330 |
} |
333 | 331 |
|
334 |
char ** |
|
335 |
breakline( |
|
336 |
char *input, |
|
337 |
int *count) |
|
332 |
char **breakline(char *input, int *count) |
|
338 | 333 |
{ |
339 |
int c = 0; |
|
340 |
char *p; |
|
341 |
char **rval = calloc(sizeof(char *), 1); |
|
342 |
|
|
343 |
while (rval && (p = qemu_strsep(&input, " ")) != NULL) { |
|
344 |
if (!*p) |
|
345 |
continue; |
|
346 |
c++; |
|
347 |
rval = realloc(rval, sizeof(*rval) * (c + 1)); |
|
348 |
if (!rval) { |
|
349 |
c = 0; |
|
350 |
break; |
|
351 |
} |
|
352 |
rval[c - 1] = p; |
|
353 |
rval[c] = NULL; |
|
354 |
} |
|
355 |
*count = c; |
|
356 |
return rval; |
|
334 |
int c = 0; |
|
335 |
char *p; |
|
336 |
char **rval = calloc(sizeof(char *), 1); |
|
337 |
|
|
338 |
while (rval && (p = qemu_strsep(&input, " ")) != NULL) { |
|
339 |
if (!*p) { |
|
340 |
continue; |
|
341 |
} |
|
342 |
c++; |
|
343 |
rval = realloc(rval, sizeof(*rval) * (c + 1)); |
|
344 |
if (!rval) { |
|
345 |
c = 0; |
|
346 |
break; |
|
347 |
} |
|
348 |
rval[c - 1] = p; |
|
349 |
rval[c] = NULL; |
|
350 |
} |
|
351 |
*count = c; |
|
352 |
return rval; |
|
357 | 353 |
} |
358 | 354 |
|
359 | 355 |
void |
Also available in: Unified diff