Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. #include "fitz.h"
  2.  
  3. enum { LINE_LEN = 160, LINE_COUNT = 25 };
  4.  
  5. static char warn_message[LINE_LEN] = "";
  6. static int warn_count = 0;
  7.  
  8. void fz_flush_warnings(void)
  9. {
  10.         if (warn_count > 1)
  11.                 fprintf(stderr, "warning: ... repeated %d times ...\n", warn_count);
  12.         warn_message[0] = 0;
  13.         warn_count = 0;
  14. }
  15.  
  16. void fz_warn(char *fmt, ...)
  17. {
  18.         va_list ap;
  19.         char buf[LINE_LEN];
  20.  
  21.         va_start(ap, fmt);
  22.         vsnprintf(buf, sizeof buf, fmt, ap);
  23.         va_end(ap);
  24.  
  25.         if (!strcmp(buf, warn_message))
  26.         {
  27.                 warn_count++;
  28.         }
  29.         else
  30.         {
  31.                 fz_flush_warnings();
  32.                 fprintf(stderr, "warning: %s\n", buf);
  33.                 fz_strlcpy(warn_message, buf, sizeof warn_message);
  34.                 warn_count = 1;
  35.         }
  36. }
  37.  
  38. static char error_message[LINE_COUNT][LINE_LEN];
  39. static int error_count = 0;
  40.  
  41. static void
  42. fz_emit_error(char what, char *location, char *message)
  43. {
  44.         fz_flush_warnings();
  45.  
  46.         fprintf(stderr, "%c %s%s\n", what, location, message);
  47.  
  48.         if (error_count < LINE_COUNT)
  49.         {
  50.                 fz_strlcpy(error_message[error_count], location, LINE_LEN);
  51.                 fz_strlcat(error_message[error_count], message, LINE_LEN);
  52.                 error_count++;
  53.         }
  54. }
  55.  
  56. int
  57. fz_get_error_count(void)
  58. {
  59.         return error_count;
  60. }
  61.  
  62. char *
  63. fz_get_error_line(int n)
  64. {
  65.         return error_message[n];
  66. }
  67.  
  68. fz_error
  69. fz_throw_imp(const char *file, int line, const char *func, char *fmt, ...)
  70. {
  71.         va_list ap;
  72.         char one[LINE_LEN], two[LINE_LEN];
  73.  
  74.         error_count = 0;
  75.  
  76.         snprintf(one, sizeof one, "%s:%d: %s(): ", file, line, func);
  77.         va_start(ap, fmt);
  78.         vsnprintf(two, sizeof two, fmt, ap);
  79.         va_end(ap);
  80.  
  81.         fz_emit_error('+', one, two);
  82.  
  83.         return -1;
  84. }
  85.  
  86. fz_error
  87. fz_rethrow_imp(const char *file, int line, const char *func, fz_error cause, char *fmt, ...)
  88. {
  89.         va_list ap;
  90.         char one[LINE_LEN], two[LINE_LEN];
  91.  
  92.         snprintf(one, sizeof one, "%s:%d: %s(): ", file, line, func);
  93.         va_start(ap, fmt);
  94.         vsnprintf(two, sizeof two, fmt, ap);
  95.         va_end(ap);
  96.  
  97.         fz_emit_error('|', one, two);
  98.  
  99.         return cause;
  100. }
  101.  
  102. void
  103. fz_catch_imp(const char *file, int line, const char *func, fz_error cause, char *fmt, ...)
  104. {
  105.         va_list ap;
  106.         char one[LINE_LEN], two[LINE_LEN];
  107.  
  108.         snprintf(one, sizeof one, "%s:%d: %s(): ", file, line, func);
  109.         va_start(ap, fmt);
  110.         vsnprintf(two, sizeof two, fmt, ap);
  111.         va_end(ap);
  112.  
  113.         fz_emit_error('\\', one, two);
  114. }
  115.  
  116. fz_error
  117. fz_throw_impx(char *fmt, ...)
  118. {
  119.         va_list ap;
  120.         char buf[LINE_LEN];
  121.  
  122.         error_count = 0;
  123.  
  124.         va_start(ap, fmt);
  125.         vsnprintf(buf, sizeof buf, fmt, ap);
  126.         va_end(ap);
  127.  
  128.         fz_emit_error('+', "", buf);
  129.  
  130.         return -1;
  131. }
  132.  
  133. fz_error
  134. fz_rethrow_impx(fz_error cause, char *fmt, ...)
  135. {
  136.         va_list ap;
  137.         char buf[LINE_LEN];
  138.  
  139.         va_start(ap, fmt);
  140.         vsnprintf(buf, sizeof buf, fmt, ap);
  141.         va_end(ap);
  142.  
  143.         fz_emit_error('|', "", buf);
  144.  
  145.         return cause;
  146. }
  147.  
  148. void
  149. fz_catch_impx(fz_error cause, char *fmt, ...)
  150. {
  151.         va_list ap;
  152.         char buf[LINE_LEN];
  153.  
  154.         va_start(ap, fmt);
  155.         vsnprintf(buf, sizeof buf, fmt, ap);
  156.         va_end(ap);
  157.  
  158.         fz_emit_error('\\', "", buf);
  159. }
  160.