Files
CArgParse/README.md

6.5 KiB
Raw Permalink Blame History

CArgParse

C语言易用的命令参数分析

特性

  • 自动生成帮助信息
  • 命令自动帮助信息
  • 默认值支持
  • 子命令支持
  • 命令参数支持
  • 全局参数
  • 互斥参数(即将)

安装

cmake安装

cmake -S . -B build
cmake --build build
cmake --install build

conan安装

将库构建为conan

conan create .

示例程序

构建简单的命令行程序,更多示例请参考example目录

#include "ArgParse.h"
#include <stdbool.h>
#include <stdio.h>
#include <string.h>

ArgParse *Init() {
    ArgParse *ap = argParseInit("简单的命令行工具示例",ArgParseNOVALUE);

    // 添加第一个命令
    Command *cmd = argParseAddCommand(
        ap, "list", "列出文件列表", NULL, NULL, NULL, ArgParseSINGLEVALUE);

    // 添加第一个命令的参数
    argParseAddArg(cmd,
                   "-a",
                   "--all",
                   "列出所有文件包括隐藏文件",
                   NULL,
                   NULL,
                   false,
                   ArgParseNOVALUE);

    return ap;
}

int main(int argc, char *argv[]) {
    ArgParse *ap = Init();
    argParseParse(ap, argc, argv);

    char *dir = argParseGetCurCommandValue(ap);
    if (dir != NULL) {
        printf("列出目录: %s 的文件列表\n", dir);
    }

    if (argParseCheckCurArgTriggered(ap, "-a")) {
        printf("触发了 -a 参数,列出所有文件\n");
    }

    argParseFree(ap);
    return 0;
}
example -h

帮助信息

API

该API将分为两类一类是用于构造解析器另一类将用于解析参数

构造解析器

  1. 初始化解析器
ArgParse *argParseInit(char *documentationArgParseValueType value_type);
  • documentation 解析器的文档信息
  • valueType 程序本身需要的值类型
  1. 添加命令
Command *argParseAddCommand(ArgParse         *argParse,
                            char             *name,
                            char             *help,
                            char             *default_val, 
                            ArgParseCallback  callback,
                            CommandGroup     *group,
                            ArgParseValueType value_type);
  • argParse 解析器
  • name 命令名称
  • help 命令帮助信息
  • defaultVal 默认值
  • callback 命令回调函数(可选)
  • group 命令组(可选)
  • valueType 命令参数类型
  1. 添加命令参数
CommandArgs *argParseAddArg(Command          *command,
                            char             *short_opt,
                            char             *long_opt,
                            char             *help,
                            char             *default_val,
                            ArgParseCallback  callback,
                            bool              required,
                            ArgParseValueType value_type);
  • command 命令
  • shortOpt 短选项
  • longOpt 长选项
  • help 帮助信息
  • defaultVal 默认值
  • callback 回调函数(可选)
  • required 是否必须
  • valueType 参数类型
  1. 添加子命令
Command *argParseAddSubCommand(Command          *Parent,
                               char             *name,
                               char             *help,
                               char             *default_val,
                               ArgParseCallback  callback,
                               CommandGroup     *group,
                               ArgParseValueType value_type);
  • Parent 父命令
  • name 命令名称
  • help 命令帮助信息
  • defaultVal 默认值
  • callback 回调函数(可选)
  • group 命令组(可选)
  • valueType 命令参数类型
  1. 添加全局参数
CommandArgs *argParseAddGlobalArg(ArgParse         *argParse,
                                  char             *short_opt,
                                  char             *long_opt,
                                  char             *help,
                                  char             *default_val,
                                  ArgParseCallback  callback,
                                  bool              required,
                                  ArgParseValueType value_type);
  • argParse 解析器
  • shortOpt 短选项
  • longOpt 长选项
  • help 帮助信息
  • defaultVal 默认值
  • callback 回调函数(可选)
  • required 是否必须
  • valueType 参数类型

解析参数API

  1. 解析参数
void argParseParse(ArgParse *argParse, int argc, char *argv[]);
  • argParse 解析器
  • argc 参数个数
  • argv 参数列表
  1. 获取当前解析到的命令名字
char *argParseGetCurCommandName(ArgParse *argParse);
  • argParse 解析器

注意,解析到的命令为最后一次出现的命令,也可能是子命令

  1. 获取当前命令的值
char *argParseGetCurCommandValue(ArgParse *argParse);
  • argParse 解析器

注意,解析到的命令为最后一次出现的命令,也可能是子命令

  1. 获取当前命令的某个参数的值
char *argParseGetCurArg(ArgParse *argParse, char *opt);
  • argParse 解析器
  • opt 参数选项
  1. 获取当前命令的某个选项的值列表(当为多值类型时使用该函数)
char **argParseGetCurArgList(ArgParse *argParse, char *opt, int *len);
  • argParse 解析器
  • opt 参数选项
  • len 参数个数
  1. 获取全局选项的值
char *argParseGetGlobalArg(ArgParse *argParse, char *opt);
  • argParse 解析器
  • opt 参数选项
  1. 获取全局选项的值列表
char **argParseGetGlobalArgList(ArgParse *argParse, char *opt, int *len);
  • argParse 解析器
  • opt 参数选项
  • len 参数个数
  1. 获取程序值 该值为非命令的值,类似gcc main.c,该类程序没有使用命令,因此该值就是main.c
char  *argParseGetVal(ArgParse *argParse);
char **argParseGetValList(ArgParse *argParse, int *len);
  • argParse 解析器
  • len 参数个数

触发检测API

  1. 检测当前检测的命令的某个选项是否触发
bool argParseCheckCurArgTriggered(ArgParse *argParse, char *opt);
  • argParse 解析器
  • opt 参数选项
  1. 检测某个命令是否被触发
bool argParseCheckCommandTriggered(ArgParse *argParse, char *command_name);
  • argParse 解析器
  • command_name 命令名称
  1. 检测某个全局选项是否被触发
bool argParseCheckGlobalTriggered(ArgParse *argParse, char *opt);
  • argParse 解析器
  • opt 参数选项