}
for(int i = 0; i < cols_to_output; i++) {
- int col_idx = tbl->column_order[i].idx;
- int last = tbl->columns[col_idx].last_column;
+ int idx = tbl->column_order[i].idx;
+ tbl->column_order[i].col_def = tbl->columns + idx;
+ }
+
+ for(int i = 0; i < cols_to_output; i++) {
+ int last = tbl->column_order[i].col_def->last_column;
if(last != -1) {
- tbl->columns[col_idx].last_column = i;
+ tbl->column_order[i].col_def->last_column = i;
tbl->column_order[last].next_column = i;
} else {
- tbl->columns[col_idx].last_column = i;
- tbl->columns[col_idx].first_column = i;
+ tbl->column_order[i].col_def->last_column = i;
+ tbl->column_order[i].col_def->first_column = i;
}
tbl->column_order[i].next_column = -1;
}
for(int i = 0; i < cols_to_output; i++) {
int col_idx = col_order[i];
tbl->column_order[i].idx = col_idx;
+ tbl->column_order[i].col_def = tbl->columns + col_idx;
tbl->column_order[i].cell_content = NULL;
tbl->column_order[i].output_type = CELL_OUT_UNINITIALIZED;
}
**/
bool table_set_col_opt_default(struct table *tbl, int col_copy_idx, const char *col_arg, char **err)
{
+ struct table_column *tmp_col = tbl->column_order[col_copy_idx].col_def;
int col_type_idx = tbl->column_order[col_copy_idx].idx;
- if(tbl->columns[col_type_idx].type == COL_TYPE_DOUBLE) {
+ if(tmp_col->type == COL_TYPE_DOUBLE) {
uint precision = 0;
str_to_uint(&precision, col_arg, NULL, 0);
tbl->column_order[col_type_idx].output_type = precision;
if(col_idx == -1) {
return mp_printf(tbl->pool, "Unknown table column '%s', possible column names are: %s.", name_start, table_get_col_list(tbl));
}
+ tbl->column_order[curr_col_idx].col_def = tbl->columns + col_idx;
tbl->column_order[curr_col_idx].idx = col_idx;
tbl->column_order[curr_col_idx].cell_content = NULL;
tbl->column_order[curr_col_idx].output_type = CELL_OUT_UNINITIALIZED;
static void table_write_header(struct table *tbl)
{
for(uint i = 0; i < tbl->cols_to_output; i++) {
- int col_idx = tbl->column_order[i].idx;
+ int col_idx = tbl->column_order[i].col_def - tbl->columns;
if(i) {
bputs(tbl->out, tbl->col_delimiter);
}
}
if(tbl->print_header != 0) {
- uint col_idx = tbl->column_order[0].idx;
+ uint col_idx = tbl->column_order[0].col_def - tbl->columns;
bputs(tbl->out, tbl->columns[col_idx].name);
for(uint i = 1; i < tbl->cols_to_output; i++) {
- col_idx = tbl->column_order[i].idx;
+ col_idx = tbl->column_order[i].col_def - tbl->columns;
bputs(tbl->out, tbl->col_delimiter);
bputs(tbl->out, tbl->columns[col_idx].name);
}
int width; // [*] Width of the column (in characters) OR'ed with column flags
const char *fmt; // [*] Default format of each cell in the column
enum column_type type; // [*] Type of the cells in the column
- int first_column;
- int last_column;
+ int first_column; // head of linked list of columns of this type
+ int last_column; // tail of linked list of columns of this type
struct table_user_type *type_def;
};
+// FIXME: is it correct to have idx and col_def? idx is sufficient and in fact a duplicity of idx
struct table_col_info {
- uint idx;
- char *cell_content;
- int next_column;
- int output_type;
+ uint idx; // idx is a pointer to struct table::columns
+ struct table_column *col_def; // this is pointer to the column definition, located in the array struct table::columns
+ char *cell_content; // content of the cell of the current row
+ int next_column; // index of next column in linked list of columns of the same type
+ int output_type; // format of this column
};
/**