isplit main argument parsing in another function - 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 33e51a893ff428e83faf59b5116dde88e3f83c50 /scm/iomenu/commit/33e51a893ff428e83faf59b5116dde88e3f83c50.gph bitreich.org 70
1parent abf6f97c75cc29af910c1031397854c40b5c5f09 /scm/iomenu/commit/abf6f97c75cc29af910c1031397854c40b5c5f09.gph bitreich.org 70
hAuthor: Josuah Demangeon <josuah.demangeon@gandi.net> URL:mailto:josuah.demangeon@gandi.net bitreich.org 70
iDate: Mon, 21 Aug 2017 02:48:22 +0200 Err bitreich.org 70
i Err bitreich.org 70
isplit main argument parsing in another function Err bitreich.org 70
i Err bitreich.org 70
iDiffstat: Err bitreich.org 70
i M iomenu.c | 149 ++++++++++++++----------------- Err bitreich.org 70
i Err bitreich.org 70
i1 file changed, 69 insertions(+), 80 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@@ -27,7 +27,7 @@ static int opt[128]; Err bitreich.org 70
i static char *prompt = ""; Err bitreich.org 70
i Err bitreich.org 70
i static void Err bitreich.org 70
i-free_all(void) Err bitreich.org 70
i+freelines(void) Err bitreich.org 70
i { Err bitreich.org 70
i if (linev) { Err bitreich.org 70
i for (; linec > 0; linec--) Err bitreich.org 70
i@@ -43,18 +43,18 @@ die(const char *s) Err bitreich.org 70
i { Err bitreich.org 70
i tcsetattr(ttyfd, TCSANOW, &termios); Err bitreich.org 70
i close(ttyfd); Err bitreich.org 70
i- free_all(); Err bitreich.org 70
i+ freelines(); Err bitreich.org 70
i perror(s); Err bitreich.org 70
i exit(EXIT_FAILURE); Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i static void Err bitreich.org 70
i-set_terminal(void) Err bitreich.org 70
i+setterminal(void) Err bitreich.org 70
i { Err bitreich.org 70
i struct termios new; Err bitreich.org 70
i Err bitreich.org 70
i /* save cursor postition */ Err bitreich.org 70
i- fputs("\033[s", stderr); Err bitreich.org 70
i+ fputs("\x1b[s", stderr); Err bitreich.org 70
i Err bitreich.org 70
i /* save attributes to `termios` */ Err bitreich.org 70
i if (tcgetattr(ttyfd, &termios) < 0 || tcgetattr(ttyfd, &new) < 0) { Err bitreich.org 70
i@@ -68,23 +68,23 @@ set_terminal(void) Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i static void Err bitreich.org 70
i-reset_terminal(void) Err bitreich.org 70
i+resetterminal(void) Err bitreich.org 70
i { Err bitreich.org 70
i int i; Err bitreich.org 70
i Err bitreich.org 70
i /* clear terminal */ Err bitreich.org 70
i for (i = 0; i < opt['l'] + 1; i++) Err bitreich.org 70
i- fputs("\r\033[K\n", stderr); Err bitreich.org 70
i+ fputs("\r\x1b[K\n", stderr); Err bitreich.org 70
i Err bitreich.org 70
i /* reset cursor position */ Err bitreich.org 70
i- fputs("\033[u", stderr); Err bitreich.org 70
i+ fputs("\x1b[u", stderr); Err bitreich.org 70
i Err bitreich.org 70
i /* set terminal back to normal mode */ Err bitreich.org 70
i tcsetattr(ttyfd, TCSANOW, &termios); Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i static void Err bitreich.org 70
i-read_lines(void) Err bitreich.org 70
i+readlines(void) Err bitreich.org 70
i { Err bitreich.org 70
i char buffer[BUFSIZ]; Err bitreich.org 70
i int size = 1 << 6; Err bitreich.org 70
i@@ -96,7 +96,7 @@ read_lines(void) 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+ /* read the file into an array of lines as the lines never change */ Err bitreich.org 70
i for (; fgets(buffer, sizeof buffer, stdin); linec++, matchc++) { Err bitreich.org 70
i int len = strlen(buffer); Err bitreich.org 70
i Err bitreich.org 70
i@@ -145,62 +145,60 @@ format(char *str, int cols) Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i static void Err bitreich.org 70
i-print_lines(int count) Err bitreich.org 70
i+printlines(int count) Err bitreich.org 70
i { Err bitreich.org 70
i int printed = 0, i = current / count * count; Err bitreich.org 70
i Err bitreich.org 70
i while (printed < count && i < matchc) { Err bitreich.org 70
i- char *s = format(matchv[i], ws.ws_col - 1); Err bitreich.org 70
i Err bitreich.org 70
i if (opt['#'] && matchv[i][0] == '#') { Err bitreich.org 70
i- fprintf(stderr, "\n\033[1m\033[K %s\033[m", s); Err bitreich.org 70
i+ char *s = format(matchv[i], ws.ws_col); Err bitreich.org 70
i+ fprintf(stderr, "\n\x1b[1m\x1b[K%s\x1b[m", s + 1); Err bitreich.org 70
i+ Err bitreich.org 70
i } else if (i == current) { Err bitreich.org 70
i- fprintf(stderr, "\n\033[30;47m\033[K %s\033[m", s); Err bitreich.org 70
i+ char *s = format(matchv[i], ws.ws_col - 3); Err bitreich.org 70
i+ fprintf(stderr, "\n\x1b[30;47m\x1b[K %s\x1b[m", s); Err bitreich.org 70
i+ Err bitreich.org 70
i } else { Err bitreich.org 70
i- fprintf(stderr, "\n\033[K %s\033[m", s); Err bitreich.org 70
i+ char *s = format(matchv[i], ws.ws_col - 3); Err bitreich.org 70
i+ fprintf(stderr, "\n\x1b[K %s", s); Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i i++; printed++; Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i while (printed++ < count) Err bitreich.org 70
i- fputs("\n\033[K", stderr); Err bitreich.org 70
i+ fputs("\n\x1b[K", stderr); Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i static void Err bitreich.org 70
i-print_screen(void) Err bitreich.org 70
i+printscreen(void) Err bitreich.org 70
i { Err bitreich.org 70
i int cols = ws.ws_col - 1, i; Err bitreich.org 70
i int count = MIN(opt['l'], ws.ws_row - 1); Err bitreich.org 70
i Err bitreich.org 70
i- fputs("\r\033[K", stderr); Err bitreich.org 70
i+ fputs("\r\x1b[K", stderr); Err bitreich.org 70
i Err bitreich.org 70
i- /* items */ Err bitreich.org 70
i- print_lines(count); Err bitreich.org 70
i- fprintf(stderr, "\033[%dA", count); Err bitreich.org 70
i+ printlines(count); Err bitreich.org 70
i+ fprintf(stderr, "\x1b[%dA\r", count); Err bitreich.org 70
i Err bitreich.org 70
i- fputs("\r", stderr); Err bitreich.org 70
i- Err bitreich.org 70
i- /* prompt */ Err bitreich.org 70
i if (*prompt) { Err bitreich.org 70
i format(prompt, cols); Err bitreich.org 70
i- fputs("\033[30;47m ", stderr); Err bitreich.org 70
i+ fputs("\x1b[30;47m ", stderr); Err bitreich.org 70
i for (i = 0; formatted[i]; i++) Err bitreich.org 70
i fputc(formatted[i], stderr); Err bitreich.org 70
i- fputs(" \033[m", stderr); Err bitreich.org 70
i+ fputs(" \x1b[m", stderr); Err bitreich.org 70
i cols -= strlen(formatted) + 1; Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i fputc(' ', stderr); Err bitreich.org 70
i- Err bitreich.org 70
i- /* input */ Err bitreich.org 70
i fputs(format(input, cols), stderr); Err bitreich.org 70
i Err bitreich.org 70
i fflush(stderr); Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i static int Err bitreich.org 70
i-match_line(char *line, char **tokv, int tokc) Err bitreich.org 70
i+matchline(char *line, char **tokv, int tokc) Err bitreich.org 70
i { Err bitreich.org 70
i if (opt['#'] && line[0] == '#') Err bitreich.org 70
i return 2; Err bitreich.org 70
i@@ -213,7 +211,7 @@ match_line(char *line, char **tokv, int tokc) Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i static void Err bitreich.org 70
i-move_line(signed int n) Err bitreich.org 70
i+move(signed int n) Err bitreich.org 70
i { Err bitreich.org 70
i int i; Err bitreich.org 70
i Err bitreich.org 70
i@@ -226,7 +224,7 @@ move_line(signed int n) Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i static void Err bitreich.org 70
i-filter_lines(void) Err bitreich.org 70
i+filter(void) Err bitreich.org 70
i { Err bitreich.org 70
i char **tokv = NULL, *s, buffer[sizeof (input)]; Err bitreich.org 70
i int tokc = 0, n = 0, i; Err bitreich.org 70
i@@ -249,17 +247,17 @@ filter_lines(void) Err bitreich.org 70
i Err bitreich.org 70
i matchc = 0; Err bitreich.org 70
i for (i = 0; i < linec; i++) Err bitreich.org 70
i- if (match_line(linev[i], tokv, tokc)) Err bitreich.org 70
i+ if (matchline(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 if (opt['#'] && matchv[current][0] == '#') Err bitreich.org 70
i- move_line(+1); Err bitreich.org 70
i+ move(+1); Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i static void Err bitreich.org 70
i-remove_word_input() Err bitreich.org 70
i+removeword() Err bitreich.org 70
i { Err bitreich.org 70
i int len = strlen(input) - 1, i; Err bitreich.org 70
i Err bitreich.org 70
i@@ -270,11 +268,11 @@ remove_word_input() Err bitreich.org 70
i for (i = len; i >= 0 && !isspace(input[i]); i--) Err bitreich.org 70
i input[i] = '\0'; Err bitreich.org 70
i Err bitreich.org 70
i- filter_lines(); Err bitreich.org 70
i+ filter(); Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i static void Err bitreich.org 70
i-add_character(char key) Err bitreich.org 70
i+addchar(char key) Err bitreich.org 70
i { Err bitreich.org 70
i int len = strlen(input); Err bitreich.org 70
i Err bitreich.org 70
i@@ -283,11 +281,11 @@ add_character(char key) Err bitreich.org 70
i input[len + 1] = '\0'; Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i- filter_lines(); Err bitreich.org 70
i+ filter(); Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i static void Err bitreich.org 70
i-print_selection(void) Err bitreich.org 70
i+printselection(void) Err bitreich.org 70
i { Err bitreich.org 70
i /* header */ Err bitreich.org 70
i if (opt['#']) { Err bitreich.org 70
i@@ -310,11 +308,11 @@ print_selection(void) Err bitreich.org 70
i puts(matchv[current]); Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i- fputs("\r\033[K", stderr); Err bitreich.org 70
i+ fputs("\r\x1b[K", stderr); Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i static int Err bitreich.org 70
i-input_key(void) Err bitreich.org 70
i+key(void) Err bitreich.org 70
i { Err bitreich.org 70
i int key = fgetc(stdin); Err bitreich.org 70
i Err bitreich.org 70
i@@ -326,81 +324,63 @@ top: Err bitreich.org 70
i Err bitreich.org 70
i case CONTROL('U'): Err bitreich.org 70
i input[0] = '\0'; Err bitreich.org 70
i- filter_lines(); Err bitreich.org 70
i+ filter(); Err bitreich.org 70
i break; Err bitreich.org 70
i Err bitreich.org 70
i case CONTROL('W'): Err bitreich.org 70
i- remove_word_input(); Err bitreich.org 70
i+ removeword(); Err bitreich.org 70
i break; Err bitreich.org 70
i Err bitreich.org 70
i case 127: 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+ filter(); Err bitreich.org 70
i break; Err bitreich.org 70
i Err bitreich.org 70
i case CONTROL('N'): Err bitreich.org 70
i- move_line(+1); Err bitreich.org 70
i+ move(+1); Err bitreich.org 70
i break; Err bitreich.org 70
i Err bitreich.org 70
i case CONTROL('P'): Err bitreich.org 70
i- move_line(-1); Err bitreich.org 70
i+ move(-1); Err bitreich.org 70
i break; Err bitreich.org 70
i Err bitreich.org 70
i case CONTROL('V'): Err bitreich.org 70
i- move_line(ws.ws_row - 1); Err bitreich.org 70
i+ move(ws.ws_row - 1); Err bitreich.org 70
i break; Err bitreich.org 70
i Err bitreich.org 70
i case ALT('v'): Err bitreich.org 70
i- move_line(-ws.ws_row + 1); Err bitreich.org 70
i+ move(-ws.ws_row + 1); 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, matchv[current]); Err bitreich.org 70
i- filter_lines(); Err bitreich.org 70
i+ filter(); Err bitreich.org 70
i break; Err bitreich.org 70
i Err bitreich.org 70
i case CONTROL('J'): /* enter */ Err bitreich.org 70
i case CONTROL('M'): Err bitreich.org 70
i- print_selection(); Err bitreich.org 70
i+ printselection(); Err bitreich.org 70
i return EXIT_SUCCESS; Err bitreich.org 70
i Err bitreich.org 70
i- case 033: /* escape / alt */ Err bitreich.org 70
i+ case 0x1b: /* escape / alt */ Err bitreich.org 70
i key = ALT(fgetc(stdin)); Err bitreich.org 70
i goto top; Err bitreich.org 70
i Err bitreich.org 70
i default: Err bitreich.org 70
i- add_character((char) key); Err bitreich.org 70
i+ addchar((char) key); Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i return CONTINUE; Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i-/* Err bitreich.org 70
i- * Listen for the user input and call the appropriate functions. Err bitreich.org 70
i- */ Err bitreich.org 70
i-static int Err bitreich.org 70
i-input_get(void) Err bitreich.org 70
i-{ Err bitreich.org 70
i- int exit_code; 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()) == CONTINUE) Err bitreich.org 70
i- print_screen(); Err bitreich.org 70
i- Err bitreich.org 70
i- tcsetattr(ttyfd, TCSANOW, &termios); Err bitreich.org 70
i- Err bitreich.org 70
i- return exit_code; Err bitreich.org 70
i-} Err bitreich.org 70
i- Err bitreich.org 70
i static void Err bitreich.org 70
i sigwinch() Err bitreich.org 70
i { Err bitreich.org 70
i if (ioctl(ttyfd, TIOCGWINSZ, &ws) < 0) Err bitreich.org 70
i die("ioctl"); Err bitreich.org 70
i- print_screen(); Err bitreich.org 70
i+ printscreen(); Err bitreich.org 70
i Err bitreich.org 70
i signal(SIGWINCH, sigwinch); Err bitreich.org 70
i } Err bitreich.org 70
i@@ -412,11 +392,9 @@ usage(void) Err bitreich.org 70
i exit(EXIT_FAILURE); Err bitreich.org 70
i } Err bitreich.org 70
i Err bitreich.org 70
i-int Err bitreich.org 70
i-main(int argc, char *argv[]) Err bitreich.org 70
i+static void Err bitreich.org 70
i+parseopt(int argc, char *argv[]) Err bitreich.org 70
i { Err bitreich.org 70
i- int exit_code; Err bitreich.org 70
i- Err bitreich.org 70
i memset(opt, 0, 128 * sizeof (int)); Err bitreich.org 70
i Err bitreich.org 70
i opt['l'] = 255; Err bitreich.org 70
i@@ -446,22 +424,33 @@ main(int argc, char *argv[]) Err bitreich.org 70
i usage(); 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- setlocale(LC_ALL, ""); Err bitreich.org 70
i- read_lines(); Err bitreich.org 70
i- filter_lines(); Err bitreich.org 70
i+int Err bitreich.org 70
i+main(int argc, char *argv[]) Err bitreich.org 70
i+{ Err bitreich.org 70
i+ int exitcode; Err bitreich.org 70
i+ Err bitreich.org 70
i+ parseopt(argc, argv); Err bitreich.org 70
i+ Err bitreich.org 70
i+ readlines(); Err bitreich.org 70
i+ filter(); Err bitreich.org 70
i Err bitreich.org 70
i if (!freopen("/dev/tty", "r", stdin) || Err bitreich.org 70
i !freopen("/dev/tty", "w", stderr)) Err bitreich.org 70
i die("freopen"); Err bitreich.org 70
i ttyfd = open("/dev/tty", O_RDWR); Err bitreich.org 70
i Err bitreich.org 70
i- set_terminal(); Err bitreich.org 70
i+ setterminal(); Err bitreich.org 70
i sigwinch(); Err bitreich.org 70
i- exit_code = input_get(); /* main loop */ Err bitreich.org 70
i- reset_terminal(); Err bitreich.org 70
i+ Err bitreich.org 70
i+ input[0] = '\0'; Err bitreich.org 70
i+ while ((exitcode = key()) == CONTINUE) Err bitreich.org 70
i+ printscreen(); Err bitreich.org 70
i+ Err bitreich.org 70
i+ resetterminal(); Err bitreich.org 70
i close(ttyfd); Err bitreich.org 70
i- freeall(); Err bitreich.org 70
i+ freelines(); Err bitreich.org 70
i Err bitreich.org 70
i return exitcode; Err bitreich.org 70
i } Err bitreich.org 70
.
Response:
text/plain