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
+}
+