首页 > 其他分享 >【ArgParse】一个开源的入参解析库

【ArgParse】一个开源的入参解析库

时间:2023-09-14 11:45:38浏览次数:42  
标签:count ArgParse arg 开源 tm exit printf 解析 exitcode

项目地址argtable3

 

本地验证:

  • 编译构建

  • 新增验证

// examples/skull.c
#include "argtable3.h"

int main(int argc, char **argv)
{
    const char* progname = "skull";
    struct arg_lit *help = arg_lit0("h", "help", "this is help info");
    struct arg_lit *litn = arg_litn("l", "literal", 0, 5, "./progname -l --literal");
    struct arg_int *intn = arg_intn("i", "integer", "<int>", 0, 5, "./program -i 10 -i 20 -i 30");
    struct arg_dbl *dbln = arg_dbln("d", "double", "<double>", 0, 5, "./program -d 3.14 -d 2.718 -d 1.414");
    struct arg_str *strn = arg_strn("s", "string", "<string>", 0, 5, "./program -s hello -s world");
    struct arg_rex *rexn = arg_rexn("r", "regular", "^[A-Za-z0-9]+$", "<regex>", 0, 5, ARG_REX_ICASE, "./program -r [digit] -r [letters]");
    struct arg_file *filen = arg_filen("f", "file", "<file>", 0, 5, "./program file1.txt file2.txt file3.txt");
    struct arg_date *daten  = arg_daten("a", "date", "%Y-%m-%d", "<date>", 0, 5, "./program -a 2023-09-01 -a 2023-09-02 -a 2023-09-03");
    struct arg_end *end   = arg_end(20);
    void* argtable[] = {help, litn, intn, dbln, strn, rexn, filen, daten, end};
    int nerrors;
    int exitcode=0;

    /* verify the argtable[] entries were allocated sucessfully */
    if (arg_nullcheck(argtable) != 0) {
        /* NULL entries were detected, some allocations must have failed */
        printf("%s: insufficient memory\n", progname);
        exitcode=1;
        goto exit;
    }

    /* Parse the command line as defined by argtable[] */
    nerrors = arg_parse(argc, argv, argtable);

    /* If the parser returned any errors then display them and exit */
    if (nerrors > 0) {
        /* Display the error details contained in the arg_end struct.*/
        arg_print_errors(stdout,end,progname);
        printf("Try '%s --help' for more information.\n", progname);
        exitcode=1;
        goto exit;
    }

    /* special case: '--help' takes precedence over error reporting */
    if (help->count > 0) {
        printf("Usage: %s", progname);
        arg_print_syntax(stdout, argtable, "\n");
        printf("Print certain system information.  With no options, same as -s.\n\n");
        arg_print_glossary(stdout, argtable,"  %-25s %s\n");
        printf("\nReport bugs to <foo@bar>.\n");
        exitcode=0;
        goto exit;
    }

    /* special case: '--version' takes precedence error reporting */
    if (litn->count > 0) {
        printf("'%s'  count: %d.\n", litn->hdr.glossary, litn->count);
        exitcode=0;
        goto exit;
    }

    if (intn->count > 0) {
        printf("'%s'  count: %d.\n", intn->hdr.glossary, intn->count);
        for (int i = 0; i < intn->count; i++) {
            printf("Integer %d: %d\n", i+1, intn->ival[i]);
        }
        exitcode=0;
        goto exit;
    }

    if (dbln->count > 0) {
        printf("'%s'  count: %d.\n", dbln->hdr.glossary, dbln->count);
        for (int i = 0; i < dbln->count; i++) {
            printf("Double %d: %lf\n", i+1, dbln->dval[i]);
        }
        exitcode=0;
        goto exit;
    }

    if (strn->count > 0) {
        printf("'%s'  count: %d.\n", strn->hdr.glossary, strn->count);
        for (int i = 0; i < strn->count; i++) {
            printf("String %d: %s\n", i+1, strn->sval[i]);
        }
        exitcode=0;
        goto exit;
    }

    if (rexn->count > 0) {
        printf("'%s'  count: %d.\n", rexn->hdr.glossary, rexn->count);
        for (int i = 0; i < rexn->count; i++) {
            printf("Regular %d: %s\n", i+1, rexn->sval[i]);
        }
        exitcode=0;
        goto exit;
    }

    if (filen->count > 0) {
        printf("'%s'  count: %d.\n", filen->hdr.glossary, filen->count);
        for (int i = 0; i < filen->count; i++) {
            printf("File %d: %s\n", i+1, filen->filename[i]);
        }
        exitcode=0;
        goto exit;
    }

    if (daten->count > 0) {
        printf("'%s'  count: %d.\n", daten->hdr.glossary, daten->count);
        for (int i = 0; i < daten->count; i++) {
            printf("Date %d: %04d-%02d-%02d\n", i+1, daten->tmval[i].tm_year, daten->tmval[i].tm_mon, daten->tmval[i].tm_mday);
        }
        exitcode=0;
        goto exit;
    }

exit:
    /* deallocate each non-null entry in argtable[] */
    arg_freetable(argtable,sizeof(argtable)/sizeof(argtable[0]));

    return exitcode;
}
  • 源码修改

 实测月份少1,年份是基于1900

