cemu
载入中...
搜索中...
未找到
argparse.h
浏览该文件的文档.
1
72#ifndef ARGPARSE_H
73#define ARGPARSE_H
74
75// ==================================================================== //
76// Include
77// ==================================================================== //
78
79
80#ifdef __cplusplus
81 extern "C" {
82#endif
83
84#include <stdbool.h>
85#include <stdio.h>
86#include <stdlib.h>
87#include <string.h>
88#include "color.h"
89
90
91
92// ==================================================================== //
93// Define
94// ==================================================================== //
95
96
97/* 解析器包含的子命令数 */
98#ifndef AP_MAX_NCOMMAND
99#define AP_MAX_NCOMMAND 10
100#endif
101
102/* 长参数名前的flag */
103#ifndef AP_LONG_FLAG
104#define AP_LONG_FLAG "--"
105#endif
106
107/* 短参数名前的flag */
108#ifndef AP_SHORT_FLAG
109#define AP_SHORT_FLAG "-"
110#endif
111
112#define AP_DEFAULT_COMMAND "default"
113
114#define AP_END_ARG \
115 { \
116 0 \
117 }
118
119#define AP_INPUT_ARG \
120 { \
121 .short_arg = "i", \
122 .long_arg = "input", \
123 .init.s = "", \
124 .help = "set input file" \
125 }
126
127#define ap_min(a, b) ((a) > (b) ? (b) : (a))
128#define ap_max(a, b) ((a) > (b) ? (a) : (b))
129
130#define NOW_CMD (&pap->commands[pap->command_pos])
131
132/* 错误提示 */
133#define ERROR_MSG _red(" [ERROR]")
134#define ap_err(msg) (ERROR_MSG ": " msg "\n")
135
136// 命令冲突
137#ifndef ERROR_COMMAND_CONFLICT
138#define ERROR_COMMAND_CONFLICT ap_err("Conflict.")
139#endif
140
141// 没有传递子命令
142#ifndef ERROR_NO_SUBCOMMAND
143#define ERROR_NO_SUBCOMMAND ap_err("Pass a subcommand.")
144#endif
145
146// 没有传递参数值
147#ifndef ERROR_LOST_ARG_VALUE
148#define ERROR_LOST_ARG_VALUE ap_err("\"%s\" lost arg value.")
149#endif
150
151#ifndef ERROR_DONOT_NEED_VALUE
152#define ERROR_DONOT_NEED_VALUE ap_err("\"%s\" does not need arg value.")
153#endif
154
155#ifndef ERROR_ARG_NOT_EXIST
156#define ERROR_ARG_NOT_EXIST ap_err("Arg name \"%s\" does not exist.")
157#endif
158
159#ifndef ERROR_LOST_ARG_NAME
160#define ERROR_LOST_ARG_NAME ap_err("Except a arg name, but got \"%s\".")
161#endif
162
163#ifndef ERROR_SUBCOMMAND_NOT_EXIST
164#define ERROR_SUBCOMMAND_NOT_EXIST ap_err("Subcommand %s does not exist.")
165#endif
166
167
168// ==================================================================== //
169// Sturct: Argparser
170// ==================================================================== //
171
172/* 是否跟随参数 */
173typedef enum {
174 ap_YES = 0,
175 ap_NO
176} ArgValue;
177
178typedef struct {
179 /* 单短线参数名 */
180 char *short_arg;
181 /* 双短线参数名 */
182 char *long_arg;
183 /* 是否跟随参数值 */
184 ArgValue arg_have_value;
185 /* 传递值 */
186 char *value;
187 /* 初始值 */
188 union {
189 int i;
190 bool b;
191 float f;
192 char *s;
193 void *v;
194 } init;
195 /* 参数的说明 */
196 char *help;
197} ap_arg_t;
198
199
200/* command对应的回调函数 */
201typedef void (*callback_t)(int argc, char *argv[], char *envp[]);
202
203typedef struct
204{
205 /* 命令名
206 * - 全局命令为NULL
207 * - 子命令时,为子命令名
208 **/
209 char *command;
210 /* 对命令的描述 */
211 char *description;
212 /* 命令的用法 */
213 char *usage;
214 /* 是否是子命令 */
215 int subcommand;
216 /* 参数个数 */
217 int nargs;
218 /* 命令的回调函数 */
219 callback_t callback;
220 /* 存储的参数 */
221 ap_arg_t *args;
223
224/* 打印command的回调函数 */
225typedef void (*print_ap_command_t)(ap_command_t *);
226
228{
229 /* 程序开始运行打印的内容
230 * 可以是logo之类的
231 **/
232 char *print;
233 /* 命令个数 */
234 int ncommand;
235 /* 存储的命令 */
236 ap_command_t commands[AP_MAX_NCOMMAND];
237 /* 当前命令行使用的command命令 */
238 int command_pos;
239 /* 自定义打印command参数 */
240 print_ap_command_t print_command;
241 /* 程序名 */
242 char *prog_name;
243 /* 程序名去除路径 */
244 char *prog_name_without_path;
245 /* 有全局命令 */
246 int have_global;
247 /* 有子命令 */
248 int have_subcommand;
249};
250
251
252// ==================================================================== //
253// Declare API: Argparse
254// ==================================================================== //
255
256
257/* 定义参数用到的宏 */
258#define ap_def_args(name) static ap_arg_t name[]
259#define ap_def_callback(name) void name(int argc, char *argv[], char *envp[])
260
267void ap_init_parser(char *print_message, print_ap_command_t print_command);
268
278void ap_add_command(char *command, char *description, char *usage, callback_t callback, ap_arg_t *args);
279
286ap_arg_t* ap_get(char *arg_name);
287
293
299
303static inline void ap_print_parser(void);
304
305static inline void ap_print_command(void);
306
313void ap_do_parser(int argc, char *argv[], char *envp[]);
314
315#ifdef __cplusplus
316}
317#endif
318
319#endif
ap_arg_t * ap_get(char *arg_name)
根据参数名获取参数值
Definition argparse.c:131
static void ap_default_print_base_command(ap_command_t *c)
打印 command 简易版
void ap_do_parser(int argc, char *argv[], char *envp[])
解析命令行
Definition argparse.c:369
void ap_add_command(char *command, char *description, char *usage, callback_t callback, ap_arg_t *args)
添加一个子命令
Definition argparse.c:48
static void ap_default_print_command(ap_command_t *c)
打印command
void ap_init_parser(char *print_message, print_ap_command_t print_command)
初始化解析器
Definition argparse.c:39
static void ap_print_parser(void)
打印解析器
ANSI颜色宏头文件
Definition argparse-new.h:90
Definition argparse-new.h:119
Definition argparse.h:228