inot using any struct at all - 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 179c4bde0a49ad89278b73ebbea5d4bfa2559605 /scm/iomenu/commit/179c4bde0a49ad89278b73ebbea5d4bfa2559605.gph bitreich.org 70 1parent a6d7fac8aad60c7581c11762a3d9a519dfb89d38 /scm/iomenu/commit/a6d7fac8aad60c7581c11762a3d9a519dfb89d38.gph bitreich.org 70 hAuthor: Josuah Demangeonā  ā µ URL:mailto:mail@josuah.net bitreich.org 70 iDate: Sat, 18 Mar 2017 18:33:05 +0100 Err bitreich.org 70 i Err bitreich.org 70 inot using any struct at all Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M iomenu.c | 114 ++++++++++++------------------- Err bitreich.org 70 i Err bitreich.org 70 i1 file changed, 43 insertions(+), 71 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@@ -17,26 +17,20 @@ Err bitreich.org 70 i #define MAX(X, Y) (((X) > (Y)) ? (X) : (Y)) Err bitreich.org 70 i Err bitreich.org 70 i Err bitreich.org 70 i-struct line { Err bitreich.org 70 i- char text[BUFSIZ]; Err bitreich.org 70 i- int match; Err bitreich.org 70 i-}; 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, offset = 0; Err bitreich.org 70 i-struct line **linev = NULL; Err bitreich.org 70 i-int opt_lines = 0; Err bitreich.org 70 i-char *opt_prompt = ""; Err bitreich.org 70 i+char input[BUFSIZ]; Err bitreich.org 70 i+size_t current = 0, matchc = 0, linec = 0, offset = 0; Err bitreich.org 70 i+char **linev = NULL, **matchv = NULL; Err bitreich.org 70 i+char *opt_prompt = ""; Err bitreich.org 70 i+int opt_lines = 0; Err bitreich.org 70 i Err bitreich.org 70 i Err bitreich.org 70 i void Err bitreich.org 70 i-free_linev(struct line **linev) Err bitreich.org 70 i+free_v(char **v, size_t c) Err bitreich.org 70 i { Err bitreich.org 70 i- for (; linec > 0; linec--) Err bitreich.org 70 i- free(linev[linec - 1]); Err bitreich.org 70 i+ for (; c > 0; c--) Err bitreich.org 70 i+ free(v[c - 1]); Err bitreich.org 70 i Err bitreich.org 70 i- free(linev); Err bitreich.org 70 i+ free(v); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i Err bitreich.org 70 i@@ -73,12 +67,15 @@ read_lines(void) Err bitreich.org 70 i char buffer[BUFSIZ]; Err bitreich.org 70 i size_t size = 1 << 6; Err bitreich.org 70 i Err bitreich.org 70 i- if (!(linev = malloc(sizeof(struct line *) * size))) Err bitreich.org 70 i+ linev = malloc(sizeof (char **) * size); Err bitreich.org 70 i+ matchv = malloc(sizeof (char **) * size); Err bitreich.org 70 i+ if (linev == NULL || matchv == NULL) Err bitreich.org 70 i die("malloc"); Err bitreich.org 70 i- linev[0] = NULL; Err bitreich.org 70 i+ Err bitreich.org 70 i+ linev[0] = matchv[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(buffer, sizeof buffer, stdin); linec++, matching++) { Err bitreich.org 70 i+ for (; fgets(buffer, sizeof buffer, stdin); linec++, matchc++) { Err bitreich.org 70 i size_t len = strlen(buffer); Err bitreich.org 70 i Err bitreich.org 70 i if (len > 0 && buffer[len - 1] == '\n') Err bitreich.org 70 i@@ -86,26 +83,26 @@ read_lines(void) Err bitreich.org 70 i Err bitreich.org 70 i if (linec >= size) { Err bitreich.org 70 i size *= 2; 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+ linev = realloc(linev, sizeof (char **) * size); Err bitreich.org 70 i+ matchv = realloc(matchv, sizeof (char **) * size); Err bitreich.org 70 i+ if (linev == NULL || matchv == NULL) Err bitreich.org 70 i die("realloc"); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i- if (!(linev[linec] = malloc(sizeof(struct line)))) Err bitreich.org 70 i+ linev[linec] = matchv[matchc] = malloc(len); Err bitreich.org 70 i+ if (linev[linec] == NULL) Err bitreich.org 70 i die("malloc"); Err bitreich.org 70 i Err bitreich.org 70 i- strcpy(linev[linec]->text, buffer); Err bitreich.org 70 i- linev[linec]->match = 1; Err bitreich.org 70 i+ strcpy(linev[linec], buffer); Err bitreich.org 70 i } Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i Err bitreich.org 70 i int Err bitreich.org 70 i-match_line(struct line *line, char **tokv, size_t tokc) Err bitreich.org 70 i+match_line(char *line, char **tokv, size_t tokc) Err bitreich.org 70 i { Err bitreich.org 70 i for (size_t i = 0; i < tokc; i++) Err bitreich.org 70 i- if (strstr(line->text, tokv[i]) == NULL) Err bitreich.org 70 i+ if (strstr(line, tokv[i]) == NULL) Err bitreich.org 70 i return 0; Err bitreich.org 70 i Err bitreich.org 70 i return 1; Err bitreich.org 70 i@@ -115,16 +112,15 @@ match_line(struct line *line, char **tokv, size_t tokc) Err bitreich.org 70 i void Err bitreich.org 70 i filter_lines(void) Err bitreich.org 70 i { Err bitreich.org 70 i- char **tokv = NULL; Err bitreich.org 70 i- char *s, buffer[sizeof(input)]; Err bitreich.org 70 i- size_t n = 0, tokc = 0; Err bitreich.org 70 i+ char **tokv = NULL, *s, buffer[sizeof (input)]; Err bitreich.org 70 i+ size_t tokc = 0, n = 0; Err bitreich.org 70 i Err bitreich.org 70 i /* tokenize input from space characters, this comes from dmenu */ Err bitreich.org 70 i strcpy(buffer, input); Err bitreich.org 70 i for (s = strtok(buffer, " "); s; s = strtok(NULL, " "), tokc++) { Err bitreich.org 70 i Err bitreich.org 70 i if (tokc >= n) { Err bitreich.org 70 i- tokv = realloc(tokv, ++n * sizeof(*tokv)); Err bitreich.org 70 i+ tokv = realloc(tokv, ++n * sizeof (*tokv)); Err bitreich.org 70 i Err bitreich.org 70 i if (tokv == NULL) Err bitreich.org 70 i die("realloc"); Err bitreich.org 70 i@@ -133,35 +129,15 @@ filter_lines(void) Err bitreich.org 70 i tokv[tokc] = s; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i- matching = 0; Err bitreich.org 70 i+ matchc = 0; Err bitreich.org 70 i for (size_t i = 0; i < linec; i++) Err bitreich.org 70 i- matching += linev[i]->match = match_line(linev[i], tokv, tokc); Err bitreich.org 70 i+ if (match_line(linev[i], tokv, tokc)) Err bitreich.org 70 i+ matchv[matchc++] = linev[i]; Err bitreich.org 70 i Err bitreich.org 70 i free(tokv); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i Err bitreich.org 70 i-int Err bitreich.org 70 i-matching_prev(int pos) Err bitreich.org 70 i-{ Err bitreich.org 70 i- for (int i = pos - 1; i >= 0; i--) Err bitreich.org 70 i- if (linev[i]->match) Err bitreich.org 70 i- return i; Err bitreich.org 70 i- return pos; Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i- Err bitreich.org 70 i-int Err bitreich.org 70 i-matching_next(size_t pos) Err bitreich.org 70 i-{ Err bitreich.org 70 i- for (size_t i = pos + 1; i < linec; i++) Err bitreich.org 70 i- if (linev[i]->match) Err bitreich.org 70 i- return i; Err bitreich.org 70 i- Err bitreich.org 70 i- return pos; Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i- Err bitreich.org 70 i size_t Err bitreich.org 70 i print_string(char *str, size_t limit, int current) Err bitreich.org 70 i { Err bitreich.org 70 i@@ -194,12 +170,9 @@ print_lines(size_t count, size_t cols) Err bitreich.org 70 i Err bitreich.org 70 i offset = current / count * count; Err bitreich.org 70 i Err bitreich.org 70 i- for (size_t i = offset; printed < count && i < linec; i++) { Err bitreich.org 70 i- if (linev[i]->match) { Err bitreich.org 70 i- fputc('\n', stderr); Err bitreich.org 70 i- print_string(linev[i]->text, cols, i == current); Err bitreich.org 70 i- printed++; Err bitreich.org 70 i- } Err bitreich.org 70 i+ for (size_t i = offset; i < count && i < matchc; i++) { Err bitreich.org 70 i+ fputc('\n', stderr); Err bitreich.org 70 i+ print_string(matchv[i], cols, i == current); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i while (printed++ < count) Err bitreich.org 70 i@@ -212,10 +185,8 @@ print_columns(size_t cols) Err bitreich.org 70 i { Err bitreich.org 70 i size_t col = 30; Err bitreich.org 70 i Err bitreich.org 70 i- for (size_t i = offset; col < cols && i < linec; i++) { Err bitreich.org 70 i- if (linev[i]->match) Err bitreich.org 70 i- col += print_string(linev[i]->text, cols - col, i == current); Err bitreich.org 70 i- } Err bitreich.org 70 i+ for (size_t i = offset; col < cols && i < matchc; i++) Err bitreich.org 70 i+ col += print_string(matchv[i], cols - col, i == current); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i Err bitreich.org 70 i@@ -292,7 +263,7 @@ add_character(char key) Err bitreich.org 70 i Err bitreich.org 70 i filter_lines(); Err bitreich.org 70 i Err bitreich.org 70 i- current = linec == 0 || linev[0]->match ? 0 : matching_next(0); Err bitreich.org 70 i+ current = 0; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i Err bitreich.org 70 i@@ -304,8 +275,8 @@ print_selection(void) Err bitreich.org 70 i { Err bitreich.org 70 i fputs("\r\033[K", stderr); Err bitreich.org 70 i Err bitreich.org 70 i- if (matching > 0) { Err bitreich.org 70 i- puts(linev[current]->text); Err bitreich.org 70 i+ if (matchc > 0) { Err bitreich.org 70 i+ puts(matchv[current]); Err bitreich.org 70 i } else { Err bitreich.org 70 i puts(input); Err bitreich.org 70 i } Err bitreich.org 70 i@@ -341,20 +312,20 @@ 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(); Err bitreich.org 70 i- current = linec == 0 || linev[0]->match ? 0 : matching_next(0); Err bitreich.org 70 i+ current = 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- current = matching_next(current); Err bitreich.org 70 i+ current += current <= matchc - 1 ? 1 : 0; Err bitreich.org 70 i break; Err bitreich.org 70 i Err bitreich.org 70 i case CONTROL('P'): Err bitreich.org 70 i- current = matching_prev(current); Err bitreich.org 70 i+ current -= current > 0 ? 1 : 0; 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 if (linec > 0) Err bitreich.org 70 i- strcpy(input, linev[current]->text); Err bitreich.org 70 i+ strcpy(input, matchv[current]); Err bitreich.org 70 i filter_lines(); Err bitreich.org 70 i break; Err bitreich.org 70 i Err bitreich.org 70 i@@ -435,7 +406,8 @@ main(int argc, char *argv[]) Err bitreich.org 70 i Err bitreich.org 70 i print_clear(opt_lines); Err bitreich.org 70 i close(tty_fd); Err bitreich.org 70 i- free_linev(linev); Err bitreich.org 70 i+ free_v(linev, linec); Err bitreich.org 70 i+ free(matchv); Err bitreich.org 70 i Err bitreich.org 70 i return exit_code; Err bitreich.org 70 i } Err bitreich.org 70 .