// src/arg_date.c
char* arg_strptime(const char* buf, const char* fmt, struct tm* tm) {
    while ((c = *fmt) != '\0') {
        /* Clear `alternate' modifier prior to new conversion. */
        alt_format = 0;

        /* Eat up white-space. */
        if (isspace(c)) {
            while (isspace((int)(*bp)))
                bp++;

            fmt++;
            continue;
        }

        if ((c = *fmt++) != '%')
            goto literal;

    again:
        switch (c = *fmt++) {
            case 'm': /* The month. */
                LEGAL_ALT(ALT_O);
                if (!(conv_num(&bp, &i, 1, 12)))
                    return (0);
                /* tm->tm_mon = i- 1; @skull #2023-9-14 10:18:34 */
                tm->tm_mon = i;
                break;

            case 'Y': /* The year. */
                LEGAL_ALT(ALT_E);
                if (!(conv_num(&bp, &i, 0, 9999)))
                    return (0);
                /* tm->tm_year = i - TM_YEAR_BASE; @skull #2023-9-14 10:19:59 */
                tm->tm_year = i;
                break;

 

标签:count,ArgParse,arg,开源,tm,exit,printf,解析,exitcode
From: https://www.cnblogs.com/skullboyer/p/17702117.html

相关文章

  • flutter解析html的图片和链接
    html链接内容如下:"<p><ahref="https://www.hihonor.com/cn/m/notice-14658"rel="nofollow"><imgalt="750.png"src="https://hshop.honorfile.com/pimages/detailImg/2023/08/31/C757CDF3D975230D36F9176D41A90......
  • 向量数据库简介和5个常用的开源项目介绍
    在人工智能领域,有大量的数据需要有效的处理。随着我们对人工智能应用,如图像识别、语音搜索或推荐引擎的深入研究,数据的性质变得更加复杂。这就是向量数据库发挥作用的地方。与存储标量值的传统数据库不同,向量数据库专门设计用于处理多维数据点(通常称为向量)。这些向量表示多个维......
  • 网络规划设计师真题解析--独立磁盘冗余阵列RAID(一)
    RAID1中数据冗余是通过什么技术实现的()。A.OXR运算    B.海明码校验    C.P+Q双校验    D.镜像答案:D解析:RAID1,磁盘镜像,可并行读数据,由于在不同的两块磁盘写入相同数据,写入数据比RAID0慢一些。安全性最好,但空间利用率最低。实现RAID1至少需要2块硬盘。《网络规划设......
  • 基于开源模型搭建实时人脸识别系统(二):人脸检测概览与模型选型
    续基于开源模型的实时人脸识别系统进行人脸识别首要的任务就是要定位出画面中的人脸,这个任务就是人脸检测。人脸检测总体上算是目标检测的一个特殊情况,但也有自身的特点,比如角度多变,表情多变,可能存在各类遮挡。早期传统的方法有HaarCascade、HOG等,基本做法就是特征描述子+滑窗+......
  • 弹幕小游戏源码设计重点解析
      弹幕小游戏开发的特点就是以互动性和与类型为主,更重要的还是以钱赚,在开发设计弹幕游戏时需要注意那些要点:  1.弹幕游戏的UI设计:弹幕小游戏的UI需要简洁明了,易于操作。重点需要设计一个直观、快速的交互方式,使用户能够轻松参与并理解游戏规则。  2.弹幕游戏逻辑设计......
  • 亚马逊API接口解析,实现按关键字搜索商品
    要解析亚马逊API接口并实现按关键字搜索商品,你需要按照以下步骤进行操作:了解亚马逊开发者中心:访问亚马逊开发者中心,并了解相关的API文档、开发者指南和规定。注册开发者账号:在亚马逊开发者中心上注册一个开发者账号,并创建一个应用,获取到API权限。获取API密钥:为了使用亚马逊API接......
  • Redis启动器项目RunRedisServer在github开源了
    Redis启动器项目RunRedisServer在github开源了,github最近访问有问题,今天在github上面也开源下。主要用来启动Redis程序加载对应的某个conf文件。github https://github.com/binghe021/RunRedisServer......
  • 查看子文件夹中的文件个数及find命令解析
    查看子文件夹中的文件个数find/home/test-typef-printf'%h\n'|sort|uniq-c/home/test要查找的目录-type按文件类型查找f:指普通文件d:目录文件-printf打印输出%h文件目录\n新行sort排序uniq-c去重并统计次数测试创建文件当前目录/home/test,......
  • 阿里云PAI-灵骏大模型训练工具Pai-Megatron-Patch正式开源!
    作者:李鹏,王明,施晨,黄俊导读随着深度学习大语言模型的不断发展,其模型结构和量级在快速演化,依托大模型技术的应用更是层出不穷。对于广大开发者来说不仅要考虑如何在复杂多变的场景下有效的将大模型消耗的算力发挥出来,还要应对大模型的持续迭代。开发简单易用的大模型训练工具就成了......
  • 15.3K Star,超好用的开源协作式数字白板:tldraw
    大家好,我是TJ今天给大家推荐一个开源协作式数字白板:tldraw。tldraw的编辑器、用户界面和其他底层库都是开源的,你可以在它的开源仓库中找到它们。它们也在NPM上分发,提供开发者使用。您可以使用tlDraw为您的产品创建一个临时白板,或者将其作为构建自己应用的工具来使用。在线体验......