X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=con.c;h=a784ab7338cfe82be1b95628e1824b4f9b900b4e;hb=baf69f3725f8eef6a7a34ef4c94264f7daecb9f5;hp=bfe3a23c72650a60b7285f3eaba6618e2a1ede4c;hpb=0b8da9eeb4954dd334d5bac4526f42f837c60798;p=xonotic%2Fgmqcc.git diff --git a/con.c b/con.c index bfe3a23..a784ab7 100644 --- a/con.c +++ b/con.c @@ -30,8 +30,8 @@ #include #endif -#define GMQCC_IS_STDOUT(X) ((X) == stdout) -#define GMQCC_IS_STDERR(X) ((X) == stderr) +#define GMQCC_IS_STDOUT(X) ((FILE*)((void*)X) == stdout) +#define GMQCC_IS_STDERR(X) ((FILE*)((void*)X) == stderr) #define GMQCC_IS_DEFINE(X) (GMQCC_IS_STDERR(X) || GMQCC_IS_STDOUT(X)) typedef struct { @@ -271,16 +271,20 @@ void con_reset() { int con_change(const char *out, const char *err) { con_close(); - if (GMQCC_IS_DEFINE((FILE*)out)) { - console.handle_out = (((FILE*)err) == stdout) ? stdout : stderr; + if (GMQCC_IS_DEFINE(out)) { + console.handle_out = GMQCC_IS_STDOUT(out) ? stdout : stderr; con_enablecolor(); } else if (!(console.handle_out = fopen(out, "w"))) return 0; - if (GMQCC_IS_DEFINE((FILE*)err)) { - console.handle_err = (((FILE*)err) == stdout) ? stdout : stderr; + if (GMQCC_IS_DEFINE(err)) { + console.handle_err = GMQCC_IS_STDOUT(err) ? stdout : stderr; con_enablecolor(); } else if (!(console.handle_err = fopen(err, "w"))) return 0; + // no buffering + setvbuf(console.handle_out, NULL, _IONBF, 0); + setvbuf(console.handle_err, NULL, _IONBF, 0); + return 1; } @@ -324,18 +328,19 @@ void con_vprintmsg(int level, const char *name, size_t line, const char *msgtype CON_CYAN, CON_RED }; - - int err = !!(level == LVL_ERROR); - int color = (err) ? console.color_err : console.color_out; - int (*print)(const char *, ...) = (err) ? &con_err : &con_out; - + + int err = !!(level == LVL_ERROR); + int color = (err) ? console.color_err : console.color_out; + int (*print)(const char *, ...) = (err) ? &con_err : &con_out; + int (*vprint)(const char *, va_list) = (err) ? &con_verr : &con_vout; + if (color) print("\033[0;%dm%s:%d: \033[0;%dm%s: \033[0m", CON_CYAN, name, (int)line, sel[level], msgtype); else print("%s:%d: %s: ", name, (int)line, msgtype); - - con_verr(msg, ap); - fprintf (stderr, "\n"); + + vprint(msg, ap); + print("\n"); } void con_printmsg(int level, const char *name, size_t line, const char *msgtype, const char *msg, ...) {