ii managed the btty file with less open/close. - iomenu - interactive terminal-based selection menu
(HTM) git clone git://bitreich.org/iomenu git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/iomenu
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) Tags
(DIR) README
(DIR) LICENSE
---
(DIR) commit 601965c26a8164917e4b817273a5af3c901bc98f
(DIR) parent 70864688887921021de8ce2b803fdd4206214cda
(HTM) Author: Josuah Demangeonā ā µ <mail@josuah.net>
Date: Sun, 19 Mar 2017 17:19:49 +0100
ii
managed the btty file with less open/close.
Diffstat:
M iomenu.c | 67 ++++++++++++++++++-------------
1 file changed, 39 insertions(+), 28 deletions(-)
---
(DIR) diff --git a/iomenu.c b/iomenu.c
@@ -19,6 +19,8 @@
static struct winsize winsize;
static struct termios termios;
+FILE *tty_fp = NULL;
+int tty_fd;
static char input[BUFSIZ];
static int current = 0, offset = 0, prev = 0, next = 0;
@@ -29,35 +31,43 @@ static int opt_lines = 0;
static void
-free_v(char **v, int c)
+free_all(void)
{
- for (; c > 0; c--)
- free(v[c - 1]);
-
- free(v);
+ if (linev) {
+ for (; linec > 0; linec--)
+ free(linev[linec - 1]);
+ free(linev);
+ }
+ if (matchv)
+ free(matchv);
}
static void
die(const char *s)
{
- /* tcsetattr(STDIN_FILENO, TCSANOW, &termio_old); */
- fprintf(stderr, "%s\n", s);
+ tcsetattr(tty_fd, TCSANOW, &termios);
+ fclose(tty_fp);
+ close(tty_fd);
+ free_all();
+ perror(s);
exit(EXIT_FAILURE);
}
static void
-set_terminal(int tty_fd)
+set_terminal(void)
{
- if (tcgetattr(tty_fd, &termios) < 0) {
+ struct termios new;
+
+ if (tcgetattr(tty_fd, &termios) < 0 || tcgetattr(tty_fd, &new) < 0) {
perror("tcgetattr");
exit(EXIT_FAILURE);
}
- termios.c_lflag &= ~(ICANON | ECHO | IGNBRK);
+ new.c_lflag &= ~(ICANON | ECHO | IGNBRK);
- tcsetattr(tty_fd, TCSANOW, &termios);
+ tcsetattr(tty_fd, TCSANOW, &new);
}
@@ -178,7 +188,7 @@ print_columns(void)
static void
-print_screen(int tty_fd)
+print_screen(void)
{
int count;
@@ -292,7 +302,7 @@ print_selection(void)
* Perform action associated with key
*/
static int
-input_key(FILE *tty_fp)
+input_key(void)
{
char key = fgetc(tty_fp);
@@ -348,21 +358,18 @@ input_key(FILE *tty_fp)
* Listen for the user input and call the appropriate functions.
*/
static int
-input_get(int tty_fd)
+input_get(void)
{
- FILE *tty_fp = fopen("/dev/tty", "r");
int exit_code;
input[0] = '\0';
- set_terminal(tty_fd);
+ set_terminal();
- while ((exit_code = input_key(tty_fp)) == CONTINUE)
- print_screen(tty_fd);
+ while ((exit_code = input_key()) == CONTINUE)
+ print_screen();
- set_terminal(tty_fd);
-
- fclose(tty_fp);
+ tcsetattr(tty_fd, TCSANOW, &termios);
return exit_code;
}
@@ -380,9 +387,9 @@ usage(void)
int
main(int argc, char *argv[])
{
- int i, exit_code, tty_fd = open("/dev/tty", O_RDWR);
+ int exit_code;
- for (i = 1; i < argc; i++) {
+ for (int i = 1; i < argc; i++) {
if (argv[i][0] != '-' || strlen(argv[i]) != 2)
usage();
@@ -403,13 +410,17 @@ main(int argc, char *argv[])
read_lines();
- print_screen(tty_fd);
- exit_code = input_get(tty_fd);
+ tty_fp = fopen("/dev/tty", "r");
+ tty_fd = open("/dev/tty", O_RDWR);
+ print_screen();
+ exit_code = input_get();
+
+ tcsetattr(tty_fd, TCSANOW, &termios);
print_clear(opt_lines);
- close(tty_fd);
- free_v(linev, linec);
- free(matchv);
+ fclose(tty_fp);
+ close(tty_fd);
+ free_all();
return exit_code;
}