From 26e7b5ece4b8b0440048759bc49f3b357a4c4c45 Mon Sep 17 00:00:00 2001 From: Rob Landley Date: Thu, 2 Feb 2012 07:27:35 -0600 Subject: Quick and dirty terminal_size() and yesno() functions, both of which need to be improved. --- lib/lib.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++++++- lib/lib.h | 3 +++ 2 files changed, 53 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/lib.c b/lib/lib.c index 82e32aee..a71e20a6 100644 --- a/lib/lib.c +++ b/lib/lib.c @@ -174,7 +174,8 @@ void xexec(char **argv) { toy_exec(argv); execvp(argv[0], argv); - error_exit("No %s", argv[0]); + + perror_exit("exec %s", argv[0]); } void xaccess(char *path, int flags) @@ -756,3 +757,51 @@ void crc_init(unsigned int *crc_table, int little_endian) crc_table[i] = c; } } + +// Quick and dirty query size of terminal, doesn't do ANSI probe fallback. +// set *x=0 and *y=0 before calling to detect failure to set either, or +// x=80 y=25 to provide defaults + +void terminal_size(unsigned *x, unsigned *y) +{ + struct winsize ws; + int i; + + //memset(&ws, 0, sizeof(ws)); + for (i=0; i<3; i++) { + if (ioctl(i, TIOCGWINSZ, &ws)) continue; + if (x) *x = ws.ws_col; + if (y) *y = ws.ws_row; + } + if (x) { + char *s = getenv("COLUMNS"); + + i = s ? atoi(s) : 0; + if (i>0) *x = i; + } + if (y) { + char *s = getenv("ROWS"); + + i = s ? atoi(s) : 0; + if (i>0) *y = i; + } +} + +// This should use a raw tty, fixit later. +int yesno(int def) +{ + char buf[16]; + int i; + + for (i=0; i<3 && !isatty(i); i++); + if (i == 3) return 1; + + sprintf(buf, "(%c/%c):", def ? 'Y' : 'y', def ? 'n' : 'N'); + write(i, buf, 6); + while (read(i, buf, 1)) { + if (isspace(*buf)) break; + if (tolower(*buf) == 'y') return 1; + if (tolower(*buf) == 'n') return 0; + } + return def; +} diff --git a/lib/lib.h b/lib/lib.h index 6880462e..b7f250b8 100644 --- a/lib/lib.h +++ b/lib/lib.h @@ -108,6 +108,9 @@ int copy_tempfile(int fdin, char *name, char **tempname); void delete_tempfile(int fdin, int fdout, char **tempname); void replace_tempfile(int fdin, int fdout, char **tempname); void crc_init(unsigned int *crc_table, int little_endian); +void terminal_size(unsigned *x, unsigned *y); +int yesno(int def); + // getmountlist.c struct mtab_list { -- cgit v1.2.3