ican now store and print a buffer - iomenu - interactive terminal-based selection menu Err bitreich.org 70 hgit clone git://bitreich.org/iomenu git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/iomenu URL:git://bitreich.org/iomenu git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/iomenu bitreich.org 70 1Log /scm/iomenu/log.gph bitreich.org 70 1Files /scm/iomenu/files.gph bitreich.org 70 1Refs /scm/iomenu/refs.gph bitreich.org 70 1Tags /scm/iomenu/tag bitreich.org 70 1README /scm/iomenu/file/README.gph bitreich.org 70 1LICENSE /scm/iomenu/file/LICENSE.gph bitreich.org 70 i--- Err bitreich.org 70 1commit f7009a9dc38d011eafe5720f7ce72b98560722b9 /scm/iomenu/commit/f7009a9dc38d011eafe5720f7ce72b98560722b9.gph bitreich.org 70 1parent d3fb1d64c2c59436bbf19b18713bb82a0c987760 /scm/iomenu/commit/d3fb1d64c2c59436bbf19b18713bb82a0c987760.gph bitreich.org 70 hAuthor: Josuah Demangeonā  ā µ URL:mailto:mail@josuah.net bitreich.org 70 iDate: Fri, 17 Mar 2017 20:13:19 +0100 Err bitreich.org 70 i Err bitreich.org 70 ican now store and print a buffer Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M iomenu.c | 69 +++++++++++-------------------- Err bitreich.org 70 i Err bitreich.org 70 i1 file changed, 25 insertions(+), 44 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/iomenu.c b/iomenu.c /scm/iomenu/file/iomenu.c.gph bitreich.org 70 i@@ -24,10 +24,10 @@ struct line { Err bitreich.org 70 i Err bitreich.org 70 i Err bitreich.org 70 i char input[BUFSIZ]; Err bitreich.org 70 i-size_t current = 0, matching = 0, linec = 0; Err bitreich.org 70 i+size_t current = 0, matching = 0, linec = 0, offset = 0; Err bitreich.org 70 i struct line **linev = NULL; Err bitreich.org 70 i int opt_lines = 30; Err bitreich.org 70 i-char *opt_prompt = ">"; Err bitreich.org 70 i+char *opt_prompt = ""; Err bitreich.org 70 i Err bitreich.org 70 i Err bitreich.org 70 i void Err bitreich.org 70 i@@ -70,27 +70,26 @@ set_terminal(int tty_fd) Err bitreich.org 70 i Err bitreich.org 70 i Err bitreich.org 70 i void Err bitreich.org 70 i-fill_linev(void) Err bitreich.org 70 i+read_lines(void) Err bitreich.org 70 i { Err bitreich.org 70 i extern struct line **linev; Err bitreich.org 70 i Err bitreich.org 70 i char s[BUFSIZ]; Err bitreich.org 70 i size_t size = 1 << 4; Err bitreich.org 70 i Err bitreich.org 70 i- linev = malloc(sizeof(*linev) * size); Err bitreich.org 70 i- input[0] = '\0'; Err bitreich.org 70 i- linec = matching = 0; Err bitreich.org 70 i+ linev = malloc(sizeof(struct line *) * size); Err bitreich.org 70 i+ linev[0] = NULL; Err bitreich.org 70 i Err bitreich.org 70 i /* read the file into an array of lines */ Err bitreich.org 70 i for (; fgets(s, BUFSIZ, stdin); linec++, matching++) { Err bitreich.org 70 i- Err bitreich.org 70 i size_t len = strlen(s); Err bitreich.org 70 i+ Err bitreich.org 70 i if (len > 0 && s[len - 1] == '\n') Err bitreich.org 70 i s[len - 1] = '\0'; Err bitreich.org 70 i Err bitreich.org 70 i- if (linec >= size) { Err bitreich.org 70 i+ if (linec > size) { Err bitreich.org 70 i size *= 2; Err bitreich.org 70 i- linev = realloc(linev, sizeof(*linev) * size); Err bitreich.org 70 i+ linev = realloc(linev, sizeof(struct line *) * size); Err bitreich.org 70 i Err bitreich.org 70 i if (linev == NULL) Err bitreich.org 70 i die("realloc"); Err bitreich.org 70 i@@ -98,10 +97,9 @@ fill_linev(void) Err bitreich.org 70 i Err bitreich.org 70 i linev[linec] = malloc(sizeof(struct line)); Err bitreich.org 70 i linev[linec]->match = 1; Err bitreich.org 70 i- linev[linec]->text = s; Err bitreich.org 70 i+ linev[linec]->text = malloc(len); Err bitreich.org 70 i+ strcpy(linev[linec]->text, s); Err bitreich.org 70 i } Err bitreich.org 70 i- Err bitreich.org 70 i- linev[linec] = NULL; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i Err bitreich.org 70 i@@ -143,16 +141,10 @@ filter_lines(int inc) Err bitreich.org 70 i Err bitreich.org 70 i /* match lines */ Err bitreich.org 70 i matching = 0; Err bitreich.org 70 i- for (size_t i = 0; i < linec; i++) { Err bitreich.org 70 i- Err bitreich.org 70 i- if (input[0] && strcmp(input, linev[i]->text) == 0) { Err bitreich.org 70 i- linev[i]->match = 1; Err bitreich.org 70 i- Err bitreich.org 70 i- } else if (!(inc ^ linev[i]->match)) { Err bitreich.org 70 i- linev[i]->match = line_matches(linev[i], tokv, tokc); Err bitreich.org 70 i- matching += linev[i]->match; Err bitreich.org 70 i- } Err bitreich.org 70 i- } Err bitreich.org 70 i+ for (size_t i = 0; i < linec; i++) Err bitreich.org 70 i+ /* if (!(inc ^ linev[i]->match)) */ Err bitreich.org 70 i+ matching += linev[i]->match = Err bitreich.org 70 i+ line_matches(linev[i], tokv, tokc); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i Err bitreich.org 70 i@@ -190,29 +182,17 @@ draw_line(size_t pos, const size_t cols) Err bitreich.org 70 i void Err bitreich.org 70 i draw_lines(size_t count, size_t cols) Err bitreich.org 70 i { Err bitreich.org 70 i- size_t i = current, printed = 0; Err bitreich.org 70 i+ size_t i = offset; Err bitreich.org 70 i Err bitreich.org 70 i- /* find `count / 3` matching lines above */ Err bitreich.org 70 i- for (size_t c = 0; c < 2 * count / 3 && i > 0; i--) Err bitreich.org 70 i- if (linev[i] && linev[i]->match) Err bitreich.org 70 i- c++; Err bitreich.org 70 i- Err bitreich.org 70 i- while (i < linec && printed < count) { Err bitreich.org 70 i- if (linev[i]->match) { Err bitreich.org 70 i- draw_line(i, cols); Err bitreich.org 70 i- i++; printed++; Err bitreich.org 70 i- } Err bitreich.org 70 i- } Err bitreich.org 70 i- Err bitreich.org 70 i- for (; printed < count; printed++) Err bitreich.org 70 i- fputs("\n\033[K", stderr); Err bitreich.org 70 i+ for (i = 0; i < linec; i++) Err bitreich.org 70 i+ draw_line(i, cols); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i Err bitreich.org 70 i void Err bitreich.org 70 i draw_prompt(int cols) Err bitreich.org 70 i { Err bitreich.org 70 i- fprintf(stderr, "\r\033[K\033[1m%7s %s\033[m", opt_prompt, input); Err bitreich.org 70 i+ fprintf(stderr, "\r\033[K\033[1m%s%s\033[m", opt_prompt, input); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i Err bitreich.org 70 i@@ -272,7 +252,8 @@ add_character(char key) Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i filter_lines(1); Err bitreich.org 70 i- current = matching_next(0); Err bitreich.org 70 i+ Err bitreich.org 70 i+ current = linev[0]->match ? 0 : matching_next(0); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i Err bitreich.org 70 i@@ -329,7 +310,7 @@ input_key(FILE *tty_fp) Err bitreich.org 70 i case CONTROL('H'): /* backspace */ Err bitreich.org 70 i input[strlen(input) - 1] = '\0'; Err bitreich.org 70 i filter_lines(0); Err bitreich.org 70 i- current = matching_next(0); Err bitreich.org 70 i+ current = linev[0]->match ? 0 : matching_next(0); Err bitreich.org 70 i break; Err bitreich.org 70 i Err bitreich.org 70 i case CONTROL('N'): Err bitreich.org 70 i@@ -337,7 +318,7 @@ input_key(FILE *tty_fp) Err bitreich.org 70 i break; Err bitreich.org 70 i Err bitreich.org 70 i case CONTROL('P'): Err bitreich.org 70 i- matching_prev(current); Err bitreich.org 70 i+ current = matching_prev(current); Err bitreich.org 70 i break; Err bitreich.org 70 i Err bitreich.org 70 i case CONTROL('I'): /* tab */ Err bitreich.org 70 i@@ -366,10 +347,10 @@ input_get(int tty_fd) Err bitreich.org 70 i { Err bitreich.org 70 i FILE *tty_fp = fopen("/dev/tty", "r"); Err bitreich.org 70 i int exit_code; Err bitreich.org 70 i- Err bitreich.org 70 i- /* receive one character at a time from the terminal */ Err bitreich.org 70 i struct termios termio_old = set_terminal(tty_fd); Err bitreich.org 70 i Err bitreich.org 70 i+ input[0] = '\0'; Err bitreich.org 70 i+ Err bitreich.org 70 i while ((exit_code = input_key(tty_fp)) == CONTINUE) Err bitreich.org 70 i draw_screen(tty_fd); Err bitreich.org 70 i Err bitreich.org 70 i@@ -418,7 +399,7 @@ main(int argc, char *argv[]) Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i /* command line arguments */ Err bitreich.org 70 i- fill_linev(); Err bitreich.org 70 i+ read_lines(); Err bitreich.org 70 i Err bitreich.org 70 i /* set the interface */ Err bitreich.org 70 i draw_screen(tty_fd); Err bitreich.org 70 .