2 * This program is free software; you can redistribute it and/or
3 * modify it under the terms of the GNU General Public
4 * License v2 as published by the Free Software Foundation.
6 * This program is distributed in the hope that it will be useful,
7 * but WITHOUT ANY WARRANTY; without even the implied warranty of
8 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
9 * General Public License for more details.
11 * You should have received a copy of the GNU General Public
12 * License along with this program; if not, write to the
13 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
14 * Boston, MA 021110-1307, USA.
22 #include "string-table.h"
25 * This function create an array of char * which will represent a table
27 struct string_table
*table_create(int columns
, int rows
)
29 struct string_table
*tab
;
32 size
= sizeof(struct string_table
) + rows
* columns
* sizeof(char*);
33 tab
= calloc(1, size
);
45 * This function is like a vprintf, but store the results in a cell of
47 * If fmt starts with '<', the text is left aligned; if fmt starts with
48 * '>' the text is right aligned. If fmt is equal to '=' the text will
49 * be replaced by a '=====' dimensioned on the basis of the column width
51 char *table_vprintf(struct string_table
*tab
, int column
, int row
,
52 char *fmt
, va_list ap
)
54 int idx
= tab
->ncols
* row
+ column
;
55 char *msg
= calloc(100, 1);
61 free(tab
->cells
[idx
]);
62 tab
->cells
[idx
] = msg
;
63 vsnprintf(msg
, 99, fmt
, ap
);
69 * This function is like a printf, but store the results in a cell of
72 __attribute__ ((format (printf
, 4, 5)))
73 char *table_printf(struct string_table
*tab
, int column
, int row
,
80 ret
= table_vprintf(tab
, column
, row
, fmt
, ap
);
87 * This function dumps the table. Every "=" string will be replaced by
88 * a "=======" length as the column
90 void table_dump(struct string_table
*tab
)
92 int sizes
[tab
->ncols
];
95 for (i
= 0; i
< tab
->ncols
; i
++) {
97 for (j
= 0; j
< tab
->nrows
; j
++) {
98 int idx
= i
+ j
* tab
->ncols
;
101 if (!tab
->cells
[idx
])
104 len
= strlen(tab
->cells
[idx
]) - 1;
105 if (len
== 0 || tab
->cells
[idx
][0] == '*')
113 for (j
= 0; j
< tab
->nrows
; j
++) {
114 for (i
= 0; i
< tab
->ncols
; i
++) {
115 int idx
= i
+ j
* tab
->ncols
;
116 char *cell
= tab
->cells
[idx
];
118 if (!cell
|| !strlen(cell
)) {
119 printf("%*s", sizes
[i
], "");
120 } else if (cell
&& cell
[0] == '*' && cell
[1]) {
127 cell
[0] == '<' ? -sizes
[i
] : sizes
[i
],
130 if (i
!= (tab
->ncols
- 1))
138 * Deallocate a table and all of its content
140 void table_free(struct string_table
*tab
)
144 count
= tab
->ncols
* tab
->nrows
;
146 for (i
= 0; i
< count
; i
++)