]> git.xonotic.org Git - xonotic/gmqcc.git/blobdiff - conout.c
-fbail-on-werror option
[xonotic/gmqcc.git] / conout.c
index bf8b522648802b1b342760fdd81ecb8abfce20f2..7c526e184015b3b2f29523230f6f07ded6d83201 100644 (file)
--- a/conout.c
+++ b/conout.c
@@ -289,6 +289,17 @@ int con_change(const char *out, const char *err) {
     return 1;
 }
 
+/*
+ * Defaultizer because stdio.h shouldn't be used anywhere except here
+ * and inside file.c To prevent mis-match of wrapper-interfaces.
+ */ 
+FILE *con_default_out() {
+    return (console.handle_out = stdout);
+}
+FILE *con_default_err() {
+    return (console.handle_err = stderr);
+}
+
 int con_verr(const char *fmt, va_list va) {
     return con_write(console.handle_err, fmt, va);
 }
@@ -373,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;
@@ -389,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;
@@ -399,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, ...)