*/
#include "gmqcc.h"
-uint32_t opts_warn [1 + (COUNT_WARNINGS / 32)];
-bool opts_werror = false;
-
/*
* isatty/STDERR_FILENO/STDOUT_FILNO
* + some other things likewise.
* for reporting of file:line based on lexer context, These are used
* heavily in the parser/ir/ast.
*/
-void con_vprintmsg(int level, const char *name, size_t line, const char *msgtype, const char *msg, va_list ap) {
+void con_vprintmsg_c(int level, const char *name, size_t line, const char *msgtype, const char *msg, va_list ap, const char *condname) {
/* color selection table */
static int sel[] = {
CON_WHITE,
print("%s:%d: %s: ", name, (int)line, msgtype);
vprint(msg, ap);
- print("\n");
+ if (condname)
+ print(" [%s]\n", condname);
+ else
+ print("\n");
+}
+
+void con_vprintmsg(int level, const char *name, size_t line, const char *msgtype, const char *msg, va_list ap) {
+ con_vprintmsg_c(level, name, line, msgtype, msg, ap, NULL);
}
void con_printmsg(int level, const char *name, size_t line, const char *msgtype, const char *msg, ...) {
size_t compile_errors = 0;
size_t compile_warnings = 0;
+void vcompile_error(lex_ctx ctx, const char *msg, va_list ap)
+{
+ ++compile_errors;
+ con_cvprintmsg((void*)&ctx, LVL_ERROR, "error", msg, ap);
+}
+
void compile_error(lex_ctx ctx, const char *msg, ...)
{
va_list ap;
- ++compile_errors;
va_start(ap, msg);
- con_cvprintmsg((void*)&ctx, LVL_ERROR, "error", msg, ap);
+ vcompile_error(ctx, msg, ap);
va_end(ap);
}
-bool GMQCC_WARN compile_warning(lex_ctx ctx, int warntype, const char *fmt, ...)
+bool GMQCC_WARN vcompile_warning(lex_ctx ctx, int warntype, const char *fmt, va_list ap)
{
- va_list ap;
- int lvl = LVL_WARNING;
+ int lvl = LVL_WARNING;
+ char warn_name[1024];
if (!OPTS_WARN(warntype))
return false;
- if (opts_werror) {
+ warn_name[0] = '-';
+ warn_name[1] = 'W';
+ (void)util_strtononcmd(opts_warn_list[warntype].name, warn_name+2, sizeof(warn_name)-2);
+
+ if (opts.werror) {
++compile_errors;
- lvl = LVL_ERROR;
- }
- else
+ lvl = LVL_ERROR;
+ }
+ else
++compile_warnings;
- va_start(ap, fmt);
- con_vprintmsg(lvl, ctx.file, ctx.line, "warning", fmt, ap);
- va_end(ap);
+ con_vprintmsg_c(lvl, ctx.file, ctx.line, (opts.werror ? "error" : "warning"), fmt, ap, warn_name);
- return opts_werror;
+ return opts.werror;
+}
+
+bool GMQCC_WARN compile_warning(lex_ctx ctx, int warntype, const char *fmt, ...)
+{
+ bool r;
+ va_list ap;
+ va_start(ap, fmt);
+ r = vcompile_warning(ctx, warntype, fmt, ap);
+ va_end(ap);
+ return r;
}