wserror.c
上传用户:gzpyjq
上传日期:2013-01-31
资源大小:1852k
文件大小:6k
源码类别:

手机WAP编程

开发平台:

WINDOWS

  1. /*
  2.  *
  3.  * wserror.c
  4.  *
  5.  * Author: Markku Rossi <mtr@iki.fi>
  6.  *
  7.  * Copyright (c) 1999-2000 WAPIT OY LTD.
  8.  *  All rights reserved.
  9.  *
  10.  * Error and information reporting functions.
  11.  *
  12.  */
  13. #include "wsint.h"
  14. /********************* High-level functions *****************************/
  15. void ws_info(WsCompilerPtr compiler, char *message, ...)
  16. {
  17.     va_list ap;
  18.     if (!compiler->params.verbose)
  19.         return;
  20.     ws_puts(WS_STDOUT, "wsc: ");
  21.     va_start(ap, message);
  22.     ws_vfprintf(WS_STDOUT, message, ap);
  23.     va_end(ap);
  24.     ws_puts(WS_STDOUT, WS_LINE_TERMINATOR);
  25. }
  26. void ws_fatal(char *fmt, ...)
  27. {
  28.     va_list ap;
  29.     fprintf(stderr, "wsc: fatal: ");
  30.     va_start(ap, fmt);
  31.     vfprintf(stderr, fmt, ap);
  32.     va_end(ap);
  33.     fprintf(stderr, "n");
  34.     abort();
  35. }
  36. void ws_error_memory(WsCompilerPtr compiler)
  37. {
  38.     gw_assert(compiler->magic == COMPILER_MAGIC);
  39.     if (compiler->errors & WS_ERROR_B_MEMORY)
  40.         /* We have already reported this error. */
  41.         return;
  42.     compiler->errors |= WS_ERROR_B_MEMORY;
  43.     ws_puts(WS_STDERR, "wsc: error: out of memory" WS_LINE_TERMINATOR);
  44. }
  45. void ws_error_syntax(WsCompilerPtr compiler, WsUInt32 line)
  46. {
  47.     gw_assert(compiler->magic == COMPILER_MAGIC);
  48.     if (compiler->errors & WS_ERROR_B_MEMORY)
  49.         /* It makes no sense to report syntax errors when we have run out
  50.            of memory.  This information is not too valid. */ 
  51.         return;
  52.     if (line == 0)
  53.         line = compiler->linenum;
  54.     if (compiler->last_syntax_error_line == line)
  55.         /* It makes no sense to report multiple syntax errors from the
  56.            same line. */ 
  57.         return;
  58.     compiler->last_syntax_error_line = line;
  59.     compiler->errors |= WS_ERROR_B_SYNTAX;
  60.     ws_fprintf(WS_STDERR, "%s:%u: syntax error" WS_LINE_TERMINATOR,
  61.                compiler->input_name, line);
  62. }
  63. void ws_src_error(WsCompilerPtr compiler, WsUInt32 line, char *message, ...)
  64. {
  65.     va_list ap;
  66.     gw_assert(compiler->magic == COMPILER_MAGIC);
  67.     if (line == 0)
  68.         line = compiler->linenum;
  69.     compiler->errors |= WS_ERROR_B_SEMANTIC;
  70.     ws_fprintf(WS_STDERR, "%s:%u: ", compiler->input_name, line);
  71.     va_start(ap, message);
  72.     ws_vfprintf(WS_STDERR, message, ap);
  73.     va_end(ap);
  74.     ws_puts(WS_STDERR, WS_LINE_TERMINATOR);
  75.     compiler->num_errors++;
  76. }
  77. void ws_src_warning(WsCompilerPtr compiler, WsUInt32 line, char *message, ...)
  78. {
  79.     va_list ap;
  80.     gw_assert(compiler->magic == COMPILER_MAGIC);
  81.     if (line == 0)
  82.         line = compiler->linenum;
  83.     ws_fprintf(WS_STDERR, "%s:%u: warning: ", compiler->input_name, line);
  84.     va_start(ap, message);
  85.     ws_vfprintf(WS_STDERR, message, ap);
  86.     va_end(ap);
  87.     ws_puts(WS_STDERR, WS_LINE_TERMINATOR);
  88.     compiler->num_errors++;
  89. }
  90. /********************* Low-level functions ******************************/
  91. void ws_fprintf(WsIOProc io, void *context, const char *fmt, ...)
  92. {
  93.     va_list ap;
  94.     va_start(ap, fmt);
  95.     ws_vfprintf(io, context, fmt, ap);
  96.     va_end(ap);
  97. }
  98. void ws_vfprintf(WsIOProc io, void *context, const char *fmt, va_list ap)
  99. {
  100.     int start, i;
  101.     for (start = 0, i = 0; fmt[i]; i++)
  102.         if (fmt[i] == '%' && fmt[i + 1]) {
  103.             char buf[256];
  104.             char *cp;
  105.             int ival;
  106.             unsigned int uival;
  107.             int padder = ' ';
  108.             int left = 0;
  109.             unsigned int width = 0;
  110.             if (fmt[i + 1] == '%') {
  111.                 /* An escaped `%'.  Print leading data including the `%'
  112.                           character. */
  113.                 i++;
  114.                 (*io)(fmt + start, i - start, context);
  115.                 start = i + 1;
  116.                 continue;
  117.             }
  118.             /* An escape sequence. */
  119.             /* Print leading data if any. */
  120.             if (i > start)
  121.                 (*io)(fmt + start, i - start, context);
  122.             /* We support a minor sub-set of the printf()'s formatting
  123.                       capabilities.  Let's see what we got. */
  124.             i++;
  125.             /* Alignment? */
  126.             if (fmt[i] == '-') {
  127.                 left = 1;
  128.                 i++;
  129.             }
  130.             /* Padding? */
  131.             if (fmt[i] == '0') {
  132.                 padder = '0';
  133.                 i++;
  134.             }
  135.             /* Width? */
  136.             while ('0' <= fmt[i] && fmt[i] <= '9') {
  137.                 width *= 10;
  138.                 width += fmt[i++] - '0';
  139.             }
  140.             /* Check the format. */
  141.             cp = buf;
  142.             switch (fmt[i]) {
  143.             case 'c':  /* character */
  144.                 ival = (int) va_arg(ap, int);
  145.                 snprintf(buf, sizeof(buf), "%c", (char) ival);
  146.                 cp = buf;
  147.                 break;
  148.             case 's':  /* string */
  149.                 cp = va_arg(ap, char *);
  150.                 break;
  151.             case 'd':  /* integer */
  152.                 ival = va_arg(ap, int);
  153.                 snprintf(buf, sizeof(buf), "%d", ival);
  154.                 cp = buf;
  155.                 break;
  156.             case 'u':  /* unsigned integer */
  157.                 uival = va_arg(ap, unsigned int);
  158.                 snprintf(buf, sizeof(buf), "%u", uival);
  159.                 cp = buf;
  160.                 break;
  161.             case 'x':  /* unsigned integer in hexadecimal format */
  162.                 uival = va_arg(ap, unsigned int);
  163.                 snprintf(buf, sizeof(buf), "%x", uival);
  164.                 cp = buf;
  165.                 break;
  166.             default:
  167.                 ws_fatal("ws_vfprintf(): format %%%c not implemented", fmt[i]);
  168.                 break;
  169.             }
  170.             if (left)
  171.                 /* Output the value left-justified. */
  172.                 (*io)(cp, strlen(cp), context);
  173.             /* Need padding? */
  174.             if (width > strlen(cp)) {
  175.                 /* Yes we need. */
  176.                 int amount = width - strlen(cp);
  177.                 while (amount-- > 0)
  178.                     ws_fputc(padder, io, context);
  179.             }
  180.             if (!left)
  181.                 /* Output the value right-justified. */
  182.                 (*io)(cp, strlen(cp), context);
  183.             /* Process more. */
  184.             start = i + 1;
  185.         }
  186.     /* Print trailing data if any. */
  187.     if (i > start)
  188.         (*io)(fmt + start, i - start, context);
  189. }
  190. void ws_puts(WsIOProc io, void *context, const char *str)
  191. {
  192.     (*io)(str, strlen(str), context);
  193. }
  194. void ws_fputc(int ch, WsIOProc io, void *context)
  195. {
  196.     char c = (char) ch;
  197.     (*io)(&c, 1, context);
  198. }