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

手机WAP编程

开发平台:

WINDOWS

  1. /*
  2.  *
  3.  * wsencode.h
  4.  *
  5.  * Author: Markku Rossi <mtr@iki.fi>
  6.  *
  7.  * Copyright (c) 1999-2000 WAPIT OY LTD.
  8.  *  All rights reserved.
  9.  *
  10.  * Encoding and decoding routines to store different types of data to
  11.  * the format, specified by the WMLScript specification.
  12.  *
  13.  */
  14. #ifndef WSENCODE_H
  15. #define WSENCODE_H
  16. /********************* Types and defintions *****************************/
  17. /* Macros to store and restore integers from data buffers. */
  18. #define WS_PUT_UINT8(buf, val)
  19.     do {
  20.         unsigned char *_p = (buf);
  21.         _p[0] = ((val) & 0xff);
  22.     } while (0)
  23. #define WS_PUT_UINT16(buf, val)
  24.     do {
  25.         unsigned char *_p = (buf);
  26.         _p[0] = (((val) & 0xff00) >> 8);
  27.         _p[1] = ((val) & 0xff);
  28.     } while (0)
  29. #define WS_PUT_UINT32(buf, val)
  30.     do {
  31.         unsigned char *_p = (buf);
  32.         _p[0] = (((val) & 0xff000000) >> 24);
  33.         _p[1] = (((val) & 0x00ff0000) >> 16);
  34.         _p[2] = (((val) & 0x0000ff00) >> 8);
  35.         _p[3] = ((val) & 0x000000ff);
  36.     } while (0)
  37. #define WS_GET_UINT8(buf, var)
  38.     do {
  39.         const unsigned char *_p = (buf);
  40.         (var) = _p[0];
  41.     } while (0);
  42. #define WS_GET_UINT16(buf, var)
  43.     do {
  44.         const unsigned char *_p = (buf);
  45.         WsUInt16 _val;
  46.         _val = _p[0];
  47.         _val <<= 8;
  48.         _val |= _p[1];
  49.         (var) = _val;
  50.     } while (0);
  51. #define WS_GET_UINT32(buf, var)
  52.     do {
  53.         const unsigned char *_p = (buf);
  54.         WsUInt32 _val;
  55.         _val = _p[0];
  56.         _val <<= 8;
  57.         _val |= _p[1];
  58.         _val <<= 8;
  59.         _val |= _p[2];
  60.         _val <<= 8;
  61.         _val |= _p[3];
  62.         (var) = _val;
  63.     } while (0);
  64. /* The maximum length of a multi-byte encoded WsUInt32 integer (in
  65.    bytes). */
  66. #define WS_MB_UINT32_MAX_ENCODED_LEN 5
  67. /* Type specifiers for the ws_{encode,decode}_buffer() functions. */
  68. typedef enum
  69. {
  70.     /* The terminator of the encoding list.  This must be the last item
  71.        in all encoding and decoding function calls. */
  72.     WS_ENC_END,
  73.     /* 8 bits of data.  The value must be given as `WsByte'. */
  74.     WS_ENC_BYTE,
  75.     /* A signed 8 bit integer.  The value must be given as `WsInt8'. */
  76.     WS_ENC_INT8,
  77.     /* An unsigned 8 bit integer.  The value must be given as `WsUInt8'. */
  78.     WS_ENC_UINT8,
  79.     /* A signed 16 bit integer.  The value must be given as `WsInt16'. */
  80.     WS_ENC_INT16,
  81.     /* An unsigned 16 bit integer.  The value must be given as `WsUInt16'. */
  82.     WS_ENC_UINT16,
  83.     /* A signed 32 bit integer.  The value must be given as `WsInt32'. */
  84.     WS_ENC_INT32,
  85.     /* An unsigned 32 bit integer.  The value must be given as `WsUInt32'. */
  86.     WS_ENC_UINT32,
  87.     /* An unsigned 16 bit integer in the multi-byte format.  The value
  88.        must be given as `WsUInt16'. */
  89.     WS_ENC_MB_UINT16,
  90.     /* An unsigned 32 bit integer in the multi-byte format.  The value
  91.        must be given as `WsUInt32'. */
  92.     WS_ENC_MB_UINT32,
  93.     /* Binary data specified with two arguments: unsigned char *, size_t */
  94.     WS_ENC_DATA
  95. } WsEncodingSpec;
  96. /********************* Global functions *********************************/
  97. /* Encode the unsigned 32 bit integer `value' to the multi-byte format
  98.    to the buffer `buffer'.  The buffer `buffer' must have at least
  99.    WS_MB_UINT32_MAX_ENCODED_LEN bytes of data.  The function returns a
  100.    pointer, pointing to the beginning of the encoded data.  Note that
  101.    the returned pointer does not necessarily point to the beginning of
  102.    the buffer `buffer'.  The size of the encoded multi-byte value is
  103.    returned in `len_return'. */
  104. unsigned char *ws_encode_mb_uint32(WsUInt32 value, unsigned char *buffer,
  105.                                    size_t *len_return);
  106. /* Decode a multi-byte encoded unsigned integer from the buffer
  107.    `buffer'.  The function returns the decoded value.  The argument
  108.    `len' must contain the length of the buffer `buffer'.  It is set to
  109.    contain the length of the encoded value in the buffer.  The value,
  110.    stored in `len', can be used to skip the multi-byte encoded value
  111.    from the buffer `buffer'. */
  112. WsUInt32 ws_decode_mb_uint32(const unsigned char *buffer, size_t *len);
  113. /* Encode data as specified in the WsEncodingSpec encoded argument
  114.    list `...' into the buffer `buffer'.  The function returns WS_TRUE
  115.    if the encoding was successful or WS_FALSE otherwise (out of
  116.    memory). */
  117. WsBool ws_encode_buffer(WsBuffer *buffer, ...);
  118. /* Decode data from the buffer `buffer', `buffer_len' according to the
  119.    WsEncodingSpec encoded argument list `...'.  The argument list
  120.    `...' must be encoded as in ws_encode_buffer() but the values must
  121.    be replaced with pointers to variables of the type.  The function
  122.    returns the number of bytes decoded from the buffer or 0 if the
  123.    decoding failed. */
  124. size_t ws_decode_buffer(const unsigned char *buffer, size_t buffer_len, ...);
  125. #endif /* not WSENCODE_H */