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

手机WAP编程

开发平台:

WINDOWS

  1. /*
  2.  *
  3.  * wsbc.h
  4.  *
  5.  * Author: Markku Rossi <mtr@iki.fi>
  6.  *
  7.  * Copyright (c) 1999-2000 WAPIT OY LTD.
  8.  *  All rights reserved.
  9.  *
  10.  * Byte-code handling.
  11.  *
  12.  */
  13. #ifndef WSBC_H
  14. #define WSBC_H
  15. #include "wsint.h"
  16. /********************* Types and defintions *****************************/
  17. /* The byte-code version numbers. */
  18. #define WS_BC_VERSION_MAJOR 1
  19. #define WS_BC_VERSION_MINOR 1
  20. #define WS_BC_VERSION (((WS_BC_VERSION_MAJOR - 1) << 4) | WS_BC_VERSION_MINOR)
  21. /* The maximum length of the byte-code header: the multi-byte encoded
  22.    length + one byte for the version information. */
  23. #define WS_BC_MAX_HEADER_LEN (WS_MB_UINT32_MAX_ENCODED_LEN + 1)
  24. /* The string encoding, used in the byte-code data.  These are the
  25.    MIBEnum values, assigned by IANA.  For a complete description of
  26.    the character sets and values, please see the document
  27.    `rfc/iana/assignments/character-sets'. */
  28. typedef enum
  29. {
  30.     WS_BC_STRING_ENC_ISO_8859_1 = 4,
  31.     WS_BC_STRING_ENC_UTF8 = 106
  32. } WsBcStringEncoding;
  33. /* Constant types in the BC constants pool. */
  34. #define WS_BC_CONST_INT8 0
  35. #define WS_BC_CONST_INT16 1
  36. #define WS_BC_CONST_INT32 2
  37. #define WS_BC_CONST_FLOAT32 3
  38. #define WS_BC_CONST_UTF8_STRING 4
  39. #define WS_BC_CONST_EMPTY_STRING 5
  40. #define WS_BC_CONST_EXT_ENC_STRING 6
  41. #define WS_BC_CONST_FIRST_RESERVED 7
  42. /* An in-memory byte-code constant. */
  43. typedef enum
  44. {
  45.     WS_BC_CONST_TYPE_INT,
  46.     WS_BC_CONST_TYPE_FLOAT32,
  47.     WS_BC_CONST_TYPE_FLOAT32_NAN,
  48.     WS_BC_CONST_TYPE_FLOAT32_POSITIVE_INF,
  49.     WS_BC_CONST_TYPE_FLOAT32_NEGATIVE_INF,
  50.     WS_BC_CONST_TYPE_UTF8_STRING,
  51.     WS_BC_CONST_TYPE_EMPTY_STRING
  52. } WsBcConstantType;
  53. struct WsBcConstantRec
  54. {
  55.     WsBcConstantType type;
  56.     union
  57.     {
  58.         WsInt32 v_int;
  59.         WsFloat v_float;
  60.         WsUtf8String v_string;
  61.     } u;
  62. };
  63. typedef struct WsBcConstantRec WsBcConstant;
  64. /* Pragma types in the BC pragma pool. */
  65. #define WS_BC_PRAGMA_ACCESS_DOMAIN 0
  66. #define WS_BC_PRAGMA_ACCESS_PATH 1
  67. #define WS_BC_PRAGMA_USER_AGENT_PROPERTY 2
  68. #define WS_BC_PRAGMA_USER_AGENT_PROPERTY_AND_SCHEME 3
  69. #define WS_BC_PRAGMA_FIRST_RESERVED 4
  70. /* An in-memory byte-code pragma. */
  71. typedef enum
  72. {
  73.     WS_BC_PRAGMA_TYPE_ACCESS_DOMAIN,
  74.     WS_BC_PRAGMA_TYPE_ACCESS_PATH,
  75.     WS_BC_PRAGMA_TYPE_USER_AGENT_PROPERTY,
  76.     WS_BC_PRAGMA_TYPE_USER_AGENT_PROPERTY_AND_SCHEME
  77. } WsBcPragmaType;
  78. struct WsBcPragmaRec
  79. {
  80.     WsBcPragmaType type;
  81.     WsUInt16 index_1;
  82.     WsUInt16 index_2;
  83.     WsUInt16 index_3;
  84. };
  85. typedef struct WsBcPragmaRec WsBcPragma;
  86. /* An in-memory byte-code function name. */
  87. struct WsBcFunctionNameRec
  88. {
  89.     /* Index to the function pool. */
  90.     WsUInt8 index;
  91.     /* The name of the function as a 7 bit ASCII.  This is as-is in the
  92.        UTF-8 format. */
  93.     char *name;
  94. };
  95. typedef struct WsBcFunctionNameRec WsBcFunctionName;
  96. /* An in-memory byte-code function. */
  97. struct WsBcFunctionRec
  98. {
  99.     WsUInt8 num_arguments;
  100.     WsUInt8 num_locals;
  101.     WsUInt32 code_size;
  102.     unsigned char *code;
  103. };
  104. typedef struct WsBcFunctionRec WsBcFunction;
  105. /* An in-memory byte-code file. */
  106. struct WsBcRec
  107. {
  108.     /* How the strings are encoded in linearization. */
  109.     WsBcStringEncoding string_encoding;
  110.     /* Constant pool.  In this structure, all strings are in UTF-8
  111.        format.  However, they can be converted to different formats - if
  112.        requested - when linearizing the byte-code. */
  113.     WsUInt16 num_constants;
  114.     WsBcConstant *constants;
  115.     /* Pragma pool. */
  116.     WsUInt16 num_pragmas;
  117.     WsBcPragma *pragmas;
  118.     /* Function pool. */
  119.     WsUInt8 num_function_names;
  120.     WsBcFunctionName *function_names;
  121.     WsUInt8 num_functions;
  122.     WsBcFunction *functions;
  123. };
  124. typedef struct WsBcRec WsBc;
  125. /********************* Manipulating byte-code structure *****************/
  126. /* Allocate a new byte-code structure.  The argument `string_encoding'
  127.    specifies the encoding that is used for strings.  The function
  128.    returns NULL if the allocation failed. */
  129. WsBc *ws_bc_alloc(WsBcStringEncoding string_encoding);
  130. /* Free the byte-code structure `bc' and all its internally allocated
  131.    data structures.  The byte-code handle `bc' should not be used
  132.    after this function. */
  133. void ws_bc_free(WsBc *bc);
  134. /* Encode the byte-code structure `bc' into a linearized binary
  135.    byte-code blob.  The function returns WS_TRUE if the encoding was
  136.    successful of WS_FALSE otherwise.  The result blob is returned in
  137.    `data_return' and its length is returned in `data_len_return'.  The
  138.    returned byte-code block must be freed with the ws_bc_data_free()
  139.    function.  You *must* not free it with ws_free() since it will
  140.    corrupt the heap. */
  141. WsBool ws_bc_encode(WsBc *bc, unsigned char **data_return,
  142.                     size_t *data_len_return);
  143. /* Free a byte-code data `data', returned by the ws_bc_encode()
  144.    function. */
  145. void ws_bc_data_free(unsigned char *data);
  146. /* Decode the byte-code data `data' into an in-memory byte-code
  147.    structure.  The function returns the byte-code structure or NULL if
  148.    the decoding fails.  The argument `data_len' specfies the length of
  149.    the byte-code data `data'.  The returned byte-code structure must
  150.    be freed with the ws_bc_free() function when it is not needed
  151.    anymore. */
  152. WsBc *ws_bc_decode(const unsigned char *data, size_t data_len);
  153. /********************* Adding constant elements *************************/
  154. /* Add an integer constant `value' to the constant pool of the
  155.    byte-code structure `bc'.  The index of the constant is returned in
  156.    `index_return'.  The function returns WS_TRUE if the operation was
  157.    successfull or WS_FALSE otherwise (out of memory).  */
  158. WsBool ws_bc_add_const_int(WsBc *bc, WsUInt16 *index_return,
  159.                            WsInt32 value);
  160. /* Add a floating point constant `value' to the constant pool of the
  161.    byte-code structure `bc'. */
  162. WsBool ws_bc_add_const_float(WsBc *bc, WsUInt16 *index_return, WsFloat value);
  163. /* Add an UTF-8 encoded string to the constant pool of the byte-code
  164.    structure `bc'. */
  165. WsBool ws_bc_add_const_utf8_string(WsBc *bc, WsUInt16 *index_return,
  166.                                    const unsigned char *data, size_t len);
  167. /* Add an empty string to the constant pool of the byte-code structure
  168.    `bc'. */
  169. WsBool ws_bc_add_const_empty_string(WsBc *bc, WsUInt16 *index_return);
  170. /********************* Adding pragmas ***********************************/
  171. /* Add an access control specifier pragma to the constant and pragma
  172.    pools of the byte-code structure `bc'.  The argument `domain' has
  173.    `domain_len' bytes of UTF-8 data specifying the access domain. */
  174. WsBool ws_bc_add_pragma_access_domain(WsBc *bc,
  175.                                       const unsigned char *domain,
  176.                                       size_t domain_len);
  177. /* Add an access control specifier pragma to the constant and pragma
  178.    pools of the byte-code structure `bc'.  The argument `path' has
  179.    `path_len' bytes of UTF-8 data specifying the access path. */
  180. WsBool ws_bc_add_pragma_access_path(WsBc *bc,
  181.                                     const unsigned char *path,
  182.                                     size_t path_len);
  183. /* Add a use agent property pragma to the constant and pragma pools of
  184.    the byte-code structure `bc'.  The arguments `name' and `property'
  185.    are UTF-8 encoded use agent property. */
  186. WsBool ws_bc_add_pragma_user_agent_property(WsBc *bc,
  187.         const unsigned char *name,
  188.         size_t name_len,
  189.         const unsigned char *property,
  190.         size_t property_len);
  191. /* Add a use agent property pragma to the constant and pragma pools of
  192.    the byte-code structure `bc'.  The arguments `name', `property',
  193.    and `scheme' are UTF-8 encoded use agent property and scheme. */
  194. WsBool ws_bc_add_pragma_user_agent_property_and_scheme(
  195.     WsBc *bc,
  196.     const unsigned char *name,
  197.     size_t name_len,
  198.     const unsigned char *property,
  199.     size_t property_len,
  200.     const unsigned char *scheme,
  201.     size_t scheme_len);
  202. /********************* Adding functions *********************************/
  203. /* Add a new function to the function pool of the byte-code structure
  204.    `bc'.  The argument `name' specifies the name of the function for
  205.    external functions.  For internal functions, the `name' argument
  206.    must be NULL.  The argument `num_arguments' specifies the number of
  207.    arguments the function takes.  The argument `num_locals' specifies
  208.    how many local variables the function needs.  The byte-code of the
  209.    function is in `code' and it is `code_size' bytes long.  The
  210.    function takes a copy of the byte-code array `code'.  The caller
  211.    can free / modify the original array, pointed by the argument
  212.    `code', after the function returns.  The function returns WS_TRUE
  213.    if the adding was successfull or WS_FALSE otherwise (out of
  214.    memory). */
  215. WsBool ws_bc_add_function(WsBc *bc, WsUInt8 *index_return,
  216.                           char *name, WsUInt8 num_arguments,
  217.                           WsUInt8 num_locals, WsUInt32 code_size,
  218.                           unsigned char *code);
  219. #endif /* not WSBC_H */