cemu
载入中...
搜索中...
未找到
argparse.h 文件参考

命令行解析库头文件 更多...

#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "color.h"

浏览源代码.

struct  ap_arg_t
 
struct  ap_command_t
 
struct  argparse_t
 

宏定义

#define AP_MAX_NCOMMAND   10
 
#define AP_LONG_FLAG   "--"
 
#define AP_SHORT_FLAG   "-"
 
#define AP_DEFAULT_COMMAND   "default"
 
#define AP_END_ARG
 
#define AP_INPUT_ARG
 
#define ap_min(a, b)   ((a) > (b) ? (b) : (a))
 
#define ap_max(a, b)   ((a) > (b) ? (a) : (b))
 
#define NOW_CMD   (&pap->commands[pap->command_pos])
 
#define ERROR_MSG   _red(" [ERROR]")
 
#define ap_err(msg)   (ERROR_MSG ": " msg "\n")
 
#define ERROR_COMMAND_CONFLICT   ap_err("Conflict.")
 
#define ERROR_NO_SUBCOMMAND   ap_err("Pass a subcommand.")
 
#define ERROR_LOST_ARG_VALUE   ap_err("\"%s\" lost arg value.")
 
#define ERROR_DONOT_NEED_VALUE   ap_err("\"%s\" does not need arg value.")
 
#define ERROR_ARG_NOT_EXIST   ap_err("Arg name \"%s\" does not exist.")
 
#define ERROR_LOST_ARG_NAME   ap_err("Except a arg name, but got \"%s\".")
 
#define ERROR_SUBCOMMAND_NOT_EXIST   ap_err("Subcommand %s does not exist.")
 
#define ap_def_args(name)   static ap_arg_t name[]
 
#define ap_def_callback(name)   void name(int argc, char *argv[], char *envp[])
 

类型定义

typedef void(* callback_t) (int argc, char *argv[], char *envp[])
 
typedef void(* print_ap_command_t) (ap_command_t *)
 

枚举

enum  ArgValue { ap_YES = 0 , ap_NO }
 

函数

void ap_init_parser (char *print_message, print_ap_command_t print_command)
 初始化解析器
 
void ap_add_command (char *command, char *description, char *usage, callback_t callback, ap_arg_t *args)
 添加一个子命令
 
ap_arg_tap_get (char *arg_name)
 根据参数名获取参数值
 
static void ap_default_print_command (ap_command_t *c)
 打印command
 
static void ap_default_print_base_command (ap_command_t *c)
 打印 command 简易版
 
static void ap_print_parser (void)
 打印解析器
 
static void ap_print_command (void)
 
void ap_do_parser (int argc, char *argv[], char *envp[])
 解析命令行
 

详细描述

命令行解析库头文件

作者
lancer (you@d.nosp@m.omai.nosp@m.n.com)
版本
0.1
日期
2023-12-25
注解
参考项目:Github | argparse

参数解析步骤

  1. Step1: 使用宏 ap_def_args 定义参数
    #include "argparse.h"
    ap_def_args(test_args) = {
    {.short_arg = "o", .long_arg = "output", .init.s = "./test", .help = "set output path"},
    {.short_arg = "q", .long_arg = "quiet" , .init.b = true , .help = "quiet run"},
    {.short_arg = "d", .long_arg = "debug" , .init.b = false , .help = "debug mode"},
    AP_END_ARG
    };
    命令行解析库头文件
  2. Step2: 使用宏 ap_def_callback 定义回调函数
    ap_def_callback(test_callback) {
    ap_arg_t *arg = ap_get("output");
    if (!arg->value) {
    printf("no value. init: %s\n", arg->init.s);
    }
    else {
    printf("option output: %s\n", arg->value);
    }
    printf("option quiet: %d\n", ap_get("quiet")->init.b);
    printf("option debug: %d\n", ap_get("debug")->init.b);
    }
    static ap_arg_t * ap_get(char *arg_name)
    根据参数名获取参数值
    Definition argparse-new.h:268
    Definition argparse-new.h:90
  3. Step3: 使用宏 ap_init_parser 初始化解析器
    ap_init_parser("uemu - a simple emulator", NULL);
    static void ap_init_parser(char *print_message, print_ap_command_t print_command)
    初始化解析器
    Definition argparse-new.h:171
    #define NULL
    Definition list.h:22
  4. Step4: 使用宏 ap_add_command 添加命令
    ap_add_command("test", "Print `Hello, World!`.", "This is usage.", test_callback, test_args);
    static void ap_add_command(char *command, char *description, char *usage, callback_t callback, ap_arg_t *args)
    添加一个子命令
    Definition argparse-new.h:189
    注意
    添加命令名为 default 时,是设置主命令:
  5. Step5: 使用宏 ap_add_command 解析命令
    ap_do_parser(argc, argv, envp);
    static void ap_do_parser(int argc, char *argv[], char *env[])
    解析命令行
    Definition argparse-new.h:450
  6. Step6:示例
    void arg_parse(int argc, char *argv[], char *envp[])
    {
    // Step3: 初始化解析器
    ap_init_parser("uemu - a simple emulator", NULL);
    // Step4: 添加命令
    ap_add_command("default", "Default: print `Hello, World!`", "uemu test", hello_callback, help_args);
    ap_add_command("help", "This is description.", "This is usage.", help_callback, help_args);
    ap_add_command("debug", "Enter debug mode.", "This is usage.", debug_callback, debug_args);
    ap_add_command("test", "Unit test", "This is usage.", test_callback, test_args);
    // Step5: 开始解析
    ap_do_parser(argc, argv, envp);
    }

宏定义说明

◆ AP_END_ARG

#define AP_END_ARG
值:
{ \
0 \
}

◆ AP_INPUT_ARG

#define AP_INPUT_ARG
值:
{ \
.short_arg = "i", \
.long_arg = "input", \
.init.s = "", \
.help = "set input file" \
}

函数说明

◆ ap_add_command()

void ap_add_command ( char * command,
char * description,
char * usage,
callback_t callback,
ap_arg_t * args )

添加一个子命令

参数
command
description
usage
callback
args

◆ ap_default_print_base_command()

static void ap_default_print_base_command ( ap_command_t * c)
inlinestatic

打印 command 简易版

参数
c

◆ ap_default_print_command()

static void ap_default_print_command ( ap_command_t * c)
inlinestatic

打印command

参数
c

◆ ap_do_parser()

void ap_do_parser ( int argc,
char * argv[],
char * envp[] )

解析命令行

参数
argc
argv

◆ ap_get()

ap_arg_t * ap_get ( char * arg_name)

根据参数名获取参数值

参数
arg_name
返回
void*

◆ ap_init_parser()

void ap_init_parser ( char * print_message,
print_ap_command_t print_command )

初始化解析器

参数
print_message
print_command