A while ago I wrote a chunk of code to dump data to a console window in a formatted table. Something like you’d see in a SQL console when doing queries. I’ve finally gotten around to open sourcing it so here’s a description of how to use it and where to find it.
To format data into the table structure, a table must first be initialized using table_init()
. The data will be output in either CSV format or a pretty printed table depending on the value of the verbose parameter. Rows are added to the table with the table_row()
function. Each column in the row is specified by a position in the format string. For example the first format specifier is the first column, second column two, etc. The total number of columns for a table is determined by the call to table_row()
with the highest number of format specifiers. The format parameter for table_row()
takes a C style format string. The acceptable format specifiers are a (mostly) subset of the printf()
format specifiers with the addition of 't'
for a timestamp. Format specifiers:
specifier | Output |
---|---|
s or S | String of characters |
c or C | Character |
d or i | Signed decimal integer |
u | Unsigned decimal integer |
o | Unsigned octal integer |
t | Timestamp specified by a time_t value |
x or X | Unsigned hexadecimal integer |
f, F, g or G | Decimal floating point |
[width].[precision]
are also supported. Note that precision defaults to 0 so with floating point values it must always be specified or the value will be truncated to a whole number.
Finally, when data is done being added to the table, it is printed using the table_commit()
function.
int main(int argc, char* argv[]) { struct table_t* table = table_init(stdout, "Test Table", 1); table_row(table, "%s%s", "Column 1", "Column 2"); table_separator(table); table_row(table, "%s%s", "String value", "test string"); table_row(table, "%s%c", "Character value", 'c'); table_row(table, "%s%d", "Signed integer", -1); table_row(table, "%s%u", "Unsigned integer", 42); table_row(table, "%s%o", "Octal integer", 511); table_row(table, "%s%8x", "Hexadecimal integer", 255); table_row(table, "%s%.5f", "Floating point", 3.14159); table_row(table, "%s%t", "Timestamp", 0); table_commit(table); return 0; }
Produces the following output:
$ ./table.exe +---------------------------------------------------------------+ | Test Table | +---------------------+-----------------------------------------+ | Column 1 | Column 2 | +---------------------+-----------------------------------------+ | String value | test string | | Character value | c | | Signed integer | -1 | | Unsigned integer | 42 | | Octal integer | 0777 | | Hexadecimal integer | 0x000000ff | | Floating point | 3.14159 | | Timestamp | Thursday, January 01, 1970, 12:00:00 AM | +---------------------+-----------------------------------------+
The code is free under the MIT license and can be downloaded here.