From 8132305e54d45dbad65bf9ef6f6c5805c841d1da Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Fri, 5 Jun 2015 15:58:00 +0200 Subject: Initial commit Signed-off-by: Jason A. Donenfeld --- src/terminal.c | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 src/terminal.c (limited to 'src/terminal.c') diff --git a/src/terminal.c b/src/terminal.c new file mode 100644 index 0000000..74d04c2 --- /dev/null +++ b/src/terminal.c @@ -0,0 +1,79 @@ +/* Copyright 2015-2016 Jason A. Donenfeld . All Rights Reserved. */ + +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include +#include + +static bool color_mode(FILE *file) +{ + static int mode = -1; + char *var; + if (mode != -1) + return mode; + var = getenv("WG_COLOR_MODE"); + if (var && !strcmp(var, "always")) + mode = true; + else if (var && !strcmp(var, "never")) + mode = false; + else + return isatty(fileno(file)); + return mode; +} + +static void filter_ansi(FILE *file, const char *fmt, va_list args) +{ + char *str = NULL; + size_t len, i, j; + + if (color_mode(file)) { + vfprintf(file, fmt, args); + return; + } + + len = vasprintf(&str, fmt, args); + + if (len >= 2) { + for (i = 0; i < len - 2; ++i) { + if (str[i] == '\x1b' && str[i + 1] == '[') { + str[i] = str[i + 1] = '\0'; + for (j = i + 2; j < len; ++j) { + if (isalpha(str[j])) + break; + str[j] = '\0'; + } + str[j] = '\0'; + } + } + } + for (i = 0; i < len; i = j) { + fputs(&str[i], file); + for (j = i + strlen(&str[i]); j < len; ++j) { + if (str[j] != '\0') + break; + } + } + + free(str); +} + +void terminal_printf(const char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + filter_ansi(stdout, fmt, args); + va_end(args); +} + +void terminal_fprintf(FILE *file, const char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + filter_ansi(file, fmt, args); + va_end(args); +} -- cgit v1.2.3-59-g8ed1b