feat(argparse): 添加命令行参数约束和错误处理功能
- 添加了命令行参数约束相关数据结构定义 - 新增错误上下文字段用于更好的错误提示 - 实现了参数验证功能,包括必需参数检查和值选择验证 - 改进错误处理流程,支持添加帮助信息和使用说明 - 优化调试输出格式,增加更多错误场景的处理 fix(parser): 修复语义分析器资源释放问题 - 在scc_sema_drop函数中添加空指针检查,避免空指针释放导致崩溃 refactor(dump): 重构AST节点转储实现 - 将树形转储上下文重构为更简洁的数据结构 - 修改转储回调函数签名以支持更好的缓冲区管理 - 优化内存拷贝操作,提高转储性能 style(amd64): 移除未使用的变量声明 - 删除scc_mcode_amd64_mov_r64_m64_sib函数中未使用的disp8变量
This commit is contained in:
@@ -12,6 +12,7 @@ enum {
|
||||
ARGPARSE_SHOW_CMD,
|
||||
ARGPARSE_SHOW_HELP_MSG,
|
||||
|
||||
ARGPRASE_USING_HELP_HINT,
|
||||
ARGPARSE_UNKNOWN_ARGUMENT,
|
||||
ARGPARSE_INVALID_VALUE_FOR_OPTION,
|
||||
ARGPARSE_OPTION_MISSING_VALUE,
|
||||
@@ -28,10 +29,12 @@ static const char *fmt_en[] = {
|
||||
[ARGPARSE_SHOW_CMD] = "Commands:\n",
|
||||
[ARGPARSE_SHOW_HELP_MSG] = "Show this help message and exit",
|
||||
|
||||
[ARGPARSE_UNKNOWN_ARGUMENT] = "Unknown argument '%s'",
|
||||
[ARGPRASE_USING_HELP_HINT] =
|
||||
"Using '-h' or '--help' to get more information\n",
|
||||
[ARGPARSE_UNKNOWN_ARGUMENT] = "Unknown argument '%s'\n",
|
||||
[ARGPARSE_INVALID_VALUE_FOR_OPTION] = "Invalid value for option '%s'\n",
|
||||
[ARGPARSE_OPTION_MISSING_VALUE] = "Option '%s' missing value\n",
|
||||
[ARGPARSE_DID_YOU_MEAN] = "; Did you mean: '%s'?\n",
|
||||
[ARGPARSE_DID_YOU_MEAN] = "Did you mean: '%s'?\n",
|
||||
};
|
||||
|
||||
static const char *fmt_zh[] = {
|
||||
@@ -44,10 +47,11 @@ static const char *fmt_zh[] = {
|
||||
[ARGPARSE_SHOW_CMD] = "命令:\n",
|
||||
[ARGPARSE_SHOW_HELP_MSG] = "显示帮助信息并退出",
|
||||
|
||||
[ARGPARSE_UNKNOWN_ARGUMENT] = "未知的参数 '%s'",
|
||||
[ARGPRASE_USING_HELP_HINT] = "使用 '-h' 或者 '--help' 获取更多信息\n",
|
||||
[ARGPARSE_UNKNOWN_ARGUMENT] = "未知的参数 '%s'\n",
|
||||
[ARGPARSE_INVALID_VALUE_FOR_OPTION] = "无效的选项值 '%s'\n",
|
||||
[ARGPARSE_OPTION_MISSING_VALUE] = "选项 '%s' 缺少值\n",
|
||||
[ARGPARSE_DID_YOU_MEAN] = "; 您是不是想要输入: '%s'?\n",
|
||||
[ARGPARSE_DID_YOU_MEAN] = "您是不是想要输入: '%s'?\n",
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -95,7 +99,7 @@ static int scc_levenshtein(const char *s1, const char *s2) {
|
||||
return dist;
|
||||
}
|
||||
|
||||
void scc_argparse_print_help(scc_argparse_t *parser, scc_argparse_cmd_t *cmd) {
|
||||
static void print_usage(scc_argparse_t *parser, scc_argparse_cmd_t *cmd) {
|
||||
const char **lines =
|
||||
(parser->lang == SCC_ARGPARSE_LANG_ZH) ? fmt_zh : fmt_en;
|
||||
scc_printf(lines[ARGPARSE_USAGE],
|
||||
@@ -109,6 +113,14 @@ void scc_argparse_print_help(scc_argparse_t *parser, scc_argparse_cmd_t *cmd) {
|
||||
if (scc_vec_size(cmd->subcmds) > 0)
|
||||
scc_printf(lines[ARGPARSE_COMMAND]);
|
||||
scc_printf("\n\n");
|
||||
}
|
||||
|
||||
void scc_argparse_print_help(scc_argparse_t *parser, scc_argparse_cmd_t *cmd) {
|
||||
const char **lines =
|
||||
(parser->lang == SCC_ARGPARSE_LANG_ZH) ? fmt_zh : fmt_en;
|
||||
|
||||
print_usage(parser, cmd);
|
||||
|
||||
if (cmd->description)
|
||||
scc_printf("%s\n\n", cmd->description);
|
||||
|
||||
@@ -197,28 +209,40 @@ const char *scc_argparse_find_similar_arg(scc_argparse_cmd_t *cmd,
|
||||
}
|
||||
|
||||
void scc_argparse_print_error(scc_argparse_context_t *ctx,
|
||||
scc_argparse_err_t err) {
|
||||
const char **lines = (ctx->lang == SCC_ARGPARSE_LANG_ZH) ? fmt_zh : fmt_en;
|
||||
const char *optname = ctx->result.raw_arg;
|
||||
scc_argparse_t *parser, scc_argparse_err_t err) {
|
||||
const char **lines =
|
||||
(parser->lang == SCC_ARGPARSE_LANG_ZH) ? fmt_zh : fmt_en;
|
||||
switch (err) {
|
||||
case SCC_ARGPARSE_ERR_INVALID_ARG:
|
||||
case SCC_ARGPARSE_ERR_INVALID_VALUE:
|
||||
scc_printf(lines[ARGPARSE_INVALID_VALUE_FOR_OPTION], optname);
|
||||
scc_printf(lines[ARGPARSE_INVALID_VALUE_FOR_OPTION], ctx->err_ctx);
|
||||
break;
|
||||
case SCC_ARGPARSE_ERR_MISSING_ARG:
|
||||
case SCC_ARGPARSE_ERR_MISSING_VALUE:
|
||||
scc_printf(lines[ARGPARSE_OPTION_MISSING_VALUE], optname);
|
||||
scc_printf(lines[ARGPARSE_OPTION_MISSING_VALUE], ctx->err_ctx);
|
||||
break;
|
||||
case SCC_ARGPARSE_ERR_UNKNOWN_ARG:
|
||||
case SCC_ARGPARSE_ERR_UNKNOWN_VALUE:
|
||||
scc_printf(lines[ARGPARSE_UNKNOWN_ARGUMENT], optname);
|
||||
const char *similar_arg =
|
||||
scc_argparse_find_similar_arg(ctx->current_cmd, optname);
|
||||
scc_printf(lines[ARGPARSE_UNKNOWN_ARGUMENT], ctx->result.raw_arg);
|
||||
const char *similar_arg = scc_argparse_find_similar_arg(
|
||||
ctx->current_cmd, ctx->result.raw_arg);
|
||||
if (similar_arg != 0) {
|
||||
scc_printf(lines[ARGPARSE_DID_YOU_MEAN], similar_arg);
|
||||
}
|
||||
break;
|
||||
// FACK ERROR
|
||||
case SCC_ARGPARSE_ERR_PNT_DEFAULT:
|
||||
return;
|
||||
default:
|
||||
scc_printf("Unknown error: %d\n", err);
|
||||
break;
|
||||
}
|
||||
if (parser->need_help) {
|
||||
scc_printf(lines[ARGPRASE_USING_HELP_HINT]);
|
||||
}
|
||||
if (parser->need_error_add_help) {
|
||||
scc_argparse_print_help(parser, ctx->current_cmd);
|
||||
} else if (parser->need_error_add_usage) {
|
||||
print_usage(parser, ctx->current_cmd);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user