[F] Fixed errors in printf functions
This commit is contained in:
19
src/fort.c
19
src/fort.c
@@ -117,6 +117,14 @@ size_t ft_cur_col(FTABLE *table)
|
||||
return table->cur_col;
|
||||
}
|
||||
|
||||
void ft_set_cur_cell(FTABLE *table, size_t row, size_t col)
|
||||
{
|
||||
assert(table);
|
||||
table->cur_row = row;
|
||||
table->cur_col = col;
|
||||
}
|
||||
|
||||
|
||||
static int ft_row_printf_impl(FTABLE *table, size_t row, const char *fmt, va_list *va)
|
||||
{
|
||||
size_t i = 0;
|
||||
@@ -146,15 +154,14 @@ static int ft_row_printf_impl(FTABLE *table, size_t row, const char *fmt, va_lis
|
||||
}
|
||||
}
|
||||
}
|
||||
/* todo: clearing pushed items in case of error */
|
||||
/* todo: this function always create new row, this is not correct, it should be more complicated */
|
||||
/* todo: clearing pushed items in case of error ?? */
|
||||
|
||||
cur_row_p = (fort_row_t **)vector_at(table->rows, row);
|
||||
|
||||
destroy_row(*cur_row_p);
|
||||
*cur_row_p = new_row;
|
||||
new_cols = columns_in_row(new_row);
|
||||
cur_row_p = (fort_row_t **)vector_at(table->rows, row);
|
||||
swap_row(*cur_row_p, new_row, table->cur_col);
|
||||
|
||||
table->cur_col += new_cols;
|
||||
destroy_row(new_row);
|
||||
return new_cols;
|
||||
|
||||
clear:
|
||||
|
16
src/row.c
16
src/row.c
@@ -106,6 +106,22 @@ fort_cell_t *get_cell_and_create_if_not_exists(fort_row_t *row, size_t col)
|
||||
return get_cell_implementation(row, col, Create);
|
||||
}
|
||||
|
||||
fort_status_t swap_row(fort_row_t *cur_row, fort_row_t *ins_row, size_t pos)
|
||||
{
|
||||
assert(cur_row);
|
||||
assert(ins_row);
|
||||
size_t cur_sz = vector_size(cur_row->cells);
|
||||
if (cur_sz == 0 && pos == 0) {
|
||||
fort_row_t tmp;
|
||||
memcpy(&tmp, cur_row, sizeof(fort_row_t));
|
||||
memcpy(cur_row, ins_row, sizeof(fort_row_t));
|
||||
memcpy(ins_row, &tmp, sizeof(fort_row_t));
|
||||
return FT_SUCCESS;
|
||||
}
|
||||
|
||||
return vector_swap(cur_row->cells, ins_row->cells, pos);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
@@ -30,6 +30,7 @@ fort_cell_t *get_cell_implementation(fort_row_t *row, size_t col, enum PolicyOnN
|
||||
fort_cell_t *get_cell(fort_row_t *row, size_t col);
|
||||
const fort_cell_t *get_cell_c(const fort_row_t *row, size_t col);
|
||||
fort_cell_t *get_cell_and_create_if_not_exists(fort_row_t *row, size_t col);
|
||||
fort_status_t swap_row(fort_row_t *cur_row, fort_row_t *ins_row, size_t pos);
|
||||
|
||||
|
||||
|
||||
|
46
src/vector.c
46
src/vector.c
@@ -165,4 +165,50 @@ void *vector_at(vector_t *vector, size_t index)
|
||||
return (char *)vector->m_data + index * vector->m_item_size;
|
||||
}
|
||||
|
||||
fort_status_t vector_swap(vector_t *cur_vec, vector_t *mv_vec, size_t pos)
|
||||
{
|
||||
assert(cur_vec);
|
||||
assert(mv_vec);
|
||||
assert(cur_vec->m_item_size == mv_vec->m_item_size);
|
||||
|
||||
size_t cur_sz = vector_size(cur_vec);
|
||||
size_t mv_sz = vector_size(mv_vec);
|
||||
if (mv_sz == 0) {
|
||||
return FT_SUCCESS;
|
||||
}
|
||||
|
||||
size_t min_targ_size = pos + mv_sz;
|
||||
if (cur_sz < min_targ_size) {
|
||||
if (vector_reallocate_(cur_vec, min_targ_size) == -1)
|
||||
return FT_ERROR;
|
||||
cur_vec->m_capacity = min_targ_size;
|
||||
}
|
||||
|
||||
ptrdiff_t deviation = pos * cur_vec->m_item_size;
|
||||
void *tmp = NULL;
|
||||
size_t new_mv_sz = 0;
|
||||
if (cur_sz > pos) {
|
||||
new_mv_sz = MIN(cur_sz - pos, mv_sz);
|
||||
tmp = F_MALLOC(cur_vec->m_item_size * new_mv_sz);
|
||||
if (tmp == NULL) {
|
||||
return FT_MEMORY_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
memcpy(tmp,
|
||||
cur_vec->m_data + deviation,
|
||||
cur_vec->m_item_size * (cur_sz - pos));
|
||||
memcpy(cur_vec->m_data + deviation,
|
||||
mv_vec->m_data,
|
||||
cur_vec->m_item_size * mv_sz);
|
||||
memcpy(mv_vec->m_data,
|
||||
tmp,
|
||||
cur_vec->m_item_size * new_mv_sz);
|
||||
|
||||
mv_vec->m_size = new_mv_sz;
|
||||
F_FREE(tmp);
|
||||
return FT_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
@@ -26,6 +26,7 @@ extern int vector_erase(vector_t*, size_t index);
|
||||
extern void vector_clear(vector_t*);
|
||||
extern const void *vector_at_c(const vector_t *vector, size_t index);
|
||||
extern void* vector_at(vector_t*, size_t index);
|
||||
extern fort_status_t vector_swap(vector_t *cur_vec, vector_t *mv_vec, size_t pos);
|
||||
|
||||
|
||||
#define FOR_EACH_(type, item, vector, index_name) \
|
||||
|
Reference in New Issue
Block a user