Files
scc/libs/argparse/src/main.c
zzy 630e22b73b feat(argparse): 添加命令行参数约束和错误处理功能
- 添加了命令行参数约束相关数据结构定义
- 新增错误上下文字段用于更好的错误提示
- 实现了参数验证功能,包括必需参数检查和值选择验证
- 改进错误处理流程,支持添加帮助信息和使用说明
- 优化调试输出格式,增加更多错误场景的处理

fix(parser): 修复语义分析器资源释放问题

- 在scc_sema_drop函数中添加空指针检查,避免空指针释放导致崩溃

refactor(dump): 重构AST节点转储实现

- 将树形转储上下文重构为更简洁的数据结构
- 修改转储回调函数签名以支持更好的缓冲区管理
- 优化内存拷贝操作,提高转储性能

style(amd64): 移除未使用的变量声明

- 删除scc_mcode_amd64_mov_r64_m64_sib函数中未使用的disp8变量
2026-04-11 11:42:31 +08:00

113 lines
4.0 KiB
C

#include <argparse.h>
#ifdef _WIN32
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#endif
typedef struct {
int verbose; // -v, --verbose
const char *output; // -o, --output
const char *config; // --config
const char *input; // input argument
const char *output_dir; // output_dir argument
cbool force; // -f, --force (for subcommand)
const char *path; // path argument (for subcommand)
} parsed_args_t;
int main(int argc, const char **argv, const char **envp) {
#ifdef _WIN32
SetConsoleOutputCP(CP_UTF8);
SetConsoleCP(CP_UTF8);
#endif
// 初始化解析结果结构体
parsed_args_t parsed = {0};
parsed.output = "a.out"; // 默认值
parsed.output_dir = "."; // 默认值
parsed.path = "."; // 默认值
// 初始化 argparse
scc_argparse_t argparse;
scc_argparse_init(&argparse, "demo", "一个命令行参数解析演示工具");
argparse.need_debug = true;
argparse.lang = SCC_ARGPARSE_LANG_ZH; // 中文帮助
scc_argparse_cmd_t *root = scc_argparse_get_root(&argparse);
// ---------- 添加选项 ----------
// 1. --verbose / -v (计数)
scc_argparse_opt_t verbose;
scc_argparse_opt_init(&verbose, 'v', "verbose",
"增加详细程度(可多次使用)");
scc_argparse_spec_setup_count(&verbose.spec, &parsed.verbose);
scc_argparse_cmd_add_opt(root, &verbose);
// 2. --output / -o (字符串)
scc_argparse_opt_t output;
scc_argparse_opt_init(&output, 'o', "output", "输出文件路径");
scc_argparse_spec_setup_string(&output.spec, &parsed.output);
scc_argparse_cmd_add_opt(root, &output);
// 3. --config (字符串)
scc_argparse_opt_t config;
scc_argparse_opt_init(&config, 0, "config", "配置文件路径");
scc_argparse_spec_setup_string(&config.spec, &parsed.config);
scc_argparse_cmd_add_opt(root, &config);
// ---------- 添加位置参数 ----------
// 必需参数: input
scc_argparse_arg_t input;
scc_argparse_arg_init(&input, "input", "输入文件");
scc_argparse_spec_setup_string(&input.spec, &parsed.input);
scc_argparse_spec_set_required(&input.spec, true);
scc_argparse_cmd_add_arg(root, &input);
// 可选参数: output_dir
scc_argparse_arg_t output_dir;
scc_argparse_arg_init(&output_dir, "output_dir", "输出目录");
scc_argparse_spec_setup_string(&output_dir.spec, &parsed.output_dir);
scc_argparse_spec_set_required(&output_dir.spec, false);
scc_argparse_cmd_add_arg(root, &output_dir);
// ---------- 子命令 init ----------
scc_argparse_cmd_t init_cmd;
scc_argparse_cmd_init(&init_cmd, "init", "初始化仓库");
// 子命令选项: --force / -f
scc_argparse_opt_t force;
scc_argparse_opt_init(&force, 'f', "force", "强制覆盖");
scc_argparse_spec_setup_bool(&force.spec, &parsed.force);
scc_argparse_cmd_add_opt(&init_cmd, &force);
// 子命令位置参数: path (可选)
scc_argparse_arg_t path;
scc_argparse_arg_init(&path, "path", "初始化路径");
scc_argparse_spec_setup_string(&path.spec, &parsed.path);
scc_argparse_spec_set_required(&path.spec, false);
scc_argparse_cmd_add_arg(&init_cmd, &path);
// 将子命令加入根命令
scc_argparse_cmd_add_subcmd(root, &init_cmd);
// 解析参数
int ret = scc_argparse_parse(&argparse, argc, argv);
// 打印解析结果
if (ret == 0) {
scc_printf("\n解析成功\n");
scc_printf("解析到的参数和选项:\n");
scc_printf(" verbose: %d\n", parsed.verbose);
scc_printf(" output: %s\n", parsed.output);
scc_printf(" config: %s\n",
parsed.config ? parsed.config : "(未指定)");
scc_printf(" input: %s\n", parsed.input);
scc_printf(" output_dir: %s\n", parsed.output_dir);
scc_printf(" force: %s\n", parsed.force ? "true" : "false");
scc_printf(" path: %s\n", parsed.path);
}
scc_argparse_drop(&argparse);
return ret;
}