int saved_argc = 0;
char **saved_argv = NULL;
-static int parsed_columns = 0;
+static volatile unsigned cached_columns = 0;
+static volatile unsigned cached_lines = 0;
size_t page_size(void) {
static __thread size_t pgsz = 0;
}
int ask(char *ret, const char *replies, const char *text, ...) {
- bool on_tty;
assert(ret);
assert(replies);
assert(text);
- on_tty = isatty(STDOUT_FILENO);
-
for (;;) {
va_list ap;
char c;
int r;
bool need_nl = true;
- if (on_tty)
+ if (on_tty())
fputs(ANSI_HIGHLIGHT_ON, stdout);
va_start(ap, text);
vprintf(text, ap);
va_end(ap);
- if (on_tty)
+ if (on_tty())
fputs(ANSI_HIGHLIGHT_OFF, stdout);
fflush(stdout);
return ws.ws_col;
}
-static unsigned columns_cached(bool cached) {
- static __thread int env_columns = -1;
+unsigned columns(void) {
const char *e;
+ unsigned c;
- if (_likely_(parsed_columns > 0 && cached))
- return parsed_columns;
-
- if (_unlikely_(env_columns == -1)) {
- e = getenv("COLUMNS");
- if (e)
- env_columns = atoi(e);
- else
- env_columns = 0;
- }
-
- if (env_columns > 0) {
- parsed_columns = env_columns;
- return parsed_columns;
- }
-
- if (parsed_columns <= 0 || !cached)
- parsed_columns = fd_columns(STDOUT_FILENO);
+ if (_likely_(cached_columns > 0))
+ return cached_columns;
- if (parsed_columns <= 0)
- parsed_columns = 80;
+ c = 0;
+ e = getenv("COLUMNS");
+ if (e)
+ safe_atou(e, &c);
- return parsed_columns;
-}
+ if (c <= 0)
+ c = fd_columns(STDOUT_FILENO);
-unsigned columns(void) {
- return columns_cached(true);
-}
+ if (c <= 0)
+ c = 80;
-unsigned columns_uncached(void) {
- return columns_cached(false);
-}
-
-/* intended to be used as a SIGWINCH sighandler */
-void columns_cache_reset(int signum) {
- parsed_columns = 0;
+ cached_columns = c;
+ return c;
}
int fd_lines(int fd) {
}
unsigned lines(void) {
- static __thread int parsed_lines = 0;
const char *e;
+ unsigned l;
- if (_likely_(parsed_lines > 0))
- return parsed_lines;
+ if (_likely_(cached_lines > 0))
+ return cached_lines;
+ l = 0;
e = getenv("LINES");
if (e)
- parsed_lines = atoi(e);
+ safe_atou(e, &l);
+
+ if (l <= 0)
+ l = fd_lines(STDOUT_FILENO);
+
+ if (l <= 0)
+ l = 24;
+
+ cached_lines = l;
+ return cached_lines;
+}
+
+/* intended to be used as a SIGWINCH sighandler */
+void columns_lines_cache_reset(int signum) {
+ cached_columns = 0;
+ cached_lines = 0;
+}
- if (parsed_lines <= 0)
- parsed_lines = fd_lines(STDOUT_FILENO);
+bool on_tty(void) {
+ static int cached_on_tty = -1;
- if (parsed_lines <= 0)
- parsed_lines = 25;
+ if (_unlikely_(cached_on_tty < 0))
+ cached_on_tty = isatty(STDOUT_FILENO) > 0;
- return parsed_lines;
+ return cached_on_tty;
}
int running_in_chroot(void) {
assert(p);
for (t = p; *t; t++) {
- if (*t < ' ')
+ if (*t > 0 && *t < ' ')
return false;
if (strchr("\\\"\'", *t))