diff options
Diffstat (limited to 'zbar/error.c')
-rw-r--r-- | zbar/error.c | 175 |
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); +} |