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 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 .