format-table: add option to store/format percent and uint64_t values in cells

This commit is contained in:
Lennart Poettering 2018-11-07 15:25:51 +01:00
parent a22318e554
commit a4661181fa
2 changed files with 50 additions and 0 deletions

View File

@ -70,6 +70,8 @@ typedef struct TableData {
uint64_t size; uint64_t size;
char string[0]; char string[0];
uint32_t uint32; uint32_t uint32;
uint64_t uint64;
int percent; /* we use 'int' as datatype for percent values in order to match the result of parse_percent() */
/* … add more here as we start supporting more cell data types … */ /* … add more here as we start supporting more cell data types … */
}; };
} TableData; } TableData;
@ -219,11 +221,15 @@ static size_t table_data_size(TableDataType type, const void *data) {
return sizeof(usec_t); return sizeof(usec_t);
case TABLE_SIZE: case TABLE_SIZE:
case TABLE_UINT64:
return sizeof(uint64_t); return sizeof(uint64_t);
case TABLE_UINT32: case TABLE_UINT32:
return sizeof(uint32_t); return sizeof(uint32_t);
case TABLE_PERCENT:
return sizeof(int);
default: default:
assert_not_reached("Uh? Unexpected cell type"); assert_not_reached("Uh? Unexpected cell type");
} }
@ -583,6 +589,8 @@ int table_add_many_internal(Table *t, TableDataType first_type, ...) {
uint64_t size; uint64_t size;
usec_t usec; usec_t usec;
uint32_t uint32; uint32_t uint32;
uint64_t uint64;
int percent;
bool b; bool b;
} buffer; } buffer;
@ -617,6 +625,16 @@ int table_add_many_internal(Table *t, TableDataType first_type, ...) {
data = &buffer.uint32; data = &buffer.uint32;
break; break;
case TABLE_UINT64:
buffer.uint64 = va_arg(ap, uint64_t);
data = &buffer.uint64;
break;
case TABLE_PERCENT:
buffer.percent = va_arg(ap, int);
data = &buffer.percent;
break;
case _TABLE_DATA_TYPE_MAX: case _TABLE_DATA_TYPE_MAX:
/* Used as end marker */ /* Used as end marker */
va_end(ap); va_end(ap);
@ -740,6 +758,12 @@ static int cell_data_compare(TableData *a, size_t index_a, TableData *b, size_t
case TABLE_UINT32: case TABLE_UINT32:
return CMP(a->uint32, b->uint32); return CMP(a->uint32, b->uint32);
case TABLE_UINT64:
return CMP(a->uint64, b->uint64);
case TABLE_PERCENT:
return CMP(a->percent, b->percent);
default: default:
; ;
} }
@ -850,6 +874,30 @@ static const char *table_data_format(TableData *d) {
break; break;
} }
case TABLE_UINT64: {
_cleanup_free_ char *p;
p = new(char, DECIMAL_STR_WIDTH(d->uint64) + 1);
if (!p)
return NULL;
sprintf(p, "%" PRIu64, d->uint64);
d->formatted = TAKE_PTR(p);
break;
}
case TABLE_PERCENT: {
_cleanup_free_ char *p;
p = new(char, DECIMAL_STR_WIDTH(d->percent) + 2);
if (!p)
return NULL;
sprintf(p, "%i%%" , d->percent);
d->formatted = TAKE_PTR(p);
break;
}
default: default:
assert_not_reached("Unexpected type?"); assert_not_reached("Unexpected type?");
} }

View File

@ -15,6 +15,8 @@ typedef enum TableDataType {
TABLE_TIMESPAN, TABLE_TIMESPAN,
TABLE_SIZE, TABLE_SIZE,
TABLE_UINT32, TABLE_UINT32,
TABLE_UINT64,
TABLE_PERCENT,
_TABLE_DATA_TYPE_MAX, _TABLE_DATA_TYPE_MAX,
_TABLE_DATA_TYPE_INVALID = -1, _TABLE_DATA_TYPE_INVALID = -1,
} TableDataType; } TableDataType;