X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=ucw%2Ftable-types.c;h=ab2e5b696ab9f0542b72924f1d4159379d0f7cff;hb=d9656daa5fad2bd5e7ef0de655aa94ac0eea9035;hp=d465fab01c701fa18e4af88ecffcd7b4e913a041;hpb=57c1eeda2b4741f06af46d429ae84026767eb249;p=libucw.git diff --git a/ucw/table-types.c b/ucw/table-types.c index d465fab0..ab2e5b69 100644 --- a/ucw/table-types.c +++ b/ucw/table-types.c @@ -8,30 +8,45 @@ #include #include +static const char *unit_suffix[] = { + [UNIT_BYTE] = "", + [UNIT_KILOBYTE] = "KB", + [UNIT_MEGABYTE] = "MB", + [UNIT_GIGABYTE] = "GB", + [UNIT_TERABYTE] = "TB" +}; + static bool table_set_col_opt_size(struct table *tbl, uint col_copy_idx, const char *col_arg, char **err) { int col_type_idx = tbl->column_order[col_copy_idx].idx; - if(tbl->columns[col_type_idx].type == COL_TYPE_SIZE) { - if(strcasecmp(col_arg, "b") == 0 || strcasecmp(col_arg, "bytes") == 0) { - tbl->column_order[col_copy_idx].output_type = UNIT_BYTE; - } else if(strcasecmp(col_arg, "kb") == 0) { - tbl->column_order[col_copy_idx].output_type = UNIT_KILOBYTE; - } else if(strcasecmp(col_arg, "mb") == 0) { - tbl->column_order[col_copy_idx].output_type = UNIT_MEGABYTE; - } else if(strcasecmp(col_arg, "gb") == 0) { - tbl->column_order[col_copy_idx].output_type = UNIT_GIGABYTE; - } else if(strcasecmp(col_arg, "tb") == 0) { - tbl->column_order[col_copy_idx].output_type = UNIT_TERABYTE; - } else { - *err = mp_printf(tbl->pool, "Tableprinter: invalid column format option: '%s' for column %d (counted from 0)", col_arg, col_copy_idx); - return true; - } + if(tbl->columns[col_type_idx].type != COL_TYPE_SIZE) { *err = NULL; + return false; + } + + if(col_arg == NULL) { + *err = NULL; + return true; + } + + if(strcasecmp(col_arg, "b") == 0 || strcasecmp(col_arg, "bytes") == 0) { + tbl->column_order[col_copy_idx].output_type = UNIT_BYTE; + } + + tbl->column_order[col_copy_idx].output_type = CELL_OUT_UNINITIALIZED; + for(uint i = 0; i < ARRAY_SIZE(unit_suffix); i++) { + if(strcasecmp(col_arg, unit_suffix[i]) == 0) { + tbl->column_order[col_copy_idx].output_type = i; + } + } + + if(tbl->column_order[col_copy_idx].output_type == CELL_OUT_UNINITIALIZED) { + *err = mp_printf(tbl->pool, "Tableprinter: invalid column format option: '%s' for column %d (counted from 0)", col_arg, col_copy_idx); return true; } *err = NULL; - return false; + return true; } struct table_user_type table_type_size = { @@ -42,21 +57,27 @@ struct table_user_type table_type_size = { static bool table_set_col_opt_timestamp(struct table *tbl, uint col_copy_idx, const char *col_arg, char **err) { int col_type_idx = tbl->column_order[col_copy_idx].idx; - if(tbl->columns[col_type_idx].type == COL_TYPE_TIMESTAMP) { - if(strcasecmp(col_arg, "timestamp") == 0 || strcasecmp(col_arg, "epoch") == 0) { - tbl->column_order[col_copy_idx].output_type = TIMESTAMP_EPOCH; - } else if(strcasecmp(col_arg, "datetime") == 0) { - tbl->column_order[col_copy_idx].output_type = TIMESTAMP_DATETIME; - } else { - *err = mp_printf(tbl->pool, "Tableprinter: invalid column format option: '%s' for column %d.", col_arg, col_copy_idx); - return true; - } + if(tbl->columns[col_type_idx].type != COL_TYPE_TIMESTAMP) { *err = NULL; + return false; + } + + if(col_arg == NULL) { + *err = NULL; + return true; + } + + if(strcasecmp(col_arg, "timestamp") == 0 || strcasecmp(col_arg, "epoch") == 0) { + tbl->column_order[col_copy_idx].output_type = TIMESTAMP_EPOCH; + } else if(strcasecmp(col_arg, "datetime") == 0) { + tbl->column_order[col_copy_idx].output_type = TIMESTAMP_DATETIME; + } else { + *err = mp_printf(tbl->pool, "Tableprinter: invalid column format option: '%s' for column %d.", col_arg, col_copy_idx); return true; } *err = NULL; - return false; + return true; } struct table_user_type table_type_timestamp = { @@ -86,28 +107,19 @@ void table_col_size(struct table *tbl, int col, u64 val) [UNIT_TERABYTE] = (u64) (1024LLU * 1024LLU * 1024LLU * 1024LLU) }; - static const char *unit_suffix[] = { - [UNIT_BYTE] = "", - [UNIT_KILOBYTE] = "KB", - [UNIT_MEGABYTE] = "MB", - [UNIT_GIGABYTE] = "GB", - [UNIT_TERABYTE] = "TB" - }; - - TBL_COL_ITER_START(tbl, col, curr_col) { + TBL_COL_ITER(tbl, col, curr_col, curr_col_idx) { // FIXME: do some rounding? uint out_type = 0; - if(tbl->column_order[curr_col].output_type == CELL_OUT_UNINITIALIZED) { + if(curr_col->output_type == CELL_OUT_UNINITIALIZED) { val = val / unit_div[UNIT_BYTE]; out_type = 0; } else { - val = val / unit_div[tbl->column_order[curr_col].output_type]; - out_type = tbl->column_order[curr_col].output_type; + val = val / unit_div[curr_col->output_type]; + out_type = curr_col->output_type; } - tbl->column_order[curr_col].cell_content = mp_printf(tbl->pool, "%lu%s", val, unit_suffix[out_type]); - } TBL_COL_ITER_END(tbl, curr_col) - + curr_col->cell_content = mp_printf(tbl->pool, "%lu%s", val, unit_suffix[out_type]); + } } #define FORMAT_TIME_SIZE 20 // Minimum buffer size @@ -127,9 +139,8 @@ void table_col_timestamp(struct table *tbl, int col, u64 val) time_t tmp_time = (time_t)val; struct tm t = *gmtime(&tmp_time); - - TBL_COL_ITER_START(tbl, col, curr_col) { - switch (tbl->column_order[curr_col].output_type) { + TBL_COL_ITER(tbl, col, curr_col, curr_col_idx) { + switch (curr_col->output_type) { case TIMESTAMP_EPOCH: case CELL_OUT_UNINITIALIZED: sprintf(formatted_time_buf, "%lu", val); @@ -142,6 +153,6 @@ void table_col_timestamp(struct table *tbl, int col, u64 val) break; } - tbl->column_order[curr_col].cell_content = mp_printf(tbl->pool, "%s", formatted_time_buf); - } TBL_COL_ITER_END(tbl, curr_col) + curr_col->cell_content = mp_printf(tbl->pool, "%s", formatted_time_buf); + } }