error.c 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. /*------------------------------------------------------------------------
  2. * Copyright 2007-2009 (c) Jeff Brown <spadix@users.sourceforge.net>
  3. *
  4. * This file is part of the ZBar Bar Code Reader.
  5. *
  6. * The ZBar Bar Code Reader is free software; you can redistribute it
  7. * and/or modify it under the terms of the GNU Lesser Public License as
  8. * published by the Free Software Foundation; either version 2.1 of
  9. * the License, or (at your option) any later version.
  10. *
  11. * The ZBar Bar Code Reader is distributed in the hope that it will be
  12. * useful, but WITHOUT ANY WARRANTY; without even the implied warranty
  13. * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU Lesser Public License for more details.
  15. *
  16. * You should have received a copy of the GNU Lesser Public License
  17. * along with the ZBar Bar Code Reader; if not, write to the Free
  18. * Software Foundation, Inc., 51 Franklin St, Fifth Floor,
  19. * Boston, MA 02110-1301 USA
  20. *
  21. * http://sourceforge.net/projects/zbar
  22. *------------------------------------------------------------------------*/
  23. #include "error.h"
  24. #include <string.h>
  25. int _zbar_verbosity = 0;
  26. static const char * const sev_str[] = {
  27. "FATAL ERROR", "ERROR", "OK", "WARNING", "NOTE"
  28. };
  29. #define SEV_MAX (strlen(sev_str[0]))
  30. static const char * const mod_str[] = {
  31. "processor", "video", "window", "image scanner", "<unknown>"
  32. };
  33. #define MOD_MAX (strlen(mod_str[ZBAR_MOD_IMAGE_SCANNER]))
  34. static const char const * err_str[] = {
  35. "no error", /* OK */
  36. "out of memory", /* NOMEM */
  37. "internal library error", /* INTERNAL */
  38. "unsupported request", /* UNSUPPORTED */
  39. "invalid request", /* INVALID */
  40. "system error", /* SYSTEM */
  41. "locking error", /* LOCKING */
  42. "all resources busy", /* BUSY */
  43. "X11 display error", /* XDISPLAY */
  44. "X11 protocol error", /* XPROTO */
  45. "output window is closed", /* CLOSED */
  46. "windows system error", /* WINAPI */
  47. "unknown error" /* NUM */
  48. };
  49. #define ERR_MAX (strlen(err_str[ZBAR_ERR_CLOSED]))
  50. #define ZBAR_VERSION_MAJOR 1
  51. #define ZBAR_VERSION_MINOR 0
  52. int zbar_version (unsigned *major,
  53. unsigned *minor)
  54. {
  55. if(major)
  56. *major = ZBAR_VERSION_MAJOR;
  57. if(minor)
  58. *minor = ZBAR_VERSION_MINOR;
  59. return(0);
  60. }
  61. void zbar_set_verbosity (int level)
  62. {
  63. _zbar_verbosity = level;
  64. }
  65. void zbar_increase_verbosity ()
  66. {
  67. if(!_zbar_verbosity)
  68. _zbar_verbosity++;
  69. else
  70. _zbar_verbosity <<= 1;
  71. }
  72. int _zbar_error_spew (const void *container,
  73. int verbosity)
  74. {
  75. const errinfo_t *err = container;
  76. assert(err->magic == ERRINFO_MAGIC);
  77. // fprintf(stderr, "%s", _zbar_error_string(err, verbosity));
  78. return(-err->sev);
  79. }
  80. zbar_error_t _zbar_get_error_code (const void *container)
  81. {
  82. const errinfo_t *err = container;
  83. assert(err->magic == ERRINFO_MAGIC);
  84. return(err->type);
  85. }
  86. /* ERROR: zbar video in v4l1_set_format():
  87. * system error: blah[: blah]
  88. */
  89. const char *_zbar_error_string (const void *container,
  90. int verbosity)
  91. {
  92. errinfo_t *err = (errinfo_t*)container;
  93. assert(err->magic == ERRINFO_MAGIC);
  94. const char *sev;
  95. if(err->sev >= SEV_FATAL && err->sev <= SEV_NOTE)
  96. sev = sev_str[err->sev + 2];
  97. else
  98. sev = sev_str[1];
  99. const char *mod;
  100. if(err->module >= ZBAR_MOD_PROCESSOR &&
  101. err->module < ZBAR_MOD_UNKNOWN)
  102. mod = mod_str[err->module];
  103. else
  104. mod = mod_str[ZBAR_MOD_UNKNOWN];
  105. const char *func = (err->func) ? err->func : "<unknown>";
  106. const char *type;
  107. if(err->type >= 0 && err->type < ZBAR_ERR_NUM)
  108. type = err_str[err->type];
  109. else
  110. type = err_str[ZBAR_ERR_NUM];
  111. char basefmt[] = "%s: zbar %s in %s():\n %s: ";
  112. int len = SEV_MAX + MOD_MAX + ERR_MAX + strlen(func) + sizeof(basefmt);
  113. err->buf = realloc(err->buf, len);
  114. len = sprintf(err->buf, basefmt, sev, mod, func, type);
  115. if(len <= 0)
  116. return("<unknown>");
  117. if(err->detail) {
  118. int newlen = len + strlen(err->detail) + 1;
  119. if(strstr(err->detail, "%s")) {
  120. if(!err->arg_str)
  121. err->arg_str = strdup("<?>");
  122. err->buf = realloc(err->buf, newlen + strlen(err->arg_str));
  123. len += sprintf(err->buf + len, err->detail, err->arg_str);
  124. }
  125. else if(strstr(err->detail, "%d") || strstr(err->detail, "%x")) {
  126. err->buf = realloc(err->buf, newlen + 32);
  127. len += sprintf(err->buf + len, err->detail, err->arg_int);
  128. }
  129. else {
  130. err->buf = realloc(err->buf, newlen);
  131. len += sprintf(err->buf + len, "%s", err->detail);
  132. }
  133. if(len <= 0)
  134. return("<unknown>");
  135. }
  136. if(err->type == ZBAR_ERR_SYSTEM) {
  137. char sysfmt[] = ": %s (%d)\n";
  138. const char *syserr = strerror(err->errnum);
  139. err->buf = realloc(err->buf, len + strlen(sysfmt) + strlen(syserr));
  140. len += sprintf(err->buf + len, sysfmt, syserr, err->errnum);
  141. }
  142. #ifdef _WIN32
  143. else if(err->type == ZBAR_ERR_WINAPI) {
  144. char *syserr = NULL;
  145. if(FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM |
  146. FORMAT_MESSAGE_ALLOCATE_BUFFER |
  147. FORMAT_MESSAGE_IGNORE_INSERTS,
  148. NULL, err->errnum, 0, (LPTSTR)&syserr, 1, NULL) &&
  149. syserr) {
  150. char sysfmt[] = ": %s (%d)\n";
  151. err->buf = realloc(err->buf, len + strlen(sysfmt) + strlen(syserr));
  152. len += sprintf(err->buf + len, sysfmt, syserr, err->errnum);
  153. LocalFree(syserr);
  154. }
  155. }
  156. #endif
  157. else {
  158. err->buf = realloc(err->buf, len + 2);
  159. len += sprintf(err->buf + len, "\n");
  160. }
  161. return(err->buf);
  162. }