diff --git a/src/tabs.c b/src/tabs.c index 3fd5b3fd100ee2b4457ea68ad63625317d692aae..2587640b733401a9a5b9bbb9ba52526b41c84a3b 100644 --- a/src/tabs.c +++ b/src/tabs.c @@ -63,12 +63,33 @@ static int internal_add_node_by_args(int max[], node *head, int param_count, va_ int length = 0; const char *current_arg_ptr = NULL; + va_list temp_args; + va_copy(temp_args, args); + // 拿到第一个数据 - current_arg_ptr = va_arg(args, const char *); + current_arg_ptr = va_arg(temp_args, const char *); counter = 1; + while(counter <= param_count) { + if(current_arg_ptr == NULL) { + va_end(temp_args); + return COMMON_TABS_BAD_INPUT; + } + current_arg_ptr = va_arg(temp_args, const char *); + counter++; + } + va_end(temp_args); + + // 拿到第一个数据 + current_arg_ptr = va_arg(args, const char *); + counter =1; + + while(counter <= param_count) { + if(current_arg_ptr == NULL) { + return COMMON_TABS_BAD_INPUT; + } // 添加节点,尾插法 - length = strlen(current_arg_ptr); + length = strlen(current_arg_ptr) + 1; node *node_ptr = (node *)malloc(sizeof(node)); node_ptr->value = (char *)malloc(sizeof(char) * length); strcpy(node_ptr->value, current_arg_ptr); @@ -267,6 +288,14 @@ int common_tabs_free(tab_handler ** handler) { 5. 根节点置为NULL ==================*/ + if(handler == NULL) { + return COMMON_TABS_BAD_INPUT; + } + + if(*handler == NULL) { + return COMMON_TABS_OK; + } + tab_data *free_ptr_data = NULL; tab_data *free_ptr_temp = NULL; @@ -325,6 +354,11 @@ int common_tabs_add_header(tab_handler *handler, int header_count, ...) { ret = internal_add_node_by_args(handler->column_max, &handler->handler_header, header_count, args); va_end(args); + if(ret != COMMON_TABS_OK) { + free(handler->column_max); + handler->column_max = NULL; + } + return ret; } @@ -391,6 +425,14 @@ int common_tabs_print_unicode_tabs(tab_handler *handler) { // step4 循环打印数据 // step5 打印最后一行 + if(handler == NULL) { + return COMMON_TABS_NEED_INIT; + } + + if((*handler).handler_header.next == NULL) { + return COMMON_TABS_HEADERS_ARE_REQUIRED; + } + // 设置本地化,以支持宽字符 setlocale(LC_ALL, ""); @@ -425,6 +467,14 @@ int common_tabs_print_ascii_tabs(tab_handler *handler) { // step4 循环打印数据 // step5 打印最后一行 + if(handler == NULL) { + return COMMON_TABS_NEED_INIT; + } + + if((*handler).handler_header.next == NULL) { + return COMMON_TABS_HEADERS_ARE_REQUIRED; + } + // step1 internal_print_special_line_ascii(handler); diff --git a/test/check_interface.c b/test/check_interface.c index 8b74de0d0c52afa95ba6f8e4ddf940be4324a5e3..29d8dfb163e049a03271e8aaa472fd1b1d78c141 100644 --- a/test/check_interface.c +++ b/test/check_interface.c @@ -9,6 +9,7 @@ int main() sr = srunner_create(check_base64()); srunner_add_suite(sr, check_byte()); srunner_add_suite(sr, check_big_number()); + srunner_add_suite(sr, check_tabs()); /* can debug with gdb */ srunner_set_fork_status(sr, CK_NOFORK); diff --git a/test/check_interface.h b/test/check_interface.h index 6af75b0323570ca74cb208302994c374f4daec31..25a3d6c6472e53635eb3fd9f1f30bcb49463a5a2 100644 --- a/test/check_interface.h +++ b/test/check_interface.h @@ -8,5 +8,6 @@ Suite *check_base64(void); Suite *check_byte(void); Suite *check_big_number(void); +Suite *check_tabs(void); #endif \ No newline at end of file diff --git a/test/check_tabs.c b/test/check_tabs.c new file mode 100644 index 0000000000000000000000000000000000000000..d77234af90e67ec17edec081a6783288fdbea748 --- /dev/null +++ b/test/check_tabs.c @@ -0,0 +1,72 @@ +#include +#include + +#include "check.h" +#include "tabs.h" + +START_TEST(test_ok) { + tab_handler *handler = NULL; + ck_assert_int_eq(common_tabs_init(&handler), COMMON_TABS_OK); + ck_assert_int_eq(common_tabs_add_header(handler, 3, "header1", "header2", "header3"), COMMON_TABS_OK); + ck_assert_int_eq(common_tabs_add_data(handler, 3, "data1", "data2", "data3"), COMMON_TABS_OK); + ck_assert_int_eq(common_tabs_print_ascii_tabs(handler), COMMON_TABS_OK); + ck_assert_int_eq(common_tabs_free(&handler), COMMON_TABS_OK); + ck_assert_ptr_eq(handler, NULL); +} +END_TEST + +START_TEST(test_input) { + // 正常使用的句柄 + tab_handler *handler = NULL; + // 初始化但未添加表头的句柄 + tab_handler *handler2 = NULL; + + // 初始化检查 + ck_assert_int_eq(common_tabs_init(&handler), COMMON_TABS_OK); + ck_assert_int_eq(common_tabs_init(&handler2), COMMON_TABS_OK); + ck_assert_int_eq(common_tabs_init(NULL), COMMON_TABS_BAD_INPUT); + ck_assert_int_eq(common_tabs_init(&handler), COMMON_TABS_ALREADY_INITED); + + // 添加表头检查 + ck_assert_int_eq(common_tabs_add_header(handler, 3, "header1", "header2", NULL), COMMON_TABS_BAD_INPUT); + ck_assert_int_eq(common_tabs_add_header(handler, -1, "header1", "header2", "header3"), COMMON_TABS_BAD_INPUT); + ck_assert_int_eq(common_tabs_add_header(handler, 3, "header1", "header2", "header3"), COMMON_TABS_OK); + ck_assert_int_eq(common_tabs_add_header(handler, 3, "header1", "header2", "header3"), COMMON_TABS_ALREADY_INITED); + ck_assert_int_eq(common_tabs_add_header(NULL, 3, "header1", "header2", "header3"), COMMON_TABS_BAD_INPUT); + + // 添加数据检查 + ck_assert_int_eq(common_tabs_add_data(handler, 3, "data1", "data2", "data3"), COMMON_TABS_OK); + ck_assert_int_eq(common_tabs_add_data(handler, 4, "data1", "data2", "data3"), COMMON_TABS_HEADER_AND_DATA_MISMATCH); + ck_assert_int_eq(common_tabs_add_data(handler, 3, "data1", "data2", NULL), COMMON_TABS_BAD_INPUT); + ck_assert_int_eq(common_tabs_add_data(handler, 0, "data1", "data2", "data3"), COMMON_TABS_BAD_INPUT); + ck_assert_int_eq(common_tabs_add_data(NULL, 3, "data1", "data2", "data3"), COMMON_TABS_BAD_INPUT); + ck_assert_int_eq(common_tabs_add_data(handler2, 3, "data1", "data2", "data3"), COMMON_TABS_HEADERS_ARE_REQUIRED); + + ck_assert_int_eq(common_tabs_print_ascii_tabs(handler), COMMON_TABS_OK); + ck_assert_int_eq(common_tabs_print_ascii_tabs(NULL), COMMON_TABS_NEED_INIT); + ck_assert_int_eq(common_tabs_print_ascii_tabs(handler2), COMMON_TABS_HEADERS_ARE_REQUIRED); + + ck_assert_int_eq(common_tabs_free(&handler), COMMON_TABS_OK); + ck_assert_int_eq(common_tabs_free(NULL), COMMON_TABS_BAD_INPUT); + ck_assert_int_eq(common_tabs_free(&handler2), COMMON_TABS_OK); + ck_assert_int_eq(common_tabs_free(&handler), COMMON_TABS_OK); + + ck_assert_ptr_eq(handler, NULL); + ck_assert_ptr_eq(handler2, NULL); +} + +Suite *check_tabs(void) +{ + Suite *s; + TCase *tc_core; + + s = suite_create("tabs check"); + + tc_core = tcase_create("core"); + tcase_add_test(tc_core, test_ok); + tcase_add_test(tc_core, test_input); + + suite_add_tcase(s, tc_core); + + return s; +} \ No newline at end of file