void columns_format_line(const columns_t cols, const void *data, size_t max_line_width) { size_t i; size_t prev_col_end = 0; recalculate_if_needed(cols, max_line_width); for(i = 0; i < cols->count; i++) { /* Use big buffer to hold whole item so there will be no issues with right * aligned fields. */ char col_buffer[1024 + 1]; size_t cur_col_start; const column_t *const col = &cols->list[i]; col->func(col->info.column_id, data, ARRAY_LEN(col_buffer), col_buffer); decorate_output(col, col_buffer, max_line_width); cur_col_start = calculate_start_pos(col, col_buffer); fill_gap_pos(data, prev_col_end, cur_col_start); print_func(data, col->info.column_id, col_buffer, cur_col_start); prev_col_end = cur_col_start + get_width_on_screen(col_buffer); } fill_gap_pos(data, prev_col_end, max_line_width); }
void columns_format_line(columns_t *cols, const void *data, size_t max_line_width) { char prev_col_buf[1024 + 1]; size_t prev_col_start = 0UL; prev_col_buf[0] = '\0'; size_t i; size_t prev_col_end = 0; recalculate_if_needed(cols, max_line_width); for(i = 0U; i < cols->count; ++i) { /* Use big buffer to hold whole item so there will be no issues with right * aligned fields. */ char col_buffer[sizeof(prev_col_buf)]; char full_column[sizeof(prev_col_buf)]; size_t cur_col_start; AlignType align; const column_t *const col = &cols->list[i]; col->func(col->info.column_id, data, sizeof(col_buffer), col_buffer); strcpy(full_column, col_buffer); align = decorate_output(col, col_buffer, max_line_width); cur_col_start = calculate_start_pos(col, col_buffer, align); /* Ensure that we are not trying to draw current column in the middle of a * character inside previous column. */ if(prev_col_end > cur_col_start) { const size_t prev_col_max_width = (cur_col_start > prev_col_start) ? (cur_col_start - prev_col_start) : 0UL; const size_t break_point = utf8_strsnlen(prev_col_buf, prev_col_max_width); prev_col_buf[break_point] = '\0'; fill_gap_pos(data, prev_col_start + get_width_on_screen(prev_col_buf), cur_col_start); } else { fill_gap_pos(data, prev_col_end, cur_col_start); } print_func(data, col->info.column_id, col_buffer, cur_col_start, align, full_column); prev_col_end = cur_col_start + get_width_on_screen(col_buffer); /* Store information about the current column for usage on the next * iteration. */ strcpy(prev_col_buf, col_buffer); prev_col_start = cur_col_start; } fill_gap_pos(data, prev_col_end, max_line_width); }