diff options
| author | Louis Burda <dev@sinitax.com> | 2025-12-04 00:33:37 +0100 |
|---|---|---|
| committer | Louis Burda <dev@sinitax.com> | 2025-12-04 00:34:06 +0100 |
| commit | 02706c7b5ed189077478a10cc3e27080b6fd1f61 (patch) | |
| tree | 069c76975117ffe7f0f8a1793e23d8412d243c75 | |
| parent | f3c5b10fca5cff1e6bb71b6e2587f4463968f720 (diff) | |
| download | tquery-02706c7b5ed189077478a10cc3e27080b6fd1f61.tar.gz tquery-02706c7b5ed189077478a10cc3e27080b6fd1f61.zip | |
Allow showing only part of entry
| -rw-r--r-- | tquery.c | 106 |
1 files changed, 71 insertions, 35 deletions
@@ -1,6 +1,7 @@ #include <curses.h> #include <fcntl.h> +#include <stdint.h> #include <sys/wait.h> #include <sys/poll.h> #include <sys/fcntl.h> @@ -26,6 +27,11 @@ struct nav { ssize_t sel, min, max; }; +struct entry { + size_t full; + size_t visible; +}; + static void sigint_handler(int sig); static const struct sigaction sigint_action = { @@ -57,9 +63,9 @@ static char *output = NULL; static size_t output_len = 0; static size_t output_cap = 0; -static size_t *delims = NULL; -static size_t delims_len = 0; -static size_t delims_cap = 0; +static struct entry *entries = NULL; +static size_t entries_len = 0; +static size_t entries_cap = 0; static struct nav output_nav; @@ -70,6 +76,7 @@ static bool split_args = false; static bool oneshot = false; static bool errlog = false; static char delim = '\n'; +static char vis_delim = '|'; static void die(const char *fmt, ...) @@ -198,7 +205,7 @@ load(void) { ssize_t nread; size_t i; - char *start; + char *c; nread = read(child_fd, loadbuf, LOAD_BUFSIZ); if (nread <= 0) { @@ -208,21 +215,51 @@ load(void) return; } - output = addcap(output, 1, output_len + (size_t) nread, &output_cap); + output = addcap(output, 1, output_len + (size_t) nread + 1, &output_cap); memcpy(output + output_len, loadbuf, (size_t) nread); - start = output + output_len; - - for (i = output_len; i < output_len + (size_t) nread; i++, start++) { - if (*start == delim) { - *start = '\0'; - delims = addcap(delims, sizeof(size_t), - delims_len + 1, &delims_cap); - delims[delims_len++] = i; + if (!entries_cap) + entries = addcap(entries, sizeof(struct entry), + 1, &entries_cap); + entries_len = MAX(1, entries_len); + + c = output + output_len; + for (i = output_len; i < output_len + (size_t) nread; i++, c++) { + if (*c == vis_delim) { + entries[entries_len-1].visible = i+1; + } else if (*c == delim) { + *c = '\0'; + entries = addcap(entries, sizeof(struct entry), + entries_len + 1, &entries_cap); + entries[entries_len].full = i + 1; + entries[entries_len].visible = i + 1; + entries_len++; } } output_len += (size_t) nread; + output[output_len] = '\0'; +} + +static size_t +num_entries() +{ + if (!entries_len) return 0; + if (output_len <= entries[entries_len-1].full) + return entries_len-1; + return entries_len; +} + +static char * +full_entry(size_t i) +{ + return output + entries[i].full; +} + +static char * +vis_entry(size_t i) +{ + return output + entries[i].visible; } static void @@ -242,17 +279,12 @@ unload(void) child_pid = 0; } -static char * -entry(size_t i) -{ - return output + (i ? delims[i-1] + 1 : 0); -} - static void update(void) { const ssize_t miny = 3; int width, height; + size_t entry_cnt; ssize_t i, y; erase(); @@ -260,11 +292,12 @@ update(void) width = getmaxx(stdscr); height = getmaxy(stdscr); + entry_cnt = num_entries(); mvprintw(1, 1, "%lu %li %lu %i", output_len, - output_nav.sel, delims_len, child_pid); + output_nav.sel, entry_cnt, child_pid); mvprintw(2, 1, "> %.*s", width - 1, inputbuf); - nav_update_bounds(&output_nav, 0, (int) delims_len); + nav_update_bounds(&output_nav, 0, (int) entry_cnt); nav_update_wlen(&output_nav, (int) (height - miny)); if (output_len) { @@ -273,7 +306,7 @@ update(void) if (i == output_nav.sel) attr_on(A_REVERSE, NULL); - mvprintw((int) y, 1, "%.*s", width - 1, entry((size_t) i)); + mvprintw((int) y, 1, "%.*s", width - 1, vis_entry((size_t) i)); if (i == output_nav.sel) attr_off(A_REVERSE, NULL); @@ -293,7 +326,7 @@ spawn(const char *query) const char *tok, *ntok, *end; size_t argc; - delims_len = 0; + entries_len = 0; output_len = 0; argc = 0; @@ -452,16 +485,16 @@ input(void) case CTRL('x'): if (output_nav.max > 0 && output_nav.sel >= 0) { timeout(-1); - hook((uint8_t)getch(), entry((size_t)output_nav.sel)); + hook((uint8_t)getch(), full_entry((size_t)output_nav.sel)); timeout(0); } break; case '\n': if (output_nav.max > 0 && output_nav.sel >= 0) { if (run_cmd) { - run(entry((size_t) output_nav.sel)); + run(full_entry((size_t) output_nav.sel)); } else { - puts(entry((size_t) output_nav.sel)); + puts(full_entry((size_t) output_nav.sel)); if (oneshot) exit(0); } } @@ -501,15 +534,16 @@ usage(int rc, bool full) fprintf(stderr, "Usage: tquery [OPT..] -- CMD [ARG..]\n"); if (full) { fprintf(stderr, "\n"); - fprintf(stderr, " -h, --help Show this message\n"); - fprintf(stderr, " -d, --delim Set input entry delim\n"); - fprintf(stderr, " -o, --oneshot Exit after oneshot selection\n"); - fprintf(stderr, " -e, --stderr Dont close child stderr\n"); - fprintf(stderr, " -s, --split Split the query into args\n"); - fprintf(stderr, " -r, --run Program to run on Enter\n"); - fprintf(stderr, " -R, --run-io Program to run interactively on Enter\n"); - fprintf(stderr, " -x, --hook Program to run on Ctrl-X\n"); - fprintf(stderr, " -X, --hook-io Program to run interactively on Ctrl-X\n"); + fprintf(stderr, " -h, --help Show this message\n"); + fprintf(stderr, " -d, --delim Set input entry delim\n"); + fprintf(stderr, " -D, --vis-delim Set visible entry delim\n"); + fprintf(stderr, " -o, --oneshot Exit after oneshot selection\n"); + fprintf(stderr, " -e, --stderr Dont close child stderr\n"); + fprintf(stderr, " -s, --split Split the query into args\n"); + fprintf(stderr, " -r, --run Program to run on Enter\n"); + fprintf(stderr, " -R, --run-io Program to run interactively on Enter\n"); + fprintf(stderr, " -x, --hook Program to run on Ctrl-X\n"); + fprintf(stderr, " -X, --hook-io Program to run interactively on Ctrl-X\n"); fprintf(stderr, "\n"); } exit(rc); @@ -531,6 +565,8 @@ parse(int argc, char **argv) split_args = true; } else if (!strcmp(*arg, "-d") || !strcmp(*arg, "--delim")) { delim = **++arg; + } else if (!strcmp(*arg, "-D") || !strcmp(*arg, "--vis-delim")) { + vis_delim = **++arg; } else if (!strcmp(*arg, "-r") || !strcmp(*arg, "--run")) { run_argv[0] = *++arg; run_cmd = true; |
