1*ae771770SStanislav Sedov.\" Copyright (c) 2004 Kungliga Tekniska Högskolan 2c19800e8SDoug Rabson.\" (Royal Institute of Technology, Stockholm, Sweden). 3c19800e8SDoug Rabson.\" All rights reserved. 4c19800e8SDoug Rabson.\" 5c19800e8SDoug Rabson.\" Redistribution and use in source and binary forms, with or without 6c19800e8SDoug Rabson.\" modification, are permitted provided that the following conditions 7c19800e8SDoug Rabson.\" are met: 8c19800e8SDoug Rabson.\" 9c19800e8SDoug Rabson.\" 1. Redistributions of source code must retain the above copyright 10c19800e8SDoug Rabson.\" notice, this list of conditions and the following disclaimer. 11c19800e8SDoug Rabson.\" 12c19800e8SDoug Rabson.\" 2. Redistributions in binary form must reproduce the above copyright 13c19800e8SDoug Rabson.\" notice, this list of conditions and the following disclaimer in the 14c19800e8SDoug Rabson.\" documentation and/or other materials provided with the distribution. 15c19800e8SDoug Rabson.\" 16c19800e8SDoug Rabson.\" 3. Neither the name of the Institute nor the names of its contributors 17c19800e8SDoug Rabson.\" may be used to endorse or promote products derived from this software 18c19800e8SDoug Rabson.\" without specific prior written permission. 19c19800e8SDoug Rabson.\" 20c19800e8SDoug Rabson.\" THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 21c19800e8SDoug Rabson.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22c19800e8SDoug Rabson.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 23c19800e8SDoug Rabson.\" ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 24c19800e8SDoug Rabson.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25c19800e8SDoug Rabson.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 26c19800e8SDoug Rabson.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 27c19800e8SDoug Rabson.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 28c19800e8SDoug Rabson.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 29c19800e8SDoug Rabson.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 30c19800e8SDoug Rabson.\" SUCH DAMAGE. 31*ae771770SStanislav Sedov.\" $Id$ 32c19800e8SDoug Rabson.\" 33c19800e8SDoug Rabson.Dd June 26, 2004 34c19800e8SDoug Rabson.Dt RTBL 3 35c19800e8SDoug Rabson.Os HEIMDAL 36c19800e8SDoug Rabson.Sh NAME 37c19800e8SDoug Rabson.Nm rtbl_create , 38c19800e8SDoug Rabson.Nm rtbl_destroy , 39c19800e8SDoug Rabson.Nm rtbl_set_flags , 40c19800e8SDoug Rabson.Nm rtbl_get_flags , 41c19800e8SDoug Rabson.Nm rtbl_set_prefix , 42c19800e8SDoug Rabson.Nm rtbl_set_separator , 43c19800e8SDoug Rabson.Nm rtbl_set_column_prefix , 44c19800e8SDoug Rabson.Nm rtbl_set_column_affix_by_id , 45c19800e8SDoug Rabson.Nm rtbl_add_column , 46c19800e8SDoug Rabson.Nm rtbl_add_column_by_id , 47c19800e8SDoug Rabson.Nm rtbl_add_column_entry , 48c19800e8SDoug Rabson.Nm rtbl_add_column_entry_by_id , 49c19800e8SDoug Rabson.Nm rtbl_new_row , 50c19800e8SDoug Rabson.Nm rtbl_format 51c19800e8SDoug Rabson.Nd format data in simple tables 52c19800e8SDoug Rabson.Sh LIBRARY 53c19800e8SDoug RabsonThe roken library (libroken, -lroken) 54c19800e8SDoug Rabson.Sh SYNOPSIS 55c19800e8SDoug Rabson.In rtbl.h 56c19800e8SDoug Rabson.Ft int 57c19800e8SDoug Rabson.Fn rtbl_add_column "rtbl_t table" "const char *column_name" "unsigned int flags" 58c19800e8SDoug Rabson.Ft int 59c19800e8SDoug Rabson.Fn rtbl_add_column_by_id "rtbl_t table" "unsigned int column_id" "const char *column_header" "unsigned int flags" 60c19800e8SDoug Rabson.Ft int 61c19800e8SDoug Rabson.Fn rtbl_add_column_entry "rtbl_t table" "const char *column_name" "const char *cell_entry" 62c19800e8SDoug Rabson.Ft int 63c19800e8SDoug Rabson.Fn rtbl_add_column_entry_by_id "rtbl_t table" "unsigned int column_id" "const char *cell_entry" 64c19800e8SDoug Rabson.Ft rtbl_t 65c19800e8SDoug Rabson.Fn rtbl_create "void" 66c19800e8SDoug Rabson.Ft void 67c19800e8SDoug Rabson.Fn rtbl_destroy "rtbl_t table" 68c19800e8SDoug Rabson.Ft int 69c19800e8SDoug Rabson.Fn rtbl_new_row "rtbl_t table" 70c19800e8SDoug Rabson.Ft int 71c19800e8SDoug Rabson.Fn rtbl_set_column_affix_by_id "rtbl_t table" "unsigned int column_id "const char *prefix" "const char *suffix" 72c19800e8SDoug Rabson.Ft int 73c19800e8SDoug Rabson.Fn rtbl_set_column_prefix "rtbl_t table" "const char *column_name" "const char *prefix" 74c19800e8SDoug Rabson.Ft "unsigned int" 75c19800e8SDoug Rabson.Fn rtbl_get_flags "rtbl_t table" 76c19800e8SDoug Rabson.Ft void 77c19800e8SDoug Rabson.Fn rtbl_set_flags "rtbl_t table" "unsigned int flags" 78c19800e8SDoug Rabson.Ft int 79c19800e8SDoug Rabson.Fn rtbl_set_prefix "rtbl_t table" "const char *prefix" 80c19800e8SDoug Rabson.Ft int 81c19800e8SDoug Rabson.Fn rtbl_set_separator "rtbl_t table" "const char *separator" 82c19800e8SDoug Rabson.Ft int 83c19800e8SDoug Rabson.Fn rtbl_format "rtbl_t table "FILE *file" 84c19800e8SDoug Rabson.Sh DESCRIPTION 85c19800e8SDoug RabsonThis set of functions assemble a simple table consisting of rows and 86c19800e8SDoug Rabsoncolumns, allowing it to be printed with certain options. Typical use 87c19800e8SDoug Rabsonwould be output from tools such as 88c19800e8SDoug Rabson.Xr ls 1 89c19800e8SDoug Rabsonor 90c19800e8SDoug Rabson.Xr netstat 1 , 91c19800e8SDoug Rabsonwhere you have a fixed number of columns, but don't know the column 92*ae771770SStanislav Sedovwidths before hand. 93c19800e8SDoug Rabson.Pp 94c19800e8SDoug RabsonA table is created with 95c19800e8SDoug Rabson.Fn rtbl_create 96c19800e8SDoug Rabsonand destroyed with 97c19800e8SDoug Rabson.Fn rtbl_destroy . 98c19800e8SDoug Rabson.Pp 99c19800e8SDoug RabsonGlobal flags on the table are set with 100c19800e8SDoug Rabson.Fa rtbl_set_flags 101c19800e8SDoug Rabsonand retrieved with 102c19800e8SDoug Rabson.Fa rtbl_get_flags . 103c19800e8SDoug RabsonAt present the only defined flag is 104c19800e8SDoug Rabson.Dv RTBL_HEADER_STYLE_NONE 105c19800e8SDoug Rabsonwhich suppresses printing the header. 106c19800e8SDoug Rabson.Pp 107c19800e8SDoug RabsonBefore adding data to the table, one or more columns need to be 108c19800e8SDoug Rabsoncreated. This would normally be done with 109c19800e8SDoug Rabson.Fn rtbl_add_column_by_id , 110c19800e8SDoug Rabson.Fa column_id 111c19800e8SDoug Rabsonis any number of your choice (it's used only to identify columns), 112c19800e8SDoug Rabson.Fa column_header 113c19800e8SDoug Rabsonis the header to print at the top of the column, and 114c19800e8SDoug Rabson.Fa flags 115c19800e8SDoug Rabsonare flags specific to this column. Currently the only defined flag is 116c19800e8SDoug Rabson.Dv RTBL_ALIGN_RIGHT , 117c19800e8SDoug Rabsonaligning column entries to the right. Columns are printed in the order 118c19800e8SDoug Rabsonthey are added. 119c19800e8SDoug Rabson.Pp 120c19800e8SDoug RabsonThere's also a way to add columns by column name with 121c19800e8SDoug Rabson.Fn rtbl_add_column , 122c19800e8SDoug Rabsonbut this is less flexible (you need unique header names), and is 123c19800e8SDoug Rabsonconsidered deprecated. 124c19800e8SDoug Rabson.Pp 125c19800e8SDoug RabsonTo add data to a column you use 126c19800e8SDoug Rabson.Fn rtbl_add_column_entry_by_id , 127c19800e8SDoug Rabsonwhere the 128c19800e8SDoug Rabson.Fa column_id 129c19800e8SDoug Rabsonis the same as when the column was added (adding data to a 130c19800e8SDoug Rabsonnon-existent column is undefined), and 131c19800e8SDoug Rabson.Fa cell_entry 132c19800e8SDoug Rabsonis whatever string you wish to include in that cell. It should not 133c19800e8SDoug Rabsoninclude newlines. 134c19800e8SDoug RabsonFor columns added with 135c19800e8SDoug Rabson.Fn rtbl_add_column 136c19800e8SDoug Rabsonyou must use 137c19800e8SDoug Rabson.Fn rtbl_add_column_entry 138c19800e8SDoug Rabsoninstead. 139c19800e8SDoug Rabson.Pp 140c19800e8SDoug Rabson.Fn rtbl_new_row 141c19800e8SDoug Rabsonfills all columns with blank entries until they all have the same 142c19800e8SDoug Rabsonnumber of rows. 143c19800e8SDoug Rabson.Pp 144c19800e8SDoug RabsonEach column can have a separate prefix and suffix, set with 145c19800e8SDoug Rabson.Fa rtbl_set_column_affix_by_id ; 146c19800e8SDoug Rabson.Fa rtbl_set_column_prefix 147c19800e8SDoug Rabsonallows setting the prefix only by column name. In addition to this, 148c19800e8SDoug Rabsoncolumns may be separated by a string set with 149c19800e8SDoug Rabson.Fa rtbl_set_separator ( Ns 150c19800e8SDoug Rabsonby default columns are not seprated by anything). 151c19800e8SDoug Rabson.Pp 152c19800e8SDoug RabsonThe finished table is printed to 153c19800e8SDoug Rabson.Fa file 154c19800e8SDoug Rabsonwith 155c19800e8SDoug Rabson.Fa rtbl_format . 156c19800e8SDoug Rabson.Sh EXAMPLES 157c19800e8SDoug RabsonThis program: 158c19800e8SDoug Rabson.Bd -literal -offset xxxx 159c19800e8SDoug Rabson#include <stdio.h> 160c19800e8SDoug Rabson#include <rtbl.h> 161c19800e8SDoug Rabsonint 162c19800e8SDoug Rabsonmain(int argc, char **argv) 163c19800e8SDoug Rabson{ 164c19800e8SDoug Rabson rtbl_t table; 165c19800e8SDoug Rabson table = rtbl_create(); 166c19800e8SDoug Rabson rtbl_set_separator(table, " "); 167c19800e8SDoug Rabson rtbl_add_column_by_id(table, 0, "Column A", 0); 168c19800e8SDoug Rabson rtbl_add_column_by_id(table, 1, "Column B", RTBL_ALIGN_RIGHT); 169c19800e8SDoug Rabson rtbl_add_column_by_id(table, 2, "Column C", 0); 170c19800e8SDoug Rabson rtbl_add_column_entry_by_id(table, 0, "A-1"); 171c19800e8SDoug Rabson rtbl_add_column_entry_by_id(table, 0, "A-2"); 172c19800e8SDoug Rabson rtbl_add_column_entry_by_id(table, 0, "A-3"); 173c19800e8SDoug Rabson rtbl_add_column_entry_by_id(table, 1, "B-1"); 174c19800e8SDoug Rabson rtbl_add_column_entry_by_id(table, 2, "C-1"); 175c19800e8SDoug Rabson rtbl_add_column_entry_by_id(table, 2, "C-2"); 176c19800e8SDoug Rabson rtbl_add_column_entry_by_id(table, 1, "B-2"); 177c19800e8SDoug Rabson rtbl_add_column_entry_by_id(table, 1, "B-3"); 178c19800e8SDoug Rabson rtbl_add_column_entry_by_id(table, 2, "C-3"); 179c19800e8SDoug Rabson rtbl_add_column_entry_by_id(table, 0, "A-4"); 180c19800e8SDoug Rabson rtbl_new_row(table); 181c19800e8SDoug Rabson rtbl_add_column_entry_by_id(table, 1, "B-4"); 182c19800e8SDoug Rabson rtbl_new_row(table); 183c19800e8SDoug Rabson rtbl_add_column_entry_by_id(table, 2, "C-4"); 184c19800e8SDoug Rabson rtbl_new_row(table); 185c19800e8SDoug Rabson rtbl_format(table, stdout); 186c19800e8SDoug Rabson rtbl_destroy(table); 187c19800e8SDoug Rabson return 0; 188c19800e8SDoug Rabson} 189c19800e8SDoug Rabson.Ed 190c19800e8SDoug Rabson.Pp 191c19800e8SDoug Rabsonwill output the following: 192c19800e8SDoug Rabson.Bd -literal -offset xxxx 193c19800e8SDoug RabsonColumn A Column B Column C 194c19800e8SDoug RabsonA-1 B-1 C-1 195c19800e8SDoug RabsonA-2 B-2 C-2 196c19800e8SDoug RabsonA-3 B-3 C-3 197c19800e8SDoug RabsonA-4 198c19800e8SDoug Rabson B-4 199c19800e8SDoug Rabson C-4 200c19800e8SDoug Rabson.Ed 201c19800e8SDoug Rabson.\" .Sh SEE ALSO 202