SMOLNET PORTAL home about changes
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
Original URLgopher://bitreich.org/0/scm/iomenu/commit/33e51a893ff428e...
Content-Typetext/plain; charset=utf-8