summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLouis Burda <dev@sinitax.com>2025-12-04 00:33:37 +0100
committerLouis Burda <dev@sinitax.com>2025-12-04 00:34:06 +0100
commit02706c7b5ed189077478a10cc3e27080b6fd1f61 (patch)
tree069c76975117ffe7f0f8a1793e23d8412d243c75
parentf3c5b10fca5cff1e6bb71b6e2587f4463968f720 (diff)
downloadtquery-02706c7b5ed189077478a10cc3e27080b6fd1f61.tar.gz
tquery-02706c7b5ed189077478a10cc3e27080b6fd1f61.zip
Allow showing only part of entry
-rw-r--r--tquery.c106
1 files changed, 71 insertions, 35 deletions
diff --git a/tquery.c b/tquery.c
index 0476bf7..42e1aee 100644
--- a/tquery.c
+++ b/tquery.c
@@ -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;