X-Git-Url: https://git.xonotic.org/?p=xonotic%2Fgmqcc.git;a=blobdiff_plain;f=conout.c;h=dd4dca399dac9bc659c0f67a9e5c5a6f9d547975;hp=eb57d68b69d048d8332d394d99f7de1739514538;hb=69b55ccc03b56af1f6c05eb45866ab198307487f;hpb=3b271076762fe2be2f46efabc42bfc2331965f17 diff --git a/conout.c b/conout.c index eb57d68..dd4dca3 100644 --- a/conout.c +++ b/conout.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2012 + * Copyright (C) 2012, 2013 * Dale Weiler * * Permission is hereby granted, free of charge, to any person obtaining a copy of @@ -54,7 +54,7 @@ typedef struct { * Doing colored output on windows is fucking stupid. The linux way is * the real way. So we emulate it on windows :) */ -#ifdef _MSC_VER +#ifdef _WIN32 #define WIN32_LEAN_AND_MEAN #include @@ -104,13 +104,13 @@ static const int ansi2win[] = { WWHITE }; -static int win_fputs(const char *str, FILE *h) { +static int win_fputs(FILE *h, const char *str) { /* state for translate */ int acolor; int wcolor; int icolor; - int state; + int state = 0; /* attributes */ int intense = -1; @@ -168,7 +168,7 @@ static int win_fputs(const char *str, FILE *h) { state = -1; } } else { - file_putc(*str, h); + fs_file_write(str, 1, 1, stdout); length ++; } str++; @@ -212,14 +212,18 @@ static void con_enablecolor() { */ static int con_write(FILE *handle, const char *fmt, va_list va) { int ln; - #ifndef _MSC_VER + #ifndef _WIN32 ln = vfprintf(handle, fmt, va); #else { char data[4096]; memset(data, 0, sizeof(data)); +#ifdef _MSC_VER + vsnprintf_s(data, sizeof(data), sizeof(data), fmt, va); +#else vsnprintf(data, sizeof(data), fmt, va); - ln = (GMQCC_IS_DEFINE(handle)) ? win_fputs(data, handle) : file_puts(data, handle); +#endif + ln = (GMQCC_IS_DEFINE(handle)) ? win_fputs(handle, data) : fs_file_puts(handle, data); } #endif return ln; @@ -231,9 +235,9 @@ static int con_write(FILE *handle, const char *fmt, va_list va) { void con_close() { if (!GMQCC_IS_DEFINE(console.handle_err)) - file_close(console.handle_err); + fs_file_close(console.handle_err); if (!GMQCC_IS_DEFINE(console.handle_out)) - file_close(console.handle_out); + fs_file_close(console.handle_out); } void con_color(int state) { @@ -275,16 +279,12 @@ int con_change(const char *out, const char *err) { if (GMQCC_IS_DEFINE(out)) { console.handle_out = GMQCC_IS_STDOUT(out) ? stdout : stderr; con_enablecolor(); - } else if (!(console.handle_out = file_open(out, "w"))) return 0; + } else if (!(console.handle_out = fs_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 = file_open(err, "w"))) return 0; - - /* no buffering */ - setvbuf(console.handle_out, NULL, _IONBF, 0); - setvbuf(console.handle_err, NULL, _IONBF, 0); + } else if (!(console.handle_err = fs_file_open(err, "w"))) return 0; return 1; } @@ -292,12 +292,12 @@ int con_change(const char *out, const char *err) { /* * Defaultizer because stdio.h shouldn't be used anywhere except here * and inside file.c To prevent mis-match of wrapper-interfaces. - */ -void con_default_out() { - console.handle_out = stdout; + */ +FILE *con_default_out() { + return (console.handle_out = stdout); } -void con_default_err() { - console.handle_err = stderr; +FILE *con_default_err() { + return (console.handle_err = stderr); } int con_verr(const char *fmt, va_list va) { @@ -384,6 +384,14 @@ void con_cprintmsg (void *ctx, int lvl, const char *msgtype, const char *msg, .. size_t compile_errors = 0; size_t compile_warnings = 0; +size_t compile_Werrors = 0; +static lex_ctx first_werror; + +void compile_show_werrors() +{ + con_cprintmsg((void*)&first_werror, LVL_ERROR, "first warning", "was here"); +} + void vcompile_error(lex_ctx ctx, const char *msg, va_list ap) { ++compile_errors; @@ -400,8 +408,9 @@ void compile_error(lex_ctx ctx, const char *msg, ...) bool GMQCC_WARN vcompile_warning(lex_ctx ctx, int warntype, const char *fmt, va_list ap) { - int lvl = LVL_WARNING; - char warn_name[1024]; + const char *msgtype = "warning"; + int lvl = LVL_WARNING; + char warn_name[1024]; if (!OPTS_WARN(warntype)) return false; @@ -410,16 +419,22 @@ 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); + ++compile_warnings; if (OPTS_WERROR(warntype)) { - ++compile_errors; + if (!compile_Werrors) + first_werror = ctx; + ++compile_Werrors; + msgtype = "Werror"; + if (OPTS_FLAG(BAIL_ON_WERROR)) { + msgtype = "error"; + ++compile_errors; + } lvl = LVL_ERROR; } - else - ++compile_warnings; - con_vprintmsg_c(lvl, ctx.file, ctx.line, ((lvl == LVL_ERROR) ? "error" : "warning"), fmt, ap, warn_name); + con_vprintmsg_c(lvl, ctx.file, ctx.line, msgtype, fmt, ap, warn_name); - return OPTS_WERROR(warntype); + return OPTS_WERROR(warntype) && OPTS_FLAG(BAIL_ON_WERROR); } bool GMQCC_WARN compile_warning(lex_ctx ctx, int warntype, const char *fmt, ...)