X-Git-Url: https://git.xonotic.org/?p=xonotic%2Fgmqcc.git;a=blobdiff_plain;f=conout.c;h=bf8b522648802b1b342760fdd81ecb8abfce20f2;hp=3fca6ef76fbdd8a576e85beaec822e700581e704;hb=13003bf6af9cf8c76cd024b0bf11695b92fba093;hpb=0f0a458cc44130ed02161f7fb492372ffa9a00d9 diff --git a/conout.c b/conout.c index 3fca6ef..bf8b522 100644 --- a/conout.c +++ b/conout.c @@ -21,6 +21,7 @@ * SOFTWARE. */ #include "gmqcc.h" +#include /* * isatty/STDERR_FILENO/STDOUT_FILNO @@ -77,7 +78,7 @@ enum { MAGENTA, CYAN, GRAY, - WHITE + WHITE = GRAY }; enum { @@ -90,9 +91,9 @@ enum { WMAGENTA = WBLUE | WRED, WYELLOW = WGREEN | WRED, WWHITE = WBLUE | WGREEN | WRED -} +}; -static const ansi2win[] = { +static const int ansi2win[] = { WBLACK, WRED, WGREEN, @@ -103,20 +104,19 @@ static const ansi2win[] = { WWHITE }; -static void win_fputs(char *str, FILE *h) { +static int win_fputs(const char *str, FILE *h) { /* state for translate */ int acolor; int wcolor; int icolor; int state; - int place; /* attributes */ int intense = -1; int colors[] = {-1, -1 }; int colorpos = 1; - + int length = 0; CONSOLE_SCREEN_BUFFER_INFO cinfo; GetConsoleScreenBufferInfo ( (GMQCC_IS_STDOUT(h)) ? @@ -126,9 +126,9 @@ static void win_fputs(char *str, FILE *h) { icolor = cinfo.wAttributes; while (*str) { - if (*str == '\e') - state = '\e'; - else if (state == '\e' && *str == '[') + if (*str == '\x1B') + state = '\x1B'; + else if (state == '\x1B' && *str == '[') state = '['; else if (state == '[') { if (*str != 'm') { @@ -149,7 +149,7 @@ static void win_fputs(char *str, FILE *h) { intense = WBLACK; wcolor = icolor; } - else if (BLACK < acolor && acolor <= WHITE) + else if (BLACK <= acolor && acolor <= WHITE) wcolor = ansi2win[acolor - 30]; else if (acolor == 90) { /* special gray really white man */ @@ -158,7 +158,7 @@ static void win_fputs(char *str, FILE *h) { } SetConsoleTextAttribute ( - (h == stdout) ? + (GMQCC_IS_STDOUT(h)) ? GetStdHandle(STD_OUTPUT_HANDLE) : GetStdHandle(STD_ERROR_HANDLE), @@ -168,8 +168,10 @@ static void win_fputs(char *str, FILE *h) { state = -1; } } else { - fputc(*str, h); + file_putc(*str, h); + length ++; } + str++; } /* restore */ SetConsoleTextAttribute( @@ -178,6 +180,7 @@ static void win_fputs(char *str, FILE *h) { GetStdHandle(STD_ERROR_HANDLE), icolor ); + return length; } #endif @@ -213,16 +216,10 @@ static int con_write(FILE *handle, const char *fmt, va_list va) { ln = vfprintf(handle, fmt, va); #else { - char *data = NULL; - ln = _vscprintf(fmt, va); - data = malloc(ln + 1); - data[ln] = 0; - vsprintf(data, fmt, va); - if (GMQCC_IS_DEFINE(handle)) - ln = win_fputs(data, handle); - else - ln = fputs(data, handle); - free(data); + char data[4096]; + memset(data, 0, sizeof(data)); + vsnprintf(data, sizeof(data), fmt, va); + ln = (GMQCC_IS_DEFINE(handle)) ? win_fputs(data, handle) : file_puts(data, handle); } #endif return ln; @@ -234,9 +231,9 @@ static int con_write(FILE *handle, const char *fmt, va_list va) { void con_close() { if (!GMQCC_IS_DEFINE(console.handle_err)) - fclose(console.handle_err); + file_close(console.handle_err); if (!GMQCC_IS_DEFINE(console.handle_out)) - fclose(console.handle_out); + file_close(console.handle_out); } void con_color(int state) { @@ -272,15 +269,18 @@ void con_reset() { int con_change(const char *out, const char *err) { con_close(); + if (!out) out = (const char *)((!console.handle_out) ? stdout : console.handle_out); + if (!err) err = (const char *)((!console.handle_err) ? stderr : console.handle_err); + 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; + } else if (!(console.handle_out = file_open(out, "w"))) return 0; 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; + } else if (!(console.handle_err = file_open(err, "w"))) return 0; /* no buffering */ setvbuf(console.handle_out, NULL, _IONBF, 0); @@ -399,16 +399,16 @@ bool GMQCC_WARN vcompile_warning(lex_ctx ctx, int warntype, const char *fmt, va_ warn_name[1] = 'W'; (void)util_strtononcmd(opts_warn_list[warntype].name, warn_name+2, sizeof(warn_name)-2); - if (opts.werror) { + if (OPTS_WERROR(warntype)) { ++compile_errors; lvl = LVL_ERROR; } else ++compile_warnings; - con_vprintmsg_c(lvl, ctx.file, ctx.line, (opts.werror ? "error" : "warning"), fmt, ap, warn_name); + con_vprintmsg_c(lvl, ctx.file, ctx.line, ((lvl == LVL_ERROR) ? "error" : "warning"), fmt, ap, warn_name); - return opts.werror; + return OPTS_WERROR(warntype); } bool GMQCC_WARN compile_warning(lex_ctx ctx, int warntype, const char *fmt, ...)