Mercurial > ~dholland > hg > ag > index.cgi
diff anagram/agcore/error.cpp @ 0:13d2b8934445
Import AnaGram (near-)release tree into Mercurial.
author | David A. Holland |
---|---|
date | Sat, 22 Dec 2007 17:52:45 -0500 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/anagram/agcore/error.cpp Sat Dec 22 17:52:45 2007 -0500 @@ -0,0 +1,115 @@ +/* + * AnaGram, A System for Syntax Directed Programming + * Copyright 1993-2002 Parsifal Software. All Rights Reserved. + * See the file COPYING for license and usage terms. + * + * error.cpp - Error reporting module + */ + +#include "config.h" +#include "error.h" +#include "pgg24-defs.h" +#include "stacks.h" + +//#define INCLUDE_LOGGING +#include "log.h" + + +AgString errorReportFile(""); + +int charRangeDiagnostic; +int negativeCharDiagnostic; +int eventDrivenDiagnostic; +int errorResynchDiagnostic; + +AgStack<Error> errorList; + +const char *Error::keyString[] = {"Warning", "Error"}; + +void reset_errors(void) { + charRangeDiagnostic = 0; + eventDrivenDiagnostic = 0; + negativeCharDiagnostic = 0; + errorResynchDiagnostic = 0; +} + +void checkParams() { + LOGSECTION("checkParams"); + if (!eventDrivenDiagnostic && event_driven && pointer_input) { + eventDrivenDiagnostic = 1; + log_error("Event driven parser cannot use pointer input"); + } + if (!errorResynchDiagnostic && error_token && auto_resynch) { + log_error("Both error token resynch and auto resynch specified"); + errorResynchDiagnostic = 1; + } +} + +/* + * XXX. Sometime we need to go through and check up on all calls to + * the next two versions of log_error(), distinguishing those where + * a meaningful location can be fetched from the pgg24 PCB and + * those that should have no location. + * + * (Note: the direct Error constructor calls have been checked.) + */ + +void log_error(const char *msg) { + LOGSECTION("log_error(const char *)"); + errorList.push(Error(pgcb.line, pgcb.column, msg)); +} + +void log_error() { + LOGSECTION("log_error()"); + LOGS(string_base); + errorList.push(Error(pgcb.line, pgcb.column, string_base)); + rcs(); +} + +void log_error(int l, int c) { + LOGSECTION("log_error(int,int)"); + LOGV(l) LCV(c) LV(string_base); + errorList.push(Error(l, c, string_base)); + rcs(); +} + +/* + * XXX the equivalent of this function used to always report the last + * line and column, not the first. But this function is for cases + * where that's not appropriate, so how about arranging things so it + * doesn't report any at all? + */ + +Error::Error(AgString msg) + : file(errorReportFile), + line(1), + column(1), + key(warn), + message(msg) +{ + LOGSECTION("Error::Error(AgString)"); + // Nothing here +} + +Error::Error(int l, int c, AgString msg) + : file(errorReportFile), + line(l), + column(c), + key(warn), + message(msg) +{ + LOGSECTION("Error::Error(int, int, AgString)"); + LOGV(line) LCV(column) LCV(msg.pointer()); + // Nothing here +} + +Error::Error(int l, int c, AgString f, AgString msg) + : file(f), + line(l), + column(c), + key(warn), + message(msg) +{ + // Nothing here +} +