menu XUJINKAI 的个人主页
create settings
home
主页
list
全部博文
  • Collection
  • About
  • assistant_photo
    个人项目
    person
    关于

    开源一个C语言命令行解析库

    Tags: C

    C语言做命令行解析,说复杂也不复杂,GNU库提供了getoptargp两个命令行解析工具,甚至自己用strcmp就能实现。但是当命令繁多,需要嵌套子命令,或是需要更多的自定义时,这两个库就不够看了。

    根据我自己使用上的需要和总结,我写了一个自己的命令行解析库cmdparser。在使用简单、保证代码简洁的同时,也提供了很多扩展点,同时有完善的测试和使用示例。

    项目地址:https://github.com/XUJINKAI/cmdparser

    主要特点:

    • 定义在一个结构体中,保证代码结构清晰简单。

    • 常见的长短选项支持 -a --all -n XJK --name=XJK --age 18,短选项支持缩写-an XJK

    • 子命令支持嵌套,支持别名。

    • 动态控制子命令和长短选项隐藏或停用。

    • 自定义帮助文档和错误提示信息。

    使用示例

    定义一个全局的结构体,指定好回调函数,然后调用cmdp_run函数即可。

    static cmdp_command_st cmdp = {
        .options = {
            {'i', "Int", "Input Int Option", CMDP_TYPE_INT4, &arg.i},
            {0},                        // 以{0}结束
        },
        .fn_process = callback,         // 回调函数
    };
    
    int main(int argc, char **argv)
    {
        return cmdp_run(argc - 1, argv + 1, &cmdp);
    }
    

    其中arg是一个全局的结构体,用于储存解析结果,完整的代码在demo_simple

    嵌套子命令,可设置sub_commands字段,如下:

    static cmdp_command_st cmdp = {
        .options = {...},
        .sub_commands = (cmdp_command_st[]){
            {
                .name = "sub",
                .options = {...},
                .fn_process = sub_callback,
            },
            {0},                        // 以{0}结束
        },
    };
    

    demo_git是一个仿照git命令的示例程序,展示了更复杂的情况。

    test目录中是测试代码,其中有自定义错误提示为子命令设置别名等示例。

    这套库迭代了好几版,现在趋于稳定,自己用着感觉不错,所以放出来,欢迎star和提issue。

    https://github.com/XUJINKAI/cmdparser


    Disqus评论加载中。。。