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

手机WAP编程

开发平台:

WINDOWS

  1. /*
  2.  *
  3.  * wsint.h
  4.  *
  5.  * Author: Markku Rossi <mtr@iki.fi>
  6.  *
  7.  * Copyright (c) 1999-2000 WAPIT OY LTD.
  8.  *  All rights reserved.
  9.  *
  10.  * Operating system specific environment and general helper utilities
  11.  * for the WMLScript tools.
  12.  *
  13.  */
  14. #ifndef WSINT_H
  15. #define WSINT_H
  16. #include "config.h"
  17. #include <stdio.h>
  18. #include <stdlib.h>
  19. #include <string.h>
  20. #include <stdarg.h>
  21. #include <errno.h>
  22. #include <math.h>
  23. #if HAVE_UNISTD_H
  24. #include <unistd.h>
  25. #endif /* HAVE_UNISTD_H */
  26. #include "gwlib/gwassert.h"
  27. /********************* Types and definitions ****************************/
  28. /* Platform dependent line terminator.  This is used in diagnostic and
  29.    error messages to terminate output lines. */
  30. #ifdef WIN32
  31. #define WS_LINE_TERMINATOR "rn"
  32. #else /* not WIN32 */
  33. #define WS_LINE_TERMINATOR "n"
  34. #endif /* not WIN32 */
  35. /* Data types. */
  36. #define WS_INT8_MIN -128
  37. #define WS_INT8_MAX  127
  38. #define WS_INT16_MIN -32768
  39. #define WS_INT16_MAX  32767
  40. #define WS_INT32_MIN -2147483648
  41. #define WS_INT32_MAX  2147483647
  42. /* Integer types. */
  43. typedef unsigned char WsByte;
  44. typedef signed char WsInt8;
  45. typedef unsigned char WsUInt8;
  46. typedef signed short WsInt16;
  47. typedef unsigned short WsUInt16;
  48. typedef signed long WsInt32;
  49. typedef unsigned long WsUInt32;
  50. /* Internally we use as good floating point numbers as possible.  This
  51.    way we avoid losing data in constant folding, etc. */
  52. typedef double WsFloat;
  53. typedef enum
  54. {
  55.     WS_FALSE,
  56.     WS_TRUE
  57. } WsBool;
  58. /* Error flags. */
  59. /* Out of memory. */
  60. #define WS_ERROR_B_MEMORY 0x01
  61. /* The input program was syntactically incorrect. */
  62. #define WS_ERROR_B_SYNTAX 0x02
  63. /* The input program was semantically incorrect.  We managed to parse
  64.    it, but it contained some semantical errors.  For example, a local
  65.    variable was defined twice. */
  66. #define WS_ERROR_B_SEMANTIC 0x04
  67. /********************* Include sub-module headers ***********************/
  68. #include "ws.h"
  69. #include "wserror.h"
  70. #include "wsutf8.h"
  71. #include "wsieee754.h"
  72. #include "wsbuffer.h"
  73. #include "wsencode.h"
  74. #include "wsalloc.h"
  75. #include "wsfalloc.h"
  76. #include "wsstream.h"
  77. #include "wshash.h"
  78. #include "wsbc.h"
  79. #include "wsstree.h"
  80. #include "wsasm.h"
  81. #include "wsopt.h"
  82. #include "wsstdlib.h"
  83. /********************* The compiler handle ******************************/
  84. #if WS_DEBUG
  85. /* The currently active compiler.  Just for debugging purposes. */
  86. extern WsCompilerPtr global_compiler;
  87. #endif /* WS_DEBUG */
  88. /* A structure to register the currently active `continue-break'
  89.    labels.  These are allocated from the syntax-tree pool. */
  90. struct WsContBreakRec
  91. {
  92.     struct WsContBreakRec *next;
  93.     WsAsmIns *l_cont;
  94.     WsAsmIns *l_break;
  95. };
  96. typedef struct WsContBreakRec WsContBreak;
  97. #define COMPILER_MAGIC (0xfefe0101)
  98. struct WsCompilerRec
  99. {
  100.     /* A magic number of assure that a correct compiler handle is passed
  101.        to the parser and lexer functions. */
  102.     WsUInt32 magic;
  103.     /* User-specifiable parameters. */
  104.     WsCompilerParams params;
  105.     /* Current input stream. */
  106.     WsStream *input;
  107.     /* The source file name and line number of the current input
  108.        stream. */
  109.     const char *input_name;
  110.     WsUInt32 linenum;
  111.     /* Fast-malloc pool for the syntax tree items. */
  112.     WsFastMalloc *pool_stree;
  113.     /* Fast-malloc pool for the symbolic assembler instructions. */
  114.     WsFastMalloc *pool_asm;
  115.     /* List of active memory blocks, allocated by the lexer.  When lexer
  116.        allocates string or symbol tokens, their dynamically allocated
  117.        data is registered to this list.  The parser removes the items
  118.        when needed, but if the parsing fails, the items can be freed
  119.        from this list during the cleanup. */
  120.     void **lexer_active_list;
  121.     size_t lexer_active_list_size;
  122.     /* The byte-code object. */
  123.     WsBc *bc;
  124.     /* The next label for the assembler generation. */
  125.     WsUInt32 next_label;
  126.     /* The assembler code, currently begin constructed on this compiler. */
  127.     WsAsmIns *asm_head;
  128.     WsAsmIns *asm_tail;
  129.     /* Buffer holding the linearized byte-code for the current symbolic
  130.        assembler. */
  131.     WsBuffer byte_code;
  132.     /* The syntax tree items, found from the source stream. */
  133.     /* External compilation unit pragmas. */
  134.     WsHashPtr pragma_use_hash;
  135.     /* Functions. */
  136.     WsUInt32 num_functions;
  137.     WsFunction *functions;
  138.     /* A mapping from function names to their declarations in
  139.        `functions'. */
  140.     WsHashPtr functions_hash;
  141.     /* A namespace for function arguments and local variables. */
  142.     WsUInt32 next_vindex;
  143.     WsHashPtr variables_hash;
  144.     /* Registry for the currently active `continue-break' labels. */
  145.     WsContBreak *cont_break;
  146.     /* Statistics about the compilation. */
  147.     WsUInt32 num_errors;
  148.     WsUInt32 num_warnings;
  149.     WsUInt32 num_extern_functions;
  150.     WsUInt32 num_local_functions;
  151.     /* Bitmask to record occurred errors.  This is used in error
  152.        generation and reporting to make sane error messages. */
  153.     WsUInt32 errors;
  154.     /* The latest line where a syntax error occurred.  The compiler do
  155.        not print multiple syntax errors from the same line. */
  156.     WsUInt32 last_syntax_error_line;
  157. };
  158. typedef struct WsCompilerRec WsCompiler;
  159. /********************* Lexer and parser *********************************/
  160. /* The lexer. */
  161. extern int yylex();
  162. /* Register the lexer allocated block `ptr' to the compiler's list of
  163.    active blocks. */
  164. WsBool ws_lexer_register_block(WsCompiler *compiler, void *ptr);
  165. /* Register the lexer allocated UTF-8 string `string' to the
  166.    compiler's list of active blocks. */
  167. WsBool ws_lexer_register_utf8(WsCompiler *compiler, WsUtf8String *string);
  168. /* Unregister the block `ptr' from the compiler's list of active
  169.    blocks and free it.  It is a fatal error if the block `ptr' does
  170.    not exist on the list. */
  171. void ws_lexer_free_block(WsCompiler *compiler, void *ptr);
  172. /* Unregister an UTF-8 string `string' from the compiler's list of
  173.    active blocks and free it. */
  174. void ws_lexer_free_utf8(WsCompiler *compiler, WsUtf8String *string);
  175. /* The parser. */
  176. int ws_yy_parse(void *context);
  177. #endif /* not WSINT_H */