tabular

Flexible input tabulator
git clone https://git.sinitax.com/sinitax/tabular
Log | Files | Refs | Submodules | sfeed.txt

commit f32da6a6ef96eedb5c5125e3415fc38ff2e15663
parent 127b061df0f4d1cedc356ec9fc0b031b9403e96b
Author: Louis Burda <quent.burda@gmail.com>
Date:   Sat,  3 Jun 2023 02:22:10 +0200

Fix issue with detecting closed stdin

Diffstat:
Mmain.c | 19++++++++++++++-----
1 file changed, 14 insertions(+), 5 deletions(-)

diff --git a/main.c b/main.c @@ -37,6 +37,8 @@ static size_t colcnt = 0; static struct dvec input; static size_t input_off = 0; +static bool input_done = false; + static struct dvec line; static struct dvec entries; static size_t linecnt = 0; @@ -98,9 +100,6 @@ print_style(FILE *file, const struct tabular_cfg *cfg, } else if (!row) { /* header */ fprintf(file, "\x1b[1m"); return true; - } else if (!strcmp(col->name, "Name")) { - fprintf(file, "\x1b[35m"); - return true; } } @@ -113,6 +112,8 @@ read_line(void) void *tok, *sep, *end, *line_end; ssize_t n; + if (input_done) return false; + while (1) { while (!(line_end = memchr(input.data + input_off, line_sep, input.len - input_off))) { @@ -121,14 +122,15 @@ read_line(void) dvec_reserve(&input, input.len + BUFSIZ + 1); n = read(0, input.data + input.len, BUFSIZ); if (n <= 0) { + input_done = true; line_end = input.data + input.len; break; } input.len += (size_t) n; } - if (!input.len) return false; + if (input_done && !input.len) return false; - if (line_end != input.data || skip_empty_lines) + if (line_end != input.data || !skip_empty_lines) break; input_off += 1; } @@ -227,6 +229,7 @@ parse(int argc, const char **argv) struct winsize ws; char namebuf[64]; char *end, *c, *upper; + size_t len; int rc, n; hmap_init(&colmap, 16, hmap_str_hash, hmap_str_keycmp, ga); @@ -345,10 +348,16 @@ parse(int argc, const char **argv) if (!*++arg) die("missing args"); col->lpad = strtoul(*arg, &end, 10); if (end && *end) die("bad %s", arg[-1]); + len = col->lpad + strlen(col->name) + col->rpad; + if (col->minwidth < len) + col->minwidth = len; } else if (!strcmp(*arg + n, "rpad")) { if (!*++arg) die("missing args"); col->rpad = strtoul(*arg, &end, 10); if (end && *end) die("bad %s", arg[-1]); + len = col->lpad + strlen(col->name) + col->rpad; + if (col->minwidth < len) + col->minwidth = len; } else if (!strcmp(*arg + n, "align")) { if (!*++arg) die("missing args"); if (!strcmp(*arg, "left")) {