X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=ucw%2Ftable-types.c;h=ab2e5b696ab9f0542b72924f1d4159379d0f7cff;hb=d9656daa5fad2bd5e7ef0de655aa94ac0eea9035;hp=902e2829b75c057165e0e019eb6771b5ac27d259;hpb=f3bbc02bdad76177253fd2024dac127ee20dfc4f;p=libucw.git diff --git a/ucw/table-types.c b/ucw/table-types.c index 902e2829..ab2e5b69 100644 --- a/ucw/table-types.c +++ b/ucw/table-types.c @@ -8,6 +8,83 @@ #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) { + *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 true; +} + +struct table_user_type table_type_size = { + .set_col_instance_option = table_set_col_opt_size, + .type = COL_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) { + *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 true; +} + +struct table_user_type table_type_timestamp = { + .set_col_instance_option = table_set_col_opt_timestamp, + .type = COL_TYPE_TIMESTAMP, +}; + void table_col_size_name(struct table *tbl, const char *col_name, u64 val) { int col = table_get_col_idx(tbl, col_name); @@ -24,31 +101,25 @@ void table_col_size(struct table *tbl, int col, u64 val) static u64 unit_div[] = { [UNIT_BYTE] = (u64) 1, - [UNIT_KILOBYTE] = (u64) 1024LU, - [UNIT_MEGABYTE] = (u64) (1024LU * 1024LU), - [UNIT_GIGABYTE] = (u64) (1024LU * 1024LU * 1024LU), - [UNIT_TERABYTE] = (u64) (1024LU * 1024LU * 1024LU * 1024LU) + [UNIT_KILOBYTE] = (u64) 1024LLU, + [UNIT_MEGABYTE] = (u64) (1024LLU * 1024LLU), + [UNIT_GIGABYTE] = (u64) (1024LLU * 1024LLU * 1024LLU), + [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(tbl, col, curr_col, curr_col_idx) { + // FIXME: do some rounding? + uint out_type = 0; + if(curr_col->output_type == CELL_OUT_UNINITIALIZED) { + val = val / unit_div[UNIT_BYTE]; + out_type = 0; + } else { + val = val / unit_div[curr_col->output_type]; + out_type = curr_col->output_type; + } - // FIXME: do some rounding? - uint out_type = 0; - if(tbl->column_order[col].output_type == CELL_OUT_UNINITIALIZED) { - val = val / unit_div[UNIT_BYTE]; - out_type = 0; - } else { - val = val / unit_div[tbl->column_order[col].output_type]; - out_type = tbl->column_order[col].output_type; + curr_col->cell_content = mp_printf(tbl->pool, "%lu%s", val, unit_suffix[out_type]); } - - table_col_printf(tbl, col, "%lu%s", val, unit_suffix[out_type]); } #define FORMAT_TIME_SIZE 20 // Minimum buffer size @@ -68,20 +139,20 @@ void table_col_timestamp(struct table *tbl, int col, u64 val) time_t tmp_time = (time_t)val; struct tm t = *gmtime(&tmp_time); - - switch (tbl->column_order[col].output_type) { - case TIMESTAMP_EPOCH: - case CELL_OUT_UNINITIALIZED: - sprintf(formatted_time_buf, "%lu", val); - break; - case TIMESTAMP_DATETIME: - strftime(formatted_time_buf, FORMAT_TIME_SIZE, "%F %T", &t); + 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); + break; + case TIMESTAMP_DATETIME: + strftime(formatted_time_buf, FORMAT_TIME_SIZE, "%F %T", &t); break; - default: - abort(); - break; - } + default: + abort(); + break; + } - table_col_printf(tbl, col, "%s", formatted_time_buf); + curr_col->cell_content = mp_printf(tbl->pool, "%s", formatted_time_buf); + } } -