summaryrefslogtreecommitdiffstats
path: root/zbar/error.c
diff options
context:
space:
mode:
Diffstat (limited to 'zbar/error.c')
-rw-r--r--zbar/error.c175
1 files changed, 175 insertions, 0 deletions
diff --git a/zbar/error.c b/zbar/error.c
new file mode 100644
index 0000000..1becc1a
--- /dev/null
+++ b/zbar/error.c
@@ -0,0 +1,175 @@
+/*------------------------------------------------------------------------
+ * Copyright 2007-2010 (c) Jeff Brown <spadix@users.sourceforge.net>
+ *
+ * This file is part of the ZBar Bar Code Reader.
+ *
+ * The ZBar Bar Code Reader is free software; you can redistribute it
+ * and/or modify it under the terms of the GNU Lesser Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * The ZBar Bar Code Reader 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 Lesser Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser Public License
+ * along with the ZBar Bar Code Reader; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
+ *
+ * http://sourceforge.net/projects/zbar
+ *------------------------------------------------------------------------*/
+
+#include "error.h"
+#include <string.h>
+
+int _zbar_verbosity = 0;
+
+static const char *const sev_str[] = { "FATAL ERROR", "ERROR", "OK", "WARNING",
+ "NOTE" };
+#define SEV_MAX (strlen(sev_str[0]))
+
+static const char *const mod_str[] = { "processor", "video", "window",
+ "image scanner", "<unknown>" };
+#define MOD_MAX (strlen(mod_str[ZBAR_MOD_IMAGE_SCANNER]))
+
+static const char *const err_str[] = {
+ "no error", /* OK */
+ "out of memory", /* NOMEM */
+ "internal library error", /* INTERNAL */
+ "unsupported request", /* UNSUPPORTED */
+ "invalid request", /* INVALID */
+ "system error", /* SYSTEM */
+ "locking error", /* LOCKING */
+ "all resources busy", /* BUSY */
+ "X11 display error", /* XDISPLAY */
+ "X11 protocol error", /* XPROTO */
+ "output window is closed", /* CLOSED */
+ "windows system error", /* WINAPI */
+ "unknown error" /* NUM */
+};
+#define ERR_MAX (strlen(err_str[ZBAR_ERR_CLOSED]))
+
+int zbar_version(unsigned *major, unsigned *minor, unsigned *patch)
+{
+ if (major)
+ *major = ZBAR_VERSION_MAJOR;
+ if (minor)
+ *minor = ZBAR_VERSION_MINOR;
+ if (patch)
+ *patch = ZBAR_VERSION_PATCH;
+ return (0);
+}
+
+void zbar_set_verbosity(int level)
+{
+ _zbar_verbosity = level;
+}
+
+void zbar_increase_verbosity()
+{
+ if (!_zbar_verbosity)
+ _zbar_verbosity++;
+ else
+ _zbar_verbosity <<= 1;
+}
+
+int _zbar_error_spew(const void *container, int verbosity)
+{
+ const errinfo_t *err = container;
+ assert(err->magic == ERRINFO_MAGIC);
+ fprintf(stderr, "%s", _zbar_error_string(err, verbosity));
+ return (-err->sev);
+}
+
+zbar_error_t _zbar_get_error_code(const void *container)
+{
+ const errinfo_t *err = container;
+ assert(err->magic == ERRINFO_MAGIC);
+ return (err->type);
+}
+
+/* ERROR: zbar video in v4l1_set_format():
+ * system error: blah[: blah]
+ */
+
+const char *_zbar_error_string(const void *container, int verbosity)
+{
+ static const char basefmt[] = "%s: zbar %s in %s():\n %s: ";
+ errinfo_t *err = (errinfo_t *)container;
+ const char *sev, *mod, *func, *type;
+ int len;
+
+ assert(err->magic == ERRINFO_MAGIC);
+
+ if (err->sev >= SEV_FATAL && err->sev <= SEV_NOTE)
+ sev = sev_str[err->sev + 2];
+ else
+ sev = sev_str[1];
+
+ if (err->module >= ZBAR_MOD_PROCESSOR && err->module < ZBAR_MOD_UNKNOWN)
+ mod = mod_str[err->module];
+ else
+ mod = mod_str[ZBAR_MOD_UNKNOWN];
+
+ func = (err->func) ? err->func : "<unknown>";
+
+ if (err->type >= 0 && err->type < ZBAR_ERR_NUM)
+ type = err_str[err->type];
+ else
+ type = err_str[ZBAR_ERR_NUM];
+
+ len = SEV_MAX + MOD_MAX + ERR_MAX + strlen(func) + sizeof(basefmt);
+ err->buf = realloc(err->buf, len);
+ len = sprintf(err->buf, basefmt, sev, mod, func, type);
+ if (len <= 0)
+ return ("<unknown>");
+
+ if (err->detail) {
+ int newlen = len + strlen(err->detail) + 1;
+ if (strstr(err->detail, "%s")) {
+ if (!err->arg_str)
+ err->arg_str = strdup("<?>");
+ err->buf = realloc(err->buf, newlen + strlen(err->arg_str));
+ len += sprintf(err->buf + len, err->detail, err->arg_str);
+ } else if (strstr(err->detail, "%d") || strstr(err->detail, "%x")) {
+ err->buf = realloc(err->buf, newlen + 32);
+ len += sprintf(err->buf + len, err->detail, err->arg_int);
+ } else {
+ err->buf = realloc(err->buf, newlen);
+ len += sprintf(err->buf + len, "%s", err->detail);
+ }
+ if (len <= 0)
+ return ("<unknown>");
+ }
+
+#ifdef HAVE_ERRNO_H
+ if (err->type == ZBAR_ERR_SYSTEM) {
+ static const char sysfmt[] = ": %s (%d)\n";
+ const char *syserr = strerror(err->errnum);
+ err->buf = realloc(err->buf, len + strlen(sysfmt) + strlen(syserr));
+ len += sprintf(err->buf + len, sysfmt, syserr, err->errnum);
+ }
+#endif
+#ifdef _WIN32
+ else if (err->type == ZBAR_ERR_WINAPI) {
+ char *syserr = NULL;
+ if (FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM |
+ FORMAT_MESSAGE_ALLOCATE_BUFFER |
+ FORMAT_MESSAGE_IGNORE_INSERTS,
+ NULL, err->errnum, 0, (LPTSTR)&syserr, 1, NULL) &&
+ syserr) {
+ char sysfmt[] = ": %s (%d)\n";
+ err->buf = realloc(err->buf, len + strlen(sysfmt) + strlen(syserr));
+ len += sprintf(err->buf + len, sysfmt, syserr, err->errnum);
+ LocalFree(syserr);
+ }
+ }
+#endif
+ else {
+ err->buf = realloc(err->buf, len + 2);
+ len += sprintf(err->buf + len, "\n");
+ }
+ return (err->buf);
+}