error.c 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. #define _BSD_SOURCE
  2. #define _DEFAULT_SOURCE
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <stdarg.h>
  6. #include <string.h>
  7. #include "export.h"
  8. #include "error.h"
  9. #define PCILIB_LOGGER_HISTORY 16
  10. void pcilib_print_error(void *arg, const char *file, int line, pcilib_log_priority_t prio, const char *msg, va_list va) {
  11. vprintf(msg, va);
  12. printf(" [%s:%d]\n", file, line);
  13. }
  14. static void *pcilib_logger_argument = NULL;
  15. static pcilib_log_priority_t pcilib_logger_min_prio = PCILIB_LOG_WARNING;
  16. static pcilib_logger_t pcilib_logger = pcilib_print_error;
  17. static char *pcilib_logger_history[PCILIB_LOGGER_HISTORY] = {0};
  18. static int pcilib_logger_history_pointer = 0;
  19. static int pcilib_log_check_history(pcilib_log_flags_t flags, const char *msg) {
  20. int i;
  21. if ((flags&PCILIB_LOG_ONCE) == 0)
  22. return 0;
  23. for (i = 0; ((i < PCILIB_LOGGER_HISTORY)&&(pcilib_logger_history[i])); i++) {
  24. if (!strcmp(msg, pcilib_logger_history[i]))
  25. return -1;
  26. }
  27. if (pcilib_logger_history[pcilib_logger_history_pointer])
  28. free(pcilib_logger_history[pcilib_logger_history_pointer]);
  29. pcilib_logger_history[pcilib_logger_history_pointer] = strdup(msg);
  30. if (++pcilib_logger_history_pointer == PCILIB_LOGGER_HISTORY)
  31. pcilib_logger_history_pointer = 0;
  32. return 0;
  33. }
  34. void pcilib_log_message(const char *file, int line, pcilib_log_flags_t flags, pcilib_log_priority_t prio, const char *msg, ...) {
  35. va_list va;
  36. if ((!prio)||(prio >= pcilib_logger_min_prio)) {
  37. if (pcilib_log_check_history(flags, msg))
  38. return;
  39. va_start(va, msg);
  40. pcilib_logger(pcilib_logger_argument, file, line, prio, msg, va);
  41. va_end(va);
  42. }
  43. }
  44. void pcilib_log_vmessage(const char *file, int line, pcilib_log_flags_t flags, pcilib_log_priority_t prio, const char *msg, va_list va) {
  45. if ((!prio)||(prio >= pcilib_logger_min_prio)) {
  46. if (pcilib_log_check_history(flags, msg))
  47. return;
  48. pcilib_logger(pcilib_logger_argument, file, line, prio, msg, va);
  49. }
  50. }
  51. int pcilib_set_logger(pcilib_log_priority_t min_prio, pcilib_logger_t logger, void *arg) {
  52. pcilib_logger_min_prio = min_prio;
  53. pcilib_logger_argument = arg;
  54. if (logger) pcilib_logger = logger;
  55. else logger = pcilib_print_error;
  56. return 0;
  57. }