From 583bcd490a055f013b244a6cd7e6ecb6765260e2 Mon Sep 17 00:00:00 2001 From: katalx Date: Wed, 28 Jan 2026 20:46:43 -0500 Subject: read stdin into opt array --- main.c | 45 +++++++++++++++++++++++++++++++-------------- 1 file changed, 31 insertions(+), 14 deletions(-) (limited to 'main.c') diff --git a/main.c b/main.c index 111aeed..e48326b 100644 --- a/main.c +++ b/main.c @@ -2,7 +2,9 @@ * a simple fuzzy-selection menu made with Xlib */ +#include #include +#include #define ARENA_IMPL #define STR_IMPL @@ -47,23 +49,39 @@ txt_delete(DynStr *s, int i, int n) return i - n; } +int +read_all(FILE *f, DynStr *out, Arena *a) +{ + char buf[256]; + while (!feof(f)) { + size_t n = fread(buf, 1, sizeof buf, f); + if (ferror(f)) return -1; + DA_APUSH_MULT(out, a, buf, n); + } + return 0; +} + int main(int argc, char **argv) { ui_init(argc, argv); + Arena a = { 0 }; DynStr input = { 0 }; int inpi = 0; int seli = 0; - Str optv[] = { - S("she shit on my thang until i vomit"), - S("what"), - S("who are you"), - S("why are you"), - S("where'd you come from") - }; - int optc = sizeof optv / sizeof *optv; - if (!optc) goto done; + + UiOpts opt = { 0 }; + DynStr buf = { 0 }; + if (read_all(stdin, &buf, &a)) err(1, "stdin"); + for (Str src = { buf.v, buf.n }; src.n > 0; ) { + Cut c = str_cut(src, '\n'); + DA_APUSH(&opt, &a, c.head); + src = c.tail; + } + + if (!opt.n) goto done; + for (UiEvent ev; ui_wait_event(&ev); ) { switch (ev.type) { case UI_KEY_DOWN: @@ -74,14 +92,14 @@ main(int argc, char **argv) inpi = txt_delete(&input, inpi, 1); goto draw; case UIK_RETURN: { - Str o = optv[seli]; + Str o = opt.v[seli]; printf("%.*s\n", (int)o.n, o.s); } goto done; case UIK_DOWN: - seli = umod(seli + 1, optc); + seli = umod(seli + 1, opt.n); goto draw; case UIK_UP: - seli = umod(seli - 1, optc); + seli = umod(seli - 1, opt.n); goto draw; case UIK_LEFT: if (inpi > 0) inpi--; @@ -108,8 +126,7 @@ main(int argc, char **argv) (Str) { input.v, input.n }, inpi, seli, - optv, - optc + opt ); break; default: -- cgit v1.2.3