diff --git a/include/fort.h b/include/fort.h index d2bc572..0029c7c 100644 --- a/include/fort.h +++ b/include/fort.h @@ -100,6 +100,22 @@ FORT_EXTERN char* ft_to_string(const FTABLE *FORT_RESTRICT table); //FORT_EXTERN char* ft_row_to_string(const FTABLE *FORT_RESTRICT table, size_t row); //FORT_EXTERN ssize_t ft_n_row_to_string(const FTABLE *FORT_RESTRICT table, size_t row, char *FORT_RESTRICT dst, size_t dst_len); + +struct fort_table_options +{ + int cell_padding_top; + int cell_padding_bottom; + int cell_padding_left; + int cell_padding_right; + char hor_separator; + char ver_separator; +}; +typedef struct fort_table_options fort_table_options_t; + +FORT_EXTERN void ft_set_default_options(const fort_table_options_t *options); +FORT_EXTERN void ft_get_default_options(fort_table_options_t *options); + + FORT_END_DECLS #endif // LIBFORT_H diff --git a/src/fort.c b/src/fort.c index 4b822b8..28261c5 100644 --- a/src/fort.c +++ b/src/fort.c @@ -7,8 +7,8 @@ #include "wchar.h" #define FORT_COL_SEPARATOR '|' -#define FORT_HOR_CELL_SEPARATOR '=' -#define FORT_VER_CELL_SEPARATOR '|' +#define FORT_HOR_CELL_SEPARATOR (g_table_options.hor_separator) +#define FORT_VER_CELL_SEPARATOR (g_table_options.ver_separator) #define FORT_UNUSED __attribute__((unused)) #define F_CALLOC calloc @@ -139,23 +139,23 @@ static void* vector_at(vector_t*, size_t index); /***************************************************************************** * CELL * ***************************************************************************/ -struct cell_options -{ - int padding_top; - int padding_bottom; - int padding_left; - int padding_right; -}; -typedef struct cell_options cell_options_t; -static cell_options_t g_cell_options = {1, 1, 1, 1}; +//struct cell_options +//{ +// int padding_top; +// int padding_bottom; +// int padding_left; +// int padding_right; +//}; +//typedef struct cell_options cell_options_t; +static fort_table_options_t g_table_options = {1, 1, 1, 1, '=', '|'}; -static void init_cell_options(cell_options_t *options) +static void init_cell_options(fort_table_options_t *options) { assert(options); - options->padding_top = g_cell_options.padding_top; - options->padding_bottom = g_cell_options.padding_bottom; - options->padding_left = g_cell_options.padding_left; - options->padding_right = g_cell_options.padding_right; + options->cell_padding_top = g_table_options.cell_padding_top; + options->cell_padding_bottom = g_table_options.cell_padding_bottom; + options->cell_padding_left = g_table_options.cell_padding_left; + options->cell_padding_right = g_table_options.cell_padding_right; } struct fort_cell; @@ -163,7 +163,7 @@ typedef struct fort_cell fort_cell_t; struct fort_cell { string_buffer_t *str_buffer; - cell_options_t options; + fort_table_options_t options; }; static fort_cell_t * create_cell() @@ -191,7 +191,7 @@ static void destroy_cell(fort_cell_t *cell) static int hint_width_cell(const fort_cell_t *cell) { assert(cell); - int result = cell->options.padding_left + cell->options.padding_right; + int result = cell->options.cell_padding_left + cell->options.cell_padding_right; if (cell->str_buffer && cell->str_buffer->str) { result += buffer_text_width(cell->str_buffer); } @@ -201,7 +201,7 @@ static int hint_width_cell(const fort_cell_t *cell) static int hint_height_cell(const fort_cell_t *cell) { assert(cell); - int result = cell->options.padding_top + cell->options.padding_bottom; + int result = cell->options.cell_padding_top + cell->options.cell_padding_bottom; if (cell->str_buffer && cell->str_buffer->str) { result += buffer_text_height(cell->str_buffer); } @@ -236,19 +236,19 @@ static int cell_printf(fort_cell_t *cell, size_t row, char *buf, size_t buf_len) return -1; } - if (row < cell->options.padding_top - || row >= (cell->options.padding_top + buffer_text_height(cell->str_buffer))) { + if (row < cell->options.cell_padding_top + || row >= (cell->options.cell_padding_top + buffer_text_height(cell->str_buffer))) { int k = snprint_n_chars(buf, buf_len, buf_len - 1, ' '); return k; } else { int written = 0; - int left = cell->options.padding_left; - int right = cell->options.padding_right; + int left = cell->options.cell_padding_left; + int right = cell->options.cell_padding_right; written += snprint_n_chars(buf + written, buf_len - written, left, ' '); if (cell->str_buffer) - written += buffer_printf(cell->str_buffer, row - cell->options.padding_top, buf + written, buf_len - written - right); + written += buffer_printf(cell->str_buffer, row - cell->options.cell_padding_top, buf + written, buf_len - written - right); else written += snprint_n_chars(buf + written, buf_len - written, buf_len - written - right, ' '); written += snprint_n_chars(buf + written, buf_len - written, right, ' '); @@ -485,6 +485,15 @@ int ft_row_printf(FTABLE *FORT_RESTRICT table, size_t row, const char* FORT_REST return result; } +void ft_set_default_options(const fort_table_options_t *options) +{ + memcpy(&g_table_options, options, sizeof(fort_table_options_t)); +} + +void ft_get_default_options(fort_table_options_t *options) +{ + memcpy(options, &g_table_options, sizeof(fort_table_options_t)); +} /***************************************************************************** diff --git a/tests/test.c b/tests/test.c index 7f0f185..22f3fa6 100644 --- a/tests/test.c +++ b/tests/test.c @@ -6,7 +6,8 @@ int main(void) { cmocka_unit_test(test_vector_basic), cmocka_unit_test(test_table_sizes), cmocka_unit_test(test_table_geometry), - cmocka_unit_test(test_table_basic) + cmocka_unit_test(test_table_basic), + cmocka_unit_test(test_table_options) }; return cmocka_run_group_tests(tests, NULL, NULL); } diff --git a/tests/test_table.c b/tests/test_table.c index 7dd45ef..fcbf352 100644 --- a/tests/test_table.c +++ b/tests/test_table.c @@ -231,6 +231,169 @@ void test_table_basic(void **state) free(table_str); ft_destroy_table(table); } +} + + + +FTABLE *create_test_int_table() +{ + FTABLE *table = NULL; + + table = ft_create_table(); + + assert_true (table != NULL); + + int n = ft_hdr_printf(table, "%d|%d|%d|%d", 3, 4, 55, 67); + assert_true( n == 4 ); + n = ft_row_printf(table, 1, "%d|%d|%d|%d", 3, 4, 55, 67); + assert_true( n == 4 ); + n = ft_row_printf(table, 2, "%d|%d|%d|%d", 3, 4, 55, 67); + assert_true( n == 4 ); + + return table; +} + +void test_table_options(void **state) +{ + (void)state; + FTABLE *table = NULL; + + fort_table_options_t def_options; + ft_get_default_options(&def_options); + + + WHEN("All paddings = 1") { + fort_table_options_t table_options; + memcpy(&table_options, &def_options, sizeof(fort_table_options_t)); + table_options.cell_padding_bottom = 1; + table_options.cell_padding_top = 1; + table_options.cell_padding_left = 1; + table_options.cell_padding_right = 1; + ft_set_default_options(&table_options); + + table = create_test_int_table(); + + char *table_str = ft_to_string(table); + assert_true( table_str != NULL ); + const char *table_str_etalon = + "===================\n" + "| | | | |\n" + "| 3 | 4 | 55 | 67 |\n" + "| | | | |\n" + "===================\n" + "| | | | |\n" + "| 3 | 4 | 55 | 67 |\n" + "| | | | |\n" + "===================\n" + "| | | | |\n" + "| 3 | 4 | 55 | 67 |\n" + "| | | | |\n" + "===================\n"; +// fprintf(stderr, "content:\n%s", table_str); + + assert_true( strcmp(table_str, table_str_etalon) == 0); + + free(table_str); + ft_destroy_table(table); + } + + WHEN("Top and bottom padding = 0") { + fort_table_options_t table_options; + memcpy(&table_options, &def_options, sizeof(fort_table_options_t)); + table_options.cell_padding_bottom = 0; + table_options.cell_padding_top = 0; + table_options.cell_padding_left = 1; + table_options.cell_padding_right = 1; + ft_set_default_options(&table_options); + + table = create_test_int_table(); + + char *table_str = ft_to_string(table); + assert_true( table_str != NULL ); + const char *table_str_etalon = + "===================\n" + "| 3 | 4 | 55 | 67 |\n" + "===================\n" + "| 3 | 4 | 55 | 67 |\n" + "===================\n" + "| 3 | 4 | 55 | 67 |\n" + "===================\n"; +// fprintf(stderr, "content:\n%s", table_str); + + assert_true( strcmp(table_str, table_str_etalon) == 0); + + free(table_str); + ft_destroy_table(table); + } + + WHEN("Left and right padding = 0") { + fort_table_options_t table_options; + memcpy(&table_options, &def_options, sizeof(fort_table_options_t)); + table_options.cell_padding_bottom = 1; + table_options.cell_padding_top = 1; + table_options.cell_padding_left = 0; + table_options.cell_padding_right = 0; + ft_set_default_options(&table_options); + + table = create_test_int_table(); + + char *table_str = ft_to_string(table); + assert_true( table_str != NULL ); + const char *table_str_etalon = + "===========\n" + "| | | | |\n" + "|3|4|55|67|\n" + "| | | | |\n" + "===========\n" + "| | | | |\n" + "|3|4|55|67|\n" + "| | | | |\n" + "===========\n" + "| | | | |\n" + "|3|4|55|67|\n" + "| | | | |\n" + "===========\n"; +// fprintf(stderr, "content:\n%s", table_str); + + assert_true( strcmp(table_str, table_str_etalon) == 0); + + free(table_str); + ft_destroy_table(table); + } + + WHEN("All paddings = 0") { + fort_table_options_t table_options; + memcpy(&table_options, &def_options, sizeof(fort_table_options_t)); + table_options.cell_padding_bottom = 0; + table_options.cell_padding_top = 0; + table_options.cell_padding_left = 0; + table_options.cell_padding_right = 0; + ft_set_default_options(&table_options); + + table = create_test_int_table(); + + char *table_str = ft_to_string(table); + assert_true( table_str != NULL ); + const char *table_str_etalon = + "===========\n" + "|3|4|55|67|\n" + "===========\n" + "|3|4|55|67|\n" + "===========\n" + "|3|4|55|67|\n" + "===========\n"; +// fprintf(stderr, "content:\n%s", table_str); + + assert_true( strcmp(table_str, table_str_etalon) == 0); + + free(table_str); + ft_destroy_table(table); + } + + + + + } diff --git a/tests/tests.h b/tests/tests.h index 1f2da78..ab5b36a 100644 --- a/tests/tests.h +++ b/tests/tests.h @@ -15,6 +15,7 @@ void test_vector_basic(void **state); void test_table_sizes(void **state); void test_table_geometry(void **state); void test_table_basic(void **state); +void test_table_options(void **state); #endif // TESTS_H