Pretty Print Tables

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.

Tags: , , , , ,

Monday, June 17th, 2013 C, Programming

Leave a Reply

 

Comments are moderated due to spammers. Your comments will not appear until I review and approve them. If you left a question I will answer as best I can so be sure to check back.