196 if (command ==
NULL) {
206 if (have_global && have_subcommand) {
207 fprintf(stderr, ERROR_COMMAND_CONFLICT);
210 if (!(have_global || have_subcommand)) {
211 fprintf(stderr, ERROR_NO_SUBCOMMAND);
215 if (pp->ncommand > AP_MAX_NCOMMAND - 1) {
216 fprintf(stderr, _red(
"[ERROR]:")
"Too many commands. Change AP_MAX_NCOMMAND bigger.\n");
220 pp->commands[pp->ncommand].command = command;
221 pp->commands[pp->ncommand].description= (
char *)malloc(strlen(description) + 1);
222 strcpy(pp->commands[pp->ncommand].description, description ==
NULL ?
"" : description);
223 pp->commands[pp->ncommand].usage = (
char *)malloc(strlen(usage) + 1);
224 strcpy(pp->commands[pp->ncommand].usage, usage ==
NULL ?
"" : usage);
225 pp->commands[pp->ncommand].callback = callback;
226 pp->commands[pp->ncommand].args = args;
230 if (args[nargs].long_arg || args[nargs].short_arg) {
231 if (args[nargs].help ==
NULL) {
232 args[nargs].help =
"";
239 pp->commands[pp->ncommand].nargs = nargs;
350 if (strcmp(argv[0],
"-h") == 0 || strcmp(argv[0],
"--help") == 0) {
364 int short_flag_len = strlen(AP_SHORT_FLAG);
365 int long_flag_len = strlen(AP_LONG_FLAG);
369 char* arg_name =
NULL;
376 char* need_parse = argv[count];
377 int need_parse_len = strlen(need_parse);
380 int is_short = strncmp(need_parse, AP_SHORT_FLAG, ap_min(need_parse_len, short_flag_len)) == 0;
381 int is_long = strncmp(need_parse, AP_LONG_FLAG, ap_min(need_parse_len, long_flag_len)) == 0;
383 if (is_short || is_long) {
388 prefix = AP_LONG_FLAG;
390 prefix = AP_SHORT_FLAG;
392 int prefix_len = strlen(prefix);
393 arg_name = need_parse + prefix_len;
397 for (
int i = 0; i < (NOW)->nargs; i++) {
398 arg = &((NOW)->args[i]);
399 int short_succ = strcmp(arg_name, arg->short_arg) == 0;
400 int long_succ = strcmp(arg_name, arg->long_arg) == 0;
401 if (short_succ || long_succ) {
407 fprintf(stderr, ERROR_ARG_NOT_EXIST, arg_name - prefix_len);
416 fprintf(stderr, ERROR_LOST_ARG_NAME, need_parse);
421 if (status && arg->arg_have_value == AP_NO) {
423 fprintf(stderr, ERROR_DONOT_NEED_VALUE, arg->long_arg);
427 if (status && arg->arg_have_value == AP_YES) {
428 arg->value = need_parse;
432 if (!status && arg->arg_have_value == AP_NO) {
437 if (arg && arg->arg_have_value == AP_YES) {
438 fprintf(stderr, ERROR_LOST_ARG_VALUE, arg->long_arg);
452 int argc_copy = argc;
453 char** argv_copy = argv;
455 if (strcmp(argv[1],
"-h") == 0 || strcmp(argv[1],
"--help") == 0) {
464 if (have_subcommand) {
469 fprintf(stderr, ERROR_NO_SUBCOMMAND);
472 subcommand = argv[0];
474 for (
int i = 0; i < pp->ncommand; i++) {
475 if (strcmp(pp->commands[i].command, subcommand) == 0) {
476 pp->commands[i].subcommand = 1;
483 fprintf(stderr, ERROR_SUBCOMMAND_NOT_EXIST, subcommand);
494 (NOW)->callback(argc_copy, argv_copy, env);
static void ap_do_parser(int argc, char *argv[], char *env[])
解析命令行
Definition argparse-new.h:450
static int _is_eq(char *arg_name, ap_arg_t arg)
判断当前参数名是否与command中的参数名相同
Definition argparse-new.h:251
static void ap_add_command(char *command, char *description, char *usage, callback_t callback, ap_arg_t *args)
添加一个子命令
Definition argparse-new.h:189