diff --git a/inc/lektor/cmd.h b/inc/lektor/cmd.h index b37d64fe9720ebfff20526feffa2dd831d11114b..c1890987a3d4833d1e0f63a0b11c348ec5bfa03a 100644 --- a/inc/lektor/cmd.h +++ b/inc/lektor/cmd.h @@ -34,6 +34,19 @@ struct cmd_args { const char **argv; /* An array of argument passed. */ }; +#define CMD_ARGS_FROM(argc, argv) \ + { \ + .argc = (argc), .argv = (argv) \ + } +#define CMD_ARGS_NEXT_FROM(argc, argv) \ + { \ + .argc = argc - 1, .argv = (const char **)&(argv[1]), \ + } +#define CMD_ARGS_NEXT(args) \ + { \ + .argc = (args).argc - 1, .argv = (args).argv + 1, \ + } + /* Callback to call on command, takes the arguments */ typedef void (*cmd_callback)(struct cmd_args *); diff --git a/src/base/cmd.c b/src/base/cmd.c index 2b3fae4e36adee6b277385c853f5b60f3b72d810..363afa4dade1d5fe91649d7a0a9dc0b2ce117c94 100644 --- a/src/base/cmd.c +++ b/src/base/cmd.c @@ -119,7 +119,7 @@ cmd_parse_env(struct cmd_env *env, int *argc, const char ***argv) EXIT_FUNCTION cmd_parse(struct cmd_opt *opts, int argc, const char **argv) { - int count = 0, is_ok, offset = 0; + int count = 0, is_ok; struct cmd_opt *it = opts; cmd_callback call[2] = { NULL, NULL }; @@ -128,11 +128,10 @@ cmd_parse(struct cmd_opt *opts, int argc, const char **argv) goto help; /* Find the command */ - while (it && it->name) { + FOR_EACH_FLAT_LIST_ITEM (it, name) { is_ok = (!strncasecmp(argv[0], it->name, strlen(argv[0]))); call[is_ok] = it->call; count += is_ok; - it = opts + (++offset); } /* Now search for a unique match */ @@ -142,22 +141,15 @@ cmd_parse(struct cmd_opt *opts, int argc, const char **argv) if (!call[1] || count == 0) goto not_found; - struct cmd_args arguments = { - .argc = argc - 1, - .argv = (const char **)&(argv[1]), - }; - /* This call should exit. */ + struct cmd_args arguments = CMD_ARGS_NEXT_FROM(argc, argv); call[1](&arguments); - exit(EXIT_FAILURE); + abort(); not_found: /* The default function */ if (!it->name && it->call) { - struct cmd_args arguments = { - .argc = argc, - .argv = (const char **)argv, - }; + struct cmd_args arguments = CMD_ARGS_FROM(argc, argv); it->call(&arguments); } @@ -169,5 +161,5 @@ help: not_exclusive: LOG_ERROR("COMMAND", "Failed to determine option, '%s' not exclusive", argv[0]); - exit(EXIT_FAILURE); + abort(); }