Compare commits
3 Commits
56a50201fe
...
85a219126d
| Author | SHA1 | Date | |
|---|---|---|---|
| 85a219126d | |||
| 1345a0514e | |||
| 0a7179380a |
@@ -7,6 +7,10 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
#define RED "\033[0;31m"
|
||||||
|
#define BLUE "\033[0;34m"
|
||||||
|
#define RESET "\033[0m"
|
||||||
|
|
||||||
static bool _AutoHelp = true; // 是否自动添加帮助信息
|
static bool _AutoHelp = true; // 是否自动添加帮助信息
|
||||||
static bool _COLOR = true; // 是否启用颜色
|
static bool _COLOR = true; // 是否启用颜色
|
||||||
|
|
||||||
@@ -37,15 +41,20 @@ ArgParse *argParseInit(char *documentation, ArgParseValueType value_type) {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief 自动帮助信息回调函数
|
* @brief 自动帮助信息回调函数
|
||||||
|
* @param argParse ArgParse结构体指针
|
||||||
|
* @param val 参数值
|
||||||
|
* @param val_len 参数值长度
|
||||||
|
* @return 无返回值,将直接结束程序
|
||||||
*/
|
*/
|
||||||
int __helpCallback(ArgParse *argParse, char **val, int val_len) {
|
NORETURN int __helpCallback(ArgParse *argParse, char **val, int val_len) {
|
||||||
if (argParse == NULL) {
|
if (argParse == NULL) {
|
||||||
return -1;
|
exit(1);
|
||||||
}
|
}
|
||||||
char *help_doc = argParseGenerateHelp(argParse);
|
char *help_doc = argParseGenerateHelp(argParse);
|
||||||
printf("%s\n", help_doc);
|
printf("%s\n", help_doc);
|
||||||
free(help_doc);
|
free(help_doc);
|
||||||
return 0;
|
argParseFree(argParse);
|
||||||
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -523,6 +532,7 @@ int __processCommand(ArgParse *argParse, char *name, int command_index) {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief 解析命令行参数
|
* @brief 解析命令行参数
|
||||||
|
* @errors: 错误信息字符串统一又调用方申请,处理函数释放
|
||||||
* @param argParse 解析器指针
|
* @param argParse 解析器指针
|
||||||
* @param argc 参数个数
|
* @param argc 参数个数
|
||||||
* @param argv 参数列表
|
* @param argv 参数列表
|
||||||
@@ -574,6 +584,47 @@ void argParseParse(ArgParse *argParse, int argc, char *argv[]) {
|
|||||||
argParse->current_command->val,
|
argParse->current_command->val,
|
||||||
argParse->current_command->val_len);
|
argParse->current_command->val_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 检查全局参数必填参数是否已设置
|
||||||
|
for (int i = 0; i < argParse->global_args_len; i++) {
|
||||||
|
if (argParse->global_args[i]->required &&
|
||||||
|
argParse->global_args[i]->is_trigged == false) {
|
||||||
|
// 错误处理,必填全局参数未设置
|
||||||
|
char *msg =
|
||||||
|
stringNewCopy(RED "ERROR" RESET ": Global Option " BLUE);
|
||||||
|
if (argParse->global_args[i]->short_opt != NULL) {
|
||||||
|
__catStr(&msg, 1, argParse->global_args[i]->short_opt);
|
||||||
|
} else {
|
||||||
|
__catStr(&msg, 1, argParse->global_args[i]->long_opt);
|
||||||
|
}
|
||||||
|
__catStr(&msg, 1, RESET " is required");
|
||||||
|
argParseError(argParse, NULL, msg,
|
||||||
|
NULL); // 错误处理
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 检查当前命令的必填参数是否已设置
|
||||||
|
if (argParse->current_command != NULL) {
|
||||||
|
for (int i = 0; i < argParse->current_command->args_len; i++) {
|
||||||
|
if (argParse->current_command->args[i]->required &&
|
||||||
|
argParse->current_command->args[i]->is_trigged == false) {
|
||||||
|
// 错误处理,必填参数未设置
|
||||||
|
char *msg = stringNewCopy(RED "ERROR" RESET ": Command " BLUE);
|
||||||
|
__catStr(&msg, 1, argParse->current_command->name);
|
||||||
|
__catStr(&msg, 1, RESET " Option " BLUE);
|
||||||
|
if (argParse->current_command->args[i]->short_opt != NULL) {
|
||||||
|
__catStr(
|
||||||
|
&msg, 1, argParse->current_command->args[i]->short_opt);
|
||||||
|
} else {
|
||||||
|
__catStr(
|
||||||
|
&msg, 1, argParse->current_command->args[i]->long_opt);
|
||||||
|
}
|
||||||
|
__catStr(&msg, 1, RESET " is required");
|
||||||
|
argParseError(
|
||||||
|
argParse, argParse->current_command, msg, NULL); // 错误处理
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -841,7 +892,6 @@ NORETURN void argParseError(ArgParse *argParse,
|
|||||||
__catStr(&mgs, 2, "\n", suffix);
|
__catStr(&mgs, 2, "\n", suffix);
|
||||||
}
|
}
|
||||||
|
|
||||||
// printf("\033[1;31mERROR\033[0m: Last command is unknown\n");
|
|
||||||
printf("%s\n", mgs);
|
printf("%s\n", mgs);
|
||||||
free(mgs);
|
free(mgs);
|
||||||
free(help);
|
free(help);
|
||||||
|
|||||||
@@ -37,3 +37,12 @@ set_tests_properties(${PROJECT_NAME}unknow_command_arg PROPERTIES WILL_FAIL TRUE
|
|||||||
add_executable(${PROJECT_NAME}val test_val.c)
|
add_executable(${PROJECT_NAME}val test_val.c)
|
||||||
target_link_libraries(${PROJECT_NAME}val CArgParse)
|
target_link_libraries(${PROJECT_NAME}val CArgParse)
|
||||||
add_test(${PROJECT_NAME}val ${PROJECT_NAME}val file1.txt file2.txt file3.txt -v -q)
|
add_test(${PROJECT_NAME}val ${PROJECT_NAME}val file1.txt file2.txt file3.txt -v -q)
|
||||||
|
|
||||||
|
# 必填参数测试
|
||||||
|
add_executable(${PROJECT_NAME}required test_required.c)
|
||||||
|
target_link_libraries(${PROJECT_NAME}required CArgParse)
|
||||||
|
add_test(${PROJECT_NAME}required_1 ${PROJECT_NAME}required -f)
|
||||||
|
add_test(${PROJECT_NAME}required_2 ${PROJECT_NAME}required)
|
||||||
|
set_tests_properties(${PROJECT_NAME}required_2 PROPERTIES WILL_FAIL TRUE)
|
||||||
|
add_test(${PROJECT_NAME}required_3 ${PROJECT_NAME}required -h)
|
||||||
|
add_test(${PROJECT_NAME}required_4 ${PROJECT_NAME}required -f install -h)
|
||||||
@@ -4,7 +4,7 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
ArgParse *initArgParse() {
|
ArgParse *initArgParse() {
|
||||||
ArgParse *argparse = argParseInit("测试程序",ArgParseNOVALUE);
|
ArgParse *argparse = argParseInit("测试程序", ArgParseNOVALUE);
|
||||||
Command *command = NULL;
|
Command *command = NULL;
|
||||||
Command *sub_command = NULL;
|
Command *sub_command = NULL;
|
||||||
|
|
||||||
@@ -17,12 +17,23 @@ ArgParse *initArgParse() {
|
|||||||
NULL,
|
NULL,
|
||||||
false,
|
false,
|
||||||
ArgParseNOVALUE);
|
ArgParseNOVALUE);
|
||||||
argParseAddGlobalArg(
|
argParseAddGlobalArg(argparse,
|
||||||
argparse, "-q", "--quiet", "Quiet mode", NULL, NULL, false, ArgParseNOVALUE);
|
"-q",
|
||||||
|
"--quiet",
|
||||||
|
"Quiet mode",
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
false,
|
||||||
|
ArgParseNOVALUE);
|
||||||
|
|
||||||
// add arguments
|
// add arguments
|
||||||
command = argParseAddCommand(
|
command = argParseAddCommand(argparse,
|
||||||
argparse, "install", "Install the package", NULL, NULL, NULL, ArgParseNOVALUE);
|
"install",
|
||||||
|
"Install the package",
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
ArgParseNOVALUE);
|
||||||
argParseAddArg(command,
|
argParseAddArg(command,
|
||||||
"-i",
|
"-i",
|
||||||
"--index",
|
"--index",
|
||||||
@@ -48,8 +59,13 @@ ArgParse *initArgParse() {
|
|||||||
false,
|
false,
|
||||||
ArgParseMULTIVALUE);
|
ArgParseMULTIVALUE);
|
||||||
|
|
||||||
sub_command = argParseAddSubCommand(
|
sub_command = argParseAddSubCommand(command,
|
||||||
command, "tools", "Install tools", NULL, NULL, NULL, ArgParseMULTIVALUE);
|
"tools",
|
||||||
|
"Install tools",
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
ArgParseMULTIVALUE);
|
||||||
|
|
||||||
argParseAddArg(sub_command,
|
argParseAddArg(sub_command,
|
||||||
"-t",
|
"-t",
|
||||||
@@ -59,8 +75,13 @@ ArgParse *initArgParse() {
|
|||||||
NULL,
|
NULL,
|
||||||
true,
|
true,
|
||||||
ArgParseMULTIVALUE);
|
ArgParseMULTIVALUE);
|
||||||
sub_command = argParseAddSubCommand(
|
sub_command = argParseAddSubCommand(command,
|
||||||
command, "tools_sub", "Install tools", NULL, NULL, NULL, ArgParseMULTIVALUE);
|
"tools_sub",
|
||||||
|
"Install tools",
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
ArgParseMULTIVALUE);
|
||||||
|
|
||||||
argParseAddArg(sub_command,
|
argParseAddArg(sub_command,
|
||||||
"-s",
|
"-s",
|
||||||
|
|||||||
@@ -10,7 +10,6 @@ int main(int argc, char *argv[]) {
|
|||||||
|
|
||||||
const char *testv[3] = {"testpackge1", "testpackge2", "testpackge3"};
|
const char *testv[3] = {"testpackge1", "testpackge2", "testpackge3"};
|
||||||
|
|
||||||
|
|
||||||
// Test -p
|
// Test -p
|
||||||
char *val = argParseGetCurArg(argparse, "-p");
|
char *val = argParseGetCurArg(argparse, "-p");
|
||||||
|
|
||||||
@@ -27,8 +26,6 @@ int main(int argc, char *argv[]) {
|
|||||||
printf("-i Value: %s\n", val_i);
|
printf("-i Value: %s\n", val_i);
|
||||||
assert(strcmp(val_i, "www.test.com") == 0);
|
assert(strcmp(val_i, "www.test.com") == 0);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Test -f
|
// Test -f
|
||||||
len = 0;
|
len = 0;
|
||||||
const char *testf[2] = {"file1.txt", "file2.txt"};
|
const char *testf[2] = {"file1.txt", "file2.txt"};
|
||||||
@@ -38,7 +35,6 @@ int main(int argc, char *argv[]) {
|
|||||||
assert(strcmp(val_f[i], testf[i]) == 0);
|
assert(strcmp(val_f[i], testf[i]) == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
argParseFree(argparse);
|
argParseFree(argparse);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
144
tests/test_required.c
Normal file
144
tests/test_required.c
Normal file
@@ -0,0 +1,144 @@
|
|||||||
|
#include "ArgParse.h"
|
||||||
|
#include <assert.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
ArgParse *initArgParse() {
|
||||||
|
ArgParse *argparse = argParseInit("测试程序", ArgParseNOVALUE);
|
||||||
|
Command *command = NULL;
|
||||||
|
Command *sub_command = NULL;
|
||||||
|
|
||||||
|
// add global arguments
|
||||||
|
argParseAddGlobalArg(argparse,
|
||||||
|
"-v",
|
||||||
|
"--version",
|
||||||
|
"Show version",
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
false,
|
||||||
|
ArgParseNOVALUE);
|
||||||
|
argParseAddGlobalArg(argparse,
|
||||||
|
"-f",
|
||||||
|
"--file",
|
||||||
|
"File name",
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
true,
|
||||||
|
ArgParseNOVALUE);
|
||||||
|
|
||||||
|
// add arguments
|
||||||
|
command = argParseAddCommand(argparse,
|
||||||
|
"install",
|
||||||
|
"Install the package",
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
ArgParseNOVALUE);
|
||||||
|
argParseAddArg(command,
|
||||||
|
"-i",
|
||||||
|
"--index",
|
||||||
|
"Index URL",
|
||||||
|
"https://example.com",
|
||||||
|
NULL,
|
||||||
|
false,
|
||||||
|
ArgParseSINGLEVALUE);
|
||||||
|
argParseAddArg(command,
|
||||||
|
"-f",
|
||||||
|
"--file",
|
||||||
|
"Package file",
|
||||||
|
"package.json",
|
||||||
|
NULL,
|
||||||
|
true,
|
||||||
|
ArgParseMULTIVALUE);
|
||||||
|
argParseAddArg(command,
|
||||||
|
"-p",
|
||||||
|
"--package",
|
||||||
|
"Package file",
|
||||||
|
"package.json",
|
||||||
|
NULL,
|
||||||
|
false,
|
||||||
|
ArgParseMULTIVALUE);
|
||||||
|
|
||||||
|
sub_command = argParseAddSubCommand(command,
|
||||||
|
"tools",
|
||||||
|
"Install tools",
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
ArgParseMULTIVALUE);
|
||||||
|
|
||||||
|
argParseAddArg(sub_command,
|
||||||
|
"-t",
|
||||||
|
"--tool",
|
||||||
|
"Tool name",
|
||||||
|
"Tool name",
|
||||||
|
NULL,
|
||||||
|
true,
|
||||||
|
ArgParseMULTIVALUE);
|
||||||
|
sub_command = argParseAddSubCommand(command,
|
||||||
|
"tools_sub",
|
||||||
|
"Install tools",
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
ArgParseMULTIVALUE);
|
||||||
|
|
||||||
|
argParseAddArg(sub_command,
|
||||||
|
"-s",
|
||||||
|
"--source",
|
||||||
|
"test_source",
|
||||||
|
"tools subcommand test",
|
||||||
|
NULL,
|
||||||
|
true,
|
||||||
|
ArgParseMULTIVALUE);
|
||||||
|
|
||||||
|
command = argParseAddCommand(argparse,
|
||||||
|
"uninstall",
|
||||||
|
"Uninstall the package",
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
ArgParseSINGLEVALUE);
|
||||||
|
argParseAddArg(command,
|
||||||
|
"-p",
|
||||||
|
"--package",
|
||||||
|
"Package name",
|
||||||
|
"Package name",
|
||||||
|
NULL,
|
||||||
|
true,
|
||||||
|
ArgParseMULTIVALUE);
|
||||||
|
|
||||||
|
return argparse;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
ArgParse *argparse = initArgParse();
|
||||||
|
|
||||||
|
argParseParse(argparse, argc, argv);
|
||||||
|
|
||||||
|
char *val = argParseGetVal(argparse);
|
||||||
|
if (val) {
|
||||||
|
printf("val: %s\n", val);
|
||||||
|
}
|
||||||
|
|
||||||
|
// int len = 0;
|
||||||
|
// char **vals = argParseGetValList(argparse, &len);
|
||||||
|
|
||||||
|
// char *test_val[3] = {"file1.txt", "file2.txt", "file3.txt"};
|
||||||
|
|
||||||
|
// if (vals) {
|
||||||
|
// for (int i = 0; i < len; i++) {
|
||||||
|
// printf("vals: %s\n", vals[i]);
|
||||||
|
// assert(strcmp(vals[i], test_val[i]) == 0);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// assert(argParseCheckGlobalTriggered(argparse, "-v"));
|
||||||
|
// assert(argParseCheckGlobalTriggered(argparse, "-f"));
|
||||||
|
|
||||||
|
argParseFree(argparse);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
@@ -8,12 +8,11 @@ int main(int argc, char *argv[]) {
|
|||||||
|
|
||||||
argParseParse(argparse, argc, argv);
|
argParseParse(argparse, argc, argv);
|
||||||
|
|
||||||
|
|
||||||
char *command_name = argParseGetCurCommandName(argparse);
|
char *command_name = argParseGetCurCommandName(argparse);
|
||||||
printf("command name: %s\n", command_name);
|
printf("command name: %s\n", command_name);
|
||||||
assert(strcmp(command_name, "tools") == 0);
|
assert(strcmp(command_name, "tools") == 0);
|
||||||
|
|
||||||
char * val = argParseGetCurArg(argparse, "-t");
|
char *val = argParseGetCurArg(argparse, "-t");
|
||||||
printf("tools -t: %s\n", val);
|
printf("tools -t: %s\n", val);
|
||||||
|
|
||||||
argParseFree(argparse);
|
argParseFree(argparse);
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ int main(int argc, char *argv[]) {
|
|||||||
|
|
||||||
argParseParse(argparse, argc, argv);
|
argParseParse(argparse, argc, argv);
|
||||||
|
|
||||||
|
|
||||||
argParseFree(argparse);
|
argParseFree(argparse);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
@@ -18,12 +18,23 @@ ArgParse *initArgParse() {
|
|||||||
NULL,
|
NULL,
|
||||||
false,
|
false,
|
||||||
ArgParseNOVALUE);
|
ArgParseNOVALUE);
|
||||||
argParseAddGlobalArg(
|
argParseAddGlobalArg(argparse,
|
||||||
argparse, "-q", "--quiet", "Quiet mode", NULL, NULL, false, ArgParseNOVALUE);
|
"-q",
|
||||||
|
"--quiet",
|
||||||
|
"Quiet mode",
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
false,
|
||||||
|
ArgParseNOVALUE);
|
||||||
|
|
||||||
// add arguments
|
// add arguments
|
||||||
command = argParseAddCommand(
|
command = argParseAddCommand(argparse,
|
||||||
argparse, "install", "Install the package", NULL, NULL, NULL, ArgParseNOVALUE);
|
"install",
|
||||||
|
"Install the package",
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
ArgParseNOVALUE);
|
||||||
argParseAddArg(command,
|
argParseAddArg(command,
|
||||||
"-i",
|
"-i",
|
||||||
"--index",
|
"--index",
|
||||||
@@ -49,8 +60,13 @@ ArgParse *initArgParse() {
|
|||||||
false,
|
false,
|
||||||
ArgParseMULTIVALUE);
|
ArgParseMULTIVALUE);
|
||||||
|
|
||||||
sub_command = argParseAddSubCommand(
|
sub_command = argParseAddSubCommand(command,
|
||||||
command, "tools", "Install tools", NULL, NULL, NULL, ArgParseMULTIVALUE);
|
"tools",
|
||||||
|
"Install tools",
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
ArgParseMULTIVALUE);
|
||||||
|
|
||||||
argParseAddArg(sub_command,
|
argParseAddArg(sub_command,
|
||||||
"-t",
|
"-t",
|
||||||
@@ -60,8 +76,13 @@ ArgParse *initArgParse() {
|
|||||||
NULL,
|
NULL,
|
||||||
true,
|
true,
|
||||||
ArgParseMULTIVALUE);
|
ArgParseMULTIVALUE);
|
||||||
sub_command = argParseAddSubCommand(
|
sub_command = argParseAddSubCommand(command,
|
||||||
command, "tools_sub", "Install tools", NULL, NULL, NULL, ArgParseMULTIVALUE);
|
"tools_sub",
|
||||||
|
"Install tools",
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
ArgParseMULTIVALUE);
|
||||||
|
|
||||||
argParseAddArg(sub_command,
|
argParseAddArg(sub_command,
|
||||||
"-s",
|
"-s",
|
||||||
|
|||||||
Reference in New Issue
Block a user