* 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) {
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;
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;
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, ...)