#ifndef __COMMAND_H__
#define __COMMAND_H__
+#define CMD_FLAG_GLOBAL ((int)0x80000000) /* don't iterate "args" */
+
typedef int (*cfunc_t)(int argc, char **argv);
typedef void (*helpfunc_t)(void);
extern void command_loop(void);
extern int command_usage(const cmdinfo_t *ci);
-extern int command(int argc, char **argv);
+extern int command(const cmdinfo_t *ci, int argc, char **argv);
#endif /* __COMMAND_H__ */
int
command(
+ const cmdinfo_t *ct,
int argc,
char **argv)
{
- char *cmd;
- const cmdinfo_t *ct;
+ char *cmd = argv[0];
- cmd = argv[0];
- ct = find_command(cmd);
- if (!ct) {
- fprintf(stderr, _("command \"%s\" not found\n"), cmd);
- return 0;
- }
if (!check_command(ct))
return 0;
+
if (argc-1 < ct->argmin || (ct->argmax != -1 && argc-1 > ct->argmax)) {
if (ct->argmax == -1)
fprintf(stderr,
void
command_loop(void)
{
- int c, i, j = 0, done = 0;
- char *input;
- char **v;
+ int c, i, j = 0, done = 0;
+ char *input;
+ char **v;
+ const cmdinfo_t *ct;
for (i = 0; !done && i < ncmdline; i++) {
- while (!done && (j = args_command(j))) {
- input = strdup(cmdline[i]);
- if (!input) {
- fprintf(stderr,
- _("cannot strdup command '%s': %s\n"),
- cmdline[i], strerror(errno));
- exit(1);
- }
- v = breakline(input, &c);
- if (c)
- done = command(c, v);
- free(v);
- free(input);
+ input = strdup(cmdline[i]);
+ if (!input) {
+ fprintf(stderr,
+ _("cannot strdup command '%s': %s\n"),
+ cmdline[i], strerror(errno));
+ exit(1);
+ }
+ v = breakline(input, &c);
+ if (c) {
+ ct = find_command(v[0]);
+ if (ct) {
+ if (ct->flags & CMD_FLAG_GLOBAL)
+ done = command(ct, c, v);
+ else {
+ j = 0;
+ while (!done && (j = args_command(j)))
+ done = command(ct, c, v);
+ }
+ } else
+ fprintf(stderr, _("command \"%s\" not found\n"),
+ v[0]);
}
- j = 0; /* reset */
+ doneline(input, v);
}
if (cmdline) {
free(cmdline);
if ((input = fetchline()) == NULL)
break;
v = breakline(input, &c);
- if (c)
- done = command(c, v);
+ if (c) {
+ ct = find_command(v[0]);
+ if (ct)
+ done = command(ct, c, v);
+ else
+ fprintf(stderr, _("command \"%s\" not found\n"),
+ v[0]);
+ }
doneline(input, v);
}
}
path_cmd.cfunc = path_f;
path_cmd.argmin = 0;
path_cmd.argmax = 1;
+ path_cmd.flags = CMD_FLAG_GLOBAL;
path_cmd.oneline = _("set current path, or show the list of paths");
print_cmd.name = _("print");
print_cmd.cfunc = print_f;
print_cmd.argmin = 0;
print_cmd.argmax = 0;
+ print_cmd.flags = CMD_FLAG_GLOBAL;
print_cmd.oneline = _("list known mount points and projects");
if (expert)