X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;ds=sidebyside;f=ucw%2Ftable-types.c;h=ab2e5b696ab9f0542b72924f1d4159379d0f7cff;hb=d9656daa5fad2bd5e7ef0de655aa94ac0eea9035;hp=50d3079e98a37b6c643258d17a63bedada410016;hpb=50a77a246c1505ebd135c699d973eef0e56194cf;p=libucw.git diff --git a/ucw/table-types.c b/ucw/table-types.c index 50d3079e..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 = { @@ -80,37 +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) - }; - - static const char *unit_suffix[] = { - [UNIT_BYTE] = "", - [UNIT_KILOBYTE] = "KB", - [UNIT_MEGABYTE] = "MB", - [UNIT_GIGABYTE] = "GB", - [UNIT_TERABYTE] = "TB" + [UNIT_KILOBYTE] = (u64) 1024LLU, + [UNIT_MEGABYTE] = (u64) (1024LLU * 1024LLU), + [UNIT_GIGABYTE] = (u64) (1024LLU * 1024LLU * 1024LLU), + [UNIT_TERABYTE] = (u64) (1024LLU * 1024LLU * 1024LLU * 1024LLU) }; - int curr_col = tbl->columns[col].first_column; - while(curr_col != -1) { - + 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]); - curr_col = tbl->column_order[curr_col].next_column; + curr_col->cell_content = mp_printf(tbl->pool, "%lu%s", val, unit_suffix[out_type]); } - } #define FORMAT_TIME_SIZE 20 // Minimum buffer size @@ -130,10 +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); - - int curr_col = tbl->columns[col].first_column; - while(curr_col != -1) { - 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); @@ -146,7 +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); - curr_col = tbl->column_order[curr_col].next_column; + curr_col->cell_content = mp_printf(tbl->pool, "%s", formatted_time_buf); } }