[C] Refactoring
This commit is contained in:
parent
b7666160c4
commit
284cb61321
16
src/cell.c
16
src/cell.c
@ -41,7 +41,7 @@ int hint_width_cell(const fort_cell_t *cell, const context_t *context)
|
|||||||
{
|
{
|
||||||
assert(cell);
|
assert(cell);
|
||||||
assert(context);
|
assert(context);
|
||||||
int result = context->cell_padding_left + context->cell_padding_right;
|
int result = context->table_options->cell_padding_left + context->table_options->cell_padding_right;
|
||||||
if (cell->str_buffer && cell->str_buffer->str) {
|
if (cell->str_buffer && cell->str_buffer->str) {
|
||||||
result += buffer_text_width(cell->str_buffer);
|
result += buffer_text_width(cell->str_buffer);
|
||||||
}
|
}
|
||||||
@ -52,10 +52,10 @@ int hint_height_cell(const fort_cell_t *cell, const context_t *context)
|
|||||||
{
|
{
|
||||||
assert(cell);
|
assert(cell);
|
||||||
assert(context);
|
assert(context);
|
||||||
int result = context->cell_padding_top + context->cell_padding_bottom;
|
int result = context->table_options->cell_padding_top + context->table_options->cell_padding_bottom;
|
||||||
if (cell->str_buffer && cell->str_buffer->str) {
|
if (cell->str_buffer && cell->str_buffer->str) {
|
||||||
size_t text_height = buffer_text_height(cell->str_buffer);
|
size_t text_height = buffer_text_height(cell->str_buffer);
|
||||||
result += text_height == 0 ? context->cell_empty_string_height : text_height;
|
result += text_height == 0 ? context->table_options->cell_empty_string_height : text_height;
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@ -89,19 +89,19 @@ int cell_printf(fort_cell_t *cell, size_t row, size_t column, char *buf, size_t
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (row >= hint_height_cell(cell, context)
|
if (row >= hint_height_cell(cell, context)
|
||||||
|| row < context->cell_padding_top
|
|| row < context->table_options->cell_padding_top
|
||||||
|| row >= (context->cell_padding_top + buffer_text_height(cell->str_buffer))) {
|
|| row >= (context->table_options->cell_padding_top + buffer_text_height(cell->str_buffer))) {
|
||||||
int k = snprint_n_chars(buf, buf_len, buf_len - 1, ' ');
|
int k = snprint_n_chars(buf, buf_len, buf_len - 1, ' ');
|
||||||
return k;
|
return k;
|
||||||
} else {
|
} else {
|
||||||
int written = 0;
|
int written = 0;
|
||||||
int left = context->cell_padding_left;
|
int left = context->table_options->cell_padding_left;
|
||||||
int right = context->cell_padding_right;
|
int right = context->table_options->cell_padding_right;
|
||||||
|
|
||||||
written += snprint_n_chars(buf + written, buf_len - written, left, ' ');
|
written += snprint_n_chars(buf + written, buf_len - written, left, ' ');
|
||||||
|
|
||||||
if (cell->str_buffer)
|
if (cell->str_buffer)
|
||||||
written += buffer_printf(cell->str_buffer, row - context->cell_padding_top, column, buf + written, buf_len - written - right, context);
|
written += buffer_printf(cell->str_buffer, row - context->table_options->cell_padding_top, column, buf + written, buf_len - written - right, context);
|
||||||
else
|
else
|
||||||
written += snprint_n_chars(buf + written, buf_len - written, buf_len - written - right, ' ');
|
written += snprint_n_chars(buf + written, buf_len - written, buf_len - written - right, ' ');
|
||||||
written += snprint_n_chars(buf + written, buf_len - written, right, ' ');
|
written += snprint_n_chars(buf + written, buf_len - written, right, ' ');
|
||||||
|
10
src/fort.c
10
src/fort.c
@ -549,7 +549,8 @@ const char* ft_to_string(const FTABLE *FORT_RESTRICT table)
|
|||||||
|
|
||||||
int dev = 0;
|
int dev = 0;
|
||||||
int k = 0;
|
int k = 0;
|
||||||
context_t *context = (table->options ? table->options : &g_table_options);
|
context_t context;
|
||||||
|
context.table_options = (table->options ? table->options : &g_table_options);
|
||||||
fort_row_t *prev_row = NULL;
|
fort_row_t *prev_row = NULL;
|
||||||
fort_row_t *cur_row = NULL;
|
fort_row_t *cur_row = NULL;
|
||||||
separator_t *cur_sep = NULL;
|
separator_t *cur_sep = NULL;
|
||||||
@ -559,13 +560,14 @@ const char* ft_to_string(const FTABLE *FORT_RESTRICT table)
|
|||||||
cur_sep = (i < sep_size) ? (*(separator_t **)vector_at(table->separators, i)) : NULL;
|
cur_sep = (i < sep_size) ? (*(separator_t **)vector_at(table->separators, i)) : NULL;
|
||||||
cur_row = *(fort_row_t**)vector_at(table->rows, i);
|
cur_row = *(fort_row_t**)vector_at(table->rows, i);
|
||||||
enum HorSeparatorPos separatorPos = (i == 0) ? TopSeparator : InsideSeparator;
|
enum HorSeparatorPos separatorPos = (i == 0) ? TopSeparator : InsideSeparator;
|
||||||
CHECK_RESULT_AND_MOVE_DEV(print_row_separator(buffer + dev, sz - dev, col_width_arr, cols, prev_row, cur_row, separatorPos, cur_sep, context));
|
CHECK_RESULT_AND_MOVE_DEV(print_row_separator(buffer + dev, sz - dev, col_width_arr, cols, prev_row, cur_row, separatorPos, cur_sep, &context));
|
||||||
CHECK_RESULT_AND_MOVE_DEV(snprintf_row(cur_row, buffer + dev, sz - dev, col_width_arr, cols, row_height_arr[i], context));
|
context.row = i;
|
||||||
|
CHECK_RESULT_AND_MOVE_DEV(snprintf_row(cur_row, buffer + dev, sz - dev, col_width_arr, cols, row_height_arr[i], &context));
|
||||||
prev_row = cur_row;
|
prev_row = cur_row;
|
||||||
}
|
}
|
||||||
cur_row = NULL;
|
cur_row = NULL;
|
||||||
cur_sep = (i < sep_size) ? (*(separator_t **)vector_at(table->separators, i)) : NULL;
|
cur_sep = (i < sep_size) ? (*(separator_t **)vector_at(table->separators, i)) : NULL;
|
||||||
CHECK_RESULT_AND_MOVE_DEV(print_row_separator(buffer + dev, sz - dev, col_width_arr, cols, prev_row, cur_row, BottomSeparator, cur_sep, context));
|
CHECK_RESULT_AND_MOVE_DEV(print_row_separator(buffer + dev, sz - dev, col_width_arr, cols, prev_row, cur_row, BottomSeparator, cur_sep, &context));
|
||||||
|
|
||||||
|
|
||||||
F_FREE(col_width_arr);
|
F_FREE(col_width_arr);
|
||||||
|
@ -85,7 +85,13 @@ struct separator
|
|||||||
};
|
};
|
||||||
|
|
||||||
typedef struct fort_table_options fort_table_options_t;
|
typedef struct fort_table_options fort_table_options_t;
|
||||||
typedef fort_table_options_t context_t;
|
struct fort_context
|
||||||
|
{
|
||||||
|
fort_table_options_t *table_options;
|
||||||
|
size_t row;
|
||||||
|
size_t column;
|
||||||
|
};
|
||||||
|
typedef struct fort_context context_t;
|
||||||
typedef struct fort_column_options fort_column_options_t;
|
typedef struct fort_column_options fort_column_options_t;
|
||||||
typedef struct vector vector_t;
|
typedef struct vector vector_t;
|
||||||
typedef struct fort_cell fort_cell_t;
|
typedef struct fort_cell fort_cell_t;
|
||||||
|
@ -332,19 +332,19 @@ int fort_options_column_width(const fort_table_options_t *options, size_t column
|
|||||||
// return ((fort_column_options_t*)vector_at(options->col_options, column))->align;
|
// return ((fort_column_options_t*)vector_at(options->col_options, column))->align;
|
||||||
//}
|
//}
|
||||||
|
|
||||||
int fort_options_column_alignment(const fort_table_options_t *options, size_t column)
|
//int fort_options_column_alignment(const fort_table_options_t *options, size_t column)
|
||||||
{
|
//{
|
||||||
assert(options);
|
// assert(options);
|
||||||
enum TextAlignment defaultAlign = g_column_options.align;
|
// enum TextAlignment defaultAlign = g_column_options.align;
|
||||||
|
|
||||||
if (options->cell_options == NULL)
|
// if (options->cell_options == NULL)
|
||||||
return defaultAlign;
|
// return defaultAlign;
|
||||||
|
|
||||||
const fort_cell_options_t* col_opt = cget_cell_opt(options->cell_options, FT_ANY_ROW, column);
|
// const fort_cell_options_t* col_opt = cget_cell_opt(options->cell_options, FT_ANY_ROW, column);
|
||||||
if (col_opt == NULL || ((col_opt->options & FT_OPT_TEXT_ALIGN) == 0))
|
// if (col_opt == NULL || ((col_opt->options & FT_OPT_TEXT_ALIGN) == 0))
|
||||||
return defaultAlign;
|
// return defaultAlign;
|
||||||
else {
|
// else {
|
||||||
return col_opt->align;
|
// return col_opt->align;
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
|
|
||||||
|
@ -141,7 +141,7 @@ struct fort_table_options
|
|||||||
fort_cell_opt_container_t * cell_options;
|
fort_cell_opt_container_t * cell_options;
|
||||||
};
|
};
|
||||||
typedef struct fort_table_options fort_table_options_t;
|
typedef struct fort_table_options fort_table_options_t;
|
||||||
typedef fort_table_options_t context_t;
|
//typedef fort_table_options_t context_t;
|
||||||
extern fort_table_options_t g_table_options;
|
extern fort_table_options_t g_table_options;
|
||||||
|
|
||||||
|
|
||||||
@ -152,7 +152,7 @@ void destroy_table_options(fort_table_options_t* options);
|
|||||||
//fort_status_t fort_options_set_column_min_width(fort_table_options_t *options, size_t column, size_t width);
|
//fort_status_t fort_options_set_column_min_width(fort_table_options_t *options, size_t column, size_t width);
|
||||||
//fort_status_t fort_options_set_column_alignment(fort_table_options_t *options, size_t column, enum TextAlignment al);
|
//fort_status_t fort_options_set_column_alignment(fort_table_options_t *options, size_t column, enum TextAlignment al);
|
||||||
int fort_options_column_width(const fort_table_options_t *options, size_t column);
|
int fort_options_column_width(const fort_table_options_t *options, size_t column);
|
||||||
int fort_options_column_alignment(const fort_table_options_t *options, size_t column);
|
//int fort_options_column_alignment(const fort_table_options_t *options, size_t column);
|
||||||
|
|
||||||
|
|
||||||
#endif // OPTIONS_H
|
#endif // OPTIONS_H
|
||||||
|
17
src/row.c
17
src/row.c
@ -148,16 +148,16 @@ int print_row_separator(char *buffer, size_t buffer_sz,
|
|||||||
|
|
||||||
const char (*border_chars)[BorderItemPosSize] = NULL;
|
const char (*border_chars)[BorderItemPosSize] = NULL;
|
||||||
if (main_row && main_row->type == Header) {
|
if (main_row && main_row->type == Header) {
|
||||||
border_chars = &context->header_border_chars;
|
border_chars = &context->table_options->header_border_chars;
|
||||||
} else {
|
} else {
|
||||||
border_chars = &context->border_chars;
|
border_chars = &context->table_options->border_chars;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sep && sep->enabled) {
|
if (sep && sep->enabled) {
|
||||||
L = &(context->separator_chars[LH_sip]);
|
L = &(context->table_options->separator_chars[LH_sip]);
|
||||||
I = &(context->separator_chars[IH_sip]);
|
I = &(context->table_options->separator_chars[IH_sip]);
|
||||||
IV = &(context->separator_chars[II_sip]);
|
IV = &(context->table_options->separator_chars[II_sip]);
|
||||||
R = &(context->separator_chars[RH_sip]);
|
R = &(context->table_options->separator_chars[RH_sip]);
|
||||||
} else {
|
} else {
|
||||||
switch (separatorPos) {
|
switch (separatorPos) {
|
||||||
case TopSeparator:
|
case TopSeparator:
|
||||||
@ -351,8 +351,8 @@ int snprintf_row(const fort_row_t *row, char *buffer, size_t buf_sz, size_t *col
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
const char (*bord_chars)[BorderItemPosSize] = (row->type == Header)
|
const char (*bord_chars)[BorderItemPosSize] = (row->type == Header)
|
||||||
? (&context->header_border_chars)
|
? (&context->table_options->header_border_chars)
|
||||||
: (&context->border_chars);
|
: (&context->table_options->border_chars);
|
||||||
const char *L = &(*bord_chars)[LL_bip];
|
const char *L = &(*bord_chars)[LL_bip];
|
||||||
const char *IV = &(*bord_chars)[IV_bip];
|
const char *IV = &(*bord_chars)[IV_bip];
|
||||||
const char *R = &(*bord_chars)[RR_bip];
|
const char *R = &(*bord_chars)[RR_bip];
|
||||||
@ -362,6 +362,7 @@ int snprintf_row(const fort_row_t *row, char *buffer, size_t buf_sz, size_t *col
|
|||||||
for (size_t i = 0; i < row_height; ++i) {
|
for (size_t i = 0; i < row_height; ++i) {
|
||||||
dev += snprint_n_chars(buffer + dev, buf_sz - dev, 1, *L);
|
dev += snprint_n_chars(buffer + dev, buf_sz - dev, 1, *L);
|
||||||
for (size_t j = 0; j < col_width_arr_sz; ++j) {
|
for (size_t j = 0; j < col_width_arr_sz; ++j) {
|
||||||
|
((context_t *)context)->column = j;
|
||||||
if (j < cols_in_row) {
|
if (j < cols_in_row) {
|
||||||
fort_cell_t *cell = *(fort_cell_t**)vector_at(row->cells, j);
|
fort_cell_t *cell = *(fort_cell_t**)vector_at(row->cells, j);
|
||||||
dev += cell_printf(cell, i, j, buffer + dev, col_width_arr[j] + 1, context);
|
dev += cell_printf(cell, i, j, buffer + dev, col_width_arr[j] + 1, context);
|
||||||
|
@ -161,7 +161,8 @@ int buffer_printf(string_buffer_t *buffer, size_t buffer_row, size_t table_colum
|
|||||||
int left = 0;
|
int left = 0;
|
||||||
int right = 0;
|
int right = 0;
|
||||||
|
|
||||||
switch (fort_options_column_alignment(context, table_column)) {
|
// switch (fort_options_column_alignment(context, table_column)) {
|
||||||
|
switch (get_cell_opt_value_hierarcial(context->table_options, context->row, context->column, FT_OPT_TEXT_ALIGN)) {
|
||||||
case LeftAligned:
|
case LeftAligned:
|
||||||
left = 0;
|
left = 0;
|
||||||
right = (buf_len - 1) - content_width;
|
right = (buf_len - 1) - content_width;
|
||||||
|
@ -112,15 +112,18 @@ fort_status_t table_rows_and_cols_geometry(const FTABLE *table,
|
|||||||
return F_ERROR;
|
return F_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
context_t *context = (table->options ? table->options : &g_table_options);
|
context_t context;
|
||||||
|
context.table_options = (table->options ? table->options : &g_table_options);
|
||||||
for (size_t col = 0; col < cols; ++col) {
|
for (size_t col = 0; col < cols; ++col) {
|
||||||
col_width_arr[col] = 0;
|
col_width_arr[col] = 0;
|
||||||
for (size_t row = 0; row < rows; ++row) {
|
for (size_t row = 0; row < rows; ++row) {
|
||||||
const fort_row_t *row_p = get_row_c(table, row);
|
const fort_row_t *row_p = get_row_c(table, row);
|
||||||
const fort_cell_t *cell = get_cell_c(row_p, col);
|
const fort_cell_t *cell = get_cell_c(row_p, col);
|
||||||
|
context.column = col;
|
||||||
|
context.row = row;
|
||||||
if (cell) {
|
if (cell) {
|
||||||
col_width_arr[col] = MAX(col_width_arr[col], hint_width_cell(cell, context));
|
col_width_arr[col] = MAX(col_width_arr[col], hint_width_cell(cell, &context));
|
||||||
row_height_arr[row] = MAX(row_height_arr[row], hint_height_cell(cell, context));
|
row_height_arr[row] = MAX(row_height_arr[row], hint_height_cell(cell, &context));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user