summaryrefslogtreecommitdiff
path: root/graphics/sketch/error.c
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /graphics/sketch/error.c
Initial commit
Diffstat (limited to 'graphics/sketch/error.c')
-rw-r--r--graphics/sketch/error.c141
1 files changed, 141 insertions, 0 deletions
diff --git a/graphics/sketch/error.c b/graphics/sketch/error.c
new file mode 100644
index 0000000000..9f885aa1ed
--- /dev/null
+++ b/graphics/sketch/error.c
@@ -0,0 +1,141 @@
+/* error.c
+ Copyright (C) 2005,2006,2007 Eugene K. Ressler, Jr.
+
+This file is part of Sketch, a small, simple system for making
+3d drawings with LaTeX and the PSTricks or TikZ package.
+
+Sketch is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 3, or (at your option)
+any later version.
+
+Sketch is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Sketch; see the file COPYING.txt. If not, see
+http://www.gnu.org/copyleft */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include "error.h"
+
+SRC_LINE no_line = { NULL, 0 };
+
+typedef enum error_type_t
+{
+ E_REMARK,
+ E_WARNING,
+ E_ERROR,
+ E_FATAL_ERROR,
+ E_N // keep last; this is the number of error types
+}
+ERROR_TYPE;
+
+char *error_type_str[] = {
+ "remark",
+ "warning",
+ "error",
+ "fatal",
+};
+
+static int n_errors[E_N]; // assumes C initialization to zero
+
+static void
+print_error (ERROR_TYPE type, SRC_LINE line, char *fmt, va_list arg_list)
+{
+ n_errors[type]++;
+ if (line.file_name)
+ fprintf (stderr, "%s", line.file_name);
+ if (line.number > 0)
+ fprintf (stderr, "(%u) : ", line.number);
+ fprintf (stderr, "%s, ", error_type_str[type]);
+ vfprintf (stderr, fmt, arg_list);
+ fprintf (stderr, "\n");
+}
+
+void
+remark (SRC_LINE line, char *fmt, ...)
+{
+ va_list arg_list;
+
+ va_start (arg_list, fmt);
+ print_error (E_REMARK, line, fmt, arg_list);
+ va_end (arg_list);
+}
+
+void
+warn (SRC_LINE line, char *fmt, ...)
+{
+ va_list arg_list;
+
+ va_start (arg_list, fmt);
+ print_error (E_WARNING, line, fmt, arg_list);
+ va_end (arg_list);
+}
+
+void
+err (SRC_LINE line, char *fmt, ...)
+{
+ va_list arg_list;
+
+ va_start (arg_list, fmt);
+ print_error (E_ERROR, line, fmt, arg_list);
+ va_end (arg_list);
+}
+
+void
+die (SRC_LINE line, char *fmt, ...)
+{
+ va_list arg_list;
+
+ va_start (arg_list, fmt);
+ print_error (E_FATAL_ERROR, line, fmt, arg_list);
+ va_end (arg_list);
+ report_errors ();
+}
+
+int
+trouble_p (void)
+{
+ return n_errors[E_ERROR] > 0 || n_errors[E_FATAL_ERROR] > 0;
+}
+
+void
+report_errors (void)
+{
+ int i, n_total = 0;
+
+ // start printing summary
+ fprintf (stderr, "summary: ");
+ for (i = 0; i < E_N; i++)
+ {
+ if (n_errors[i] > 0)
+ {
+ if (n_total > 0)
+ fprintf (stderr, ", ");
+ fprintf (stderr, "%d %s", n_errors[i], error_type_str[i]);
+ n_total++;
+ }
+ }
+
+ // see if we need to abort
+ if (trouble_p ())
+ {
+ fprintf (stderr, "\nquitting...\n");
+ exit (1);
+ }
+ // not aborting, so finish up the summary
+ if (n_total == 0)
+ {
+ fprintf (stderr, "no errors");
+ }
+ fprintf (stderr, "\n");
+
+ // zero the error counters
+ for (i = 0; i < E_N; i++)
+ n_errors[i] = 0;
+}