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) | ||||||
| @@ -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,7 +8,6 @@ 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); | ||||||
|   | |||||||
| @@ -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