fastapi.h
上传用户:myichia
上传日期:2019-01-05
资源大小:217k
文件大小:10k
源码类别:

TAPI编程

开发平台:

C/C++

  1. // $Id: fastapi.h,v 1.2 2006/02/09 19:14:24 Daniel.May Exp $
  2. //
  3. // FIX Adapted for STreaming (sm) (FAST Protocol (sm)) 
  4. //
  5. // Copyright (c) 2005-2006, Pantor Engineering AB (http://www.pantor.com)
  6. // Copyright (c) 2005-2006, SpryWare LLC (http://www.spryware.com)
  7. // Copyright (c) 2005-2006, FIX Protocol Ltd (http://www.fixprotocol.org)
  8. // All Rights Reserved.
  9. //
  10. // This work is distributed under the W3C® Software License [1] in the
  11. // hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
  12. // implied warranty of MERCHANTABILITY, SATISFACTORY QUALITY or FITNESS 
  13. // FOR A PARTICULAR PURPOSE.
  14. //
  15. // [1] http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231
  16. // [FPL's Intellectual Property details] http://www.fixprotocol.org/ip
  17. // [FAST Protocol details] http://www.fixprotocol.org/fast
  18. // [FAST Protocol credits] http://fixprotocol.org/fastcredits
  19. #ifndef _fastapi_h_
  20. #define _fastapi_h_ 1
  21. #include "types.h"
  22. #define STR_ARGS(_x) _x, sizeof (_x)
  23. //////////////////////////////////////////////////////////////////////
  24. typedef enum fast_op_t
  25. {
  26.    FAST_OP_NONE = 0,
  27.    FAST_OP_COPY,
  28.    FAST_OP_INCR,
  29.    FAST_OP_DELTA,
  30. }
  31. fast_op_t;
  32. typedef enum fast_type_t
  33. {
  34.    FAST_TYPE_NULL = 0,
  35.    FAST_TYPE_U32,
  36.    FAST_TYPE_I32,
  37.    FAST_TYPE_STR,
  38. }
  39. fast_type_t;
  40. typedef enum fast_error_t
  41. {
  42.    FAST_ERR_NONE       =  0,
  43.    FAST_ERR_CODEC      = -1,
  44.    FAST_ERR_SIZE       = -2,
  45.    FAST_ERR_VALUE      = -3,
  46.    FAST_ERR_TAG_OP     = -4,
  47.    FAST_ERR_TAG_TYPE   = -5,
  48.    FAST_ERR_CALL_SEQ   = -6,
  49.    FAST_ERR_IO         = -7,
  50. }
  51. fast_error_t;
  52. //////////////////////////////////////////////////////////////////////
  53. #define TAG_MAX_SLOT     0xff // extendable to 0xfff
  54. #define TAG_MAX_TID      0xf  // extendable to 0xfff
  55. #define TAG_MAX_OP       0xf
  56. #define TAG_MAX_TYPE     0xf
  57. #define TAG_SHIFT_SLOT    0
  58. #define TAG_SHIFT_TID    12
  59. #define TAG_SHIFT_OP     24
  60. #define TAG_SHIFT_TYPE   28
  61. #define MAKE_TAG(type,op,tid,slot) 
  62.    (((type) << TAG_SHIFT_TYPE) | ((op)   << TAG_SHIFT_OP) | 
  63.     ((tid)  << TAG_SHIFT_TID)  | ((slot) << TAG_SHIFT_SLOT))
  64. //////////////////////////////////////////////////////////////////////
  65. #define MAX_TAG 64
  66. #define MAX_TID  4
  67. #define MAX_PMAP_BYTES 8
  68. #define MAX_PMAP_BITS  (7 * MAX_PMAP_BYTES)
  69. #define MAX_MSG_SIZE  2048
  70. typedef unsigned int fast_tag_t;
  71. //////////////////////////////////////////////////////////////////////
  72. typedef struct fast_cv_t
  73. {
  74.    i32 i32_values [MAX_TAG];
  75.    u32 u32_values [MAX_TAG];
  76.    u8* str_values [MAX_TAG];
  77.    u32 valid      [MAX_TAG];
  78. }
  79. fast_cv_t;
  80. //////////////////////////////////////////////////////////////////////
  81. typedef struct fast_pmap_t
  82. {
  83.    u8  bits [MAX_PMAP_BITS];
  84.    u32 size;
  85.    u32 max_pos;
  86. }
  87. fast_pmap_t;
  88. typedef struct fast_buffer_t
  89. {
  90.    int fd;
  91.    u8* head;
  92.    u8* tail;
  93.    u8* end;
  94.    u8  data [MAX_MSG_SIZE];
  95. }
  96. fast_buffer_t;
  97. typedef struct fast_codec_error_t
  98. {
  99.    const char*  fn;
  100.    char*        text;
  101.    fast_tag_t   tag;
  102.    fast_error_t code;
  103. }
  104. fast_codec_error_t;
  105. //////////////////////////////////////////////////////////////////////
  106. #define FAST_CODEC_MAGIC 0xC0DEC
  107. typedef struct fast_codec_t
  108. {
  109.    u32 magic;
  110.    const char* name;
  111.    fast_pmap_t pmap [1];
  112.    fast_buffer_t msg    [1];
  113.    fast_buffer_t input  [1];
  114.    fast_buffer_t output [1];
  115.    fast_cv_t cv [TAG_MAX_TID];
  116.    // Config variables
  117.    int count;
  118.    int skip_io;
  119.    int verbose;
  120.    // State variables
  121.    int curr_tag;
  122.    int in_message;
  123.    fast_codec_error_t error [1];
  124. }
  125. fast_codec_t;
  126. //////////////////////////////////////////////////////////////////////
  127. #ifdef __cplusplus
  128. extern "C" {
  129. #endif 
  130. /**
  131.  * @defgroup fastapi fastapi functions
  132.  * @{
  133.  */
  134. /**
  135. * @brief Create and initialize the codec
  136. *
  137. * @return A pointer to opaque type fast_codec_t
  138. *   @remark This function will allocate a segment of memory on your behalf to manage the
  139. *          codec state information.  The pointer returned should be treated as an opaque 
  140. *          handle, it is a required parameter to most other fastapi functions.
  141. */
  142. fast_codec_t* fast_create_codec (void);
  143. /**
  144. * @brief Destroy the codec and release associated memory
  145. *
  146. *  @param codec Pointer to a fast_codec_t
  147. *  @remark  This function will free the segment of memory on your behalf originally allocated by the
  148. *          fast_create_codec() function. The codec is invalid upon return.
  149. */
  150. int  fast_destroy_codec    (fast_codec_t* codec);
  151. /**
  152. * @brief Reset the codec state for a specific tag
  153. *
  154. * @param codec Pointer to a fast_codec_t
  155. * @param tag The fast_codec_tag we are reseting
  156. *   @remark This function will reset the state of the codec for the specific tag.
  157. */
  158. void fast_reset_state      (fast_codec_t* codec, fast_tag_t tag);
  159. /**
  160. * @brief Set the input FILE stream for a codec
  161. *
  162. * @param codec Pointer to a fast_codec_t
  163. * @param fptr FILE Pointer to a FILE stream
  164. *   @remark The default input stream in stdin
  165. */
  166. int  fast_set_codec_input  (fast_codec_t* codec, FILE* fptr);
  167. /**
  168. * @brief Set the output FILE stream for a codec
  169. *
  170. * @param codec Pointer to a fast_codec_t
  171. * @param fptr FILE Pointer to a FILE stream
  172. *   @remark The default output stream in stdout
  173. */
  174. int  fast_set_codec_output (fast_codec_t* codec, FILE* fptr);
  175. /**
  176. * @brief Make a FAST tag
  177. */
  178. fast_tag_t fast_make_tag   (fast_op_t, fast_type_t, u32 tid, u32 slot);
  179. /**
  180. * @brief Decode the first tag of a new message
  181. *
  182. * @param codec Pointer to a fast_codec_t
  183. * @param tag The fast_codec_tag we are decoding
  184. *  @remark This function must be called to decode the first tag of a new message.  
  185. *          The fast_codec_tag should be the template ID
  186. */
  187. int fast_decode_new_msg    (fast_codec_t* codec, fast_tag_t tag);
  188. /**
  189. * @brief Complete the decoding of a message
  190. *
  191. * @param codec Pointer to a fast_codec_t
  192. * @param tag The fast_codec_tag we are decoding
  193. *  @remark This function must be called after the last tag of a message has been decoded  
  194. */
  195. int fast_decode_end_msg    (fast_codec_t* codec, fast_tag_t tag);
  196. /**
  197. * @brief Decode a 32-bit signed integer
  198. *
  199. * @param codec Pointer to a fast_codec_t
  200. * @param tag The fast_codec_tag we are decoding
  201. * @param data Pointer to a i32 that will contain the result
  202. */
  203. int fast_decode_i32        (fast_codec_t* codec, fast_tag_t tag, i32* data);
  204. /**
  205. * @brief Decode a 32-bit unsigned integer
  206. *
  207. * @param codec Pointer to a fast_codec_t
  208. * @param tag The fast_codec_tag we are decoding
  209. * @param data Pointer to a u32 that will contain the result
  210. */
  211. int fast_decode_u32        (fast_codec_t* codec, fast_tag_t tag, u32* data);
  212. /**
  213. * @brief Decode an ASCII String
  214. *
  215. * @param codec Pointer to a fast_codec_t
  216. * @param tag The fast_codec_tag we are decoding
  217. * @param data Pointer to a char * that will contain the result
  218. * @param size The maximum number of chars data can hold
  219. *  @remark The resulting sting will NOT be NULL terminated, this function will only
  220. *          fill the string with char's decoded from the input. 
  221. */
  222. int fast_decode_str        (fast_codec_t* codec, fast_tag_t tag, u8* data, int size);
  223. /**
  224. * @brief Encode the first tag of a new message
  225. *
  226. * @param codec Pointer to a fast_codec_t
  227. * @param tag The fast_codec_tag we are decoding
  228. *  @remark This function must be called to encode the first tag of a new message.  
  229. *          The fast_codec_tag should be the template ID
  230. */
  231. int fast_encode_new_msg    (fast_codec_t* codec, fast_tag_t tag);
  232. /**
  233. * @brief Complete the encoding of a message
  234. *
  235. * @param codec Pointer to a fast_codec_t
  236. * @param tag The fast_codec_tag we are encoding
  237. *  @remark This function must be called after the last tag of a message has been encoded  
  238. */
  239. int fast_encode_end_msg    (fast_codec_t* codec, fast_tag_t tag);
  240. /**
  241. * @brief Encode a 32-bit signed integer
  242. *
  243. * @param codec Pointer to a fast_codec_t
  244. * @param tag The fast_codec_tag we are decoding
  245. * @param data i32 integer containing the value to encode
  246. */
  247. int fast_encode_i32        (fast_codec_t* codec, fast_tag_t tag, i32 data);
  248. /**
  249. * @brief Encode a 32-bit unsigned integer
  250. *
  251. * @param codec Pointer to a fast_codec_t
  252. * @param tag The fast_codec_tag we are decoding
  253. * @param data u32 integer containing the value to encode
  254. */
  255. int fast_encode_u32        (fast_codec_t* codec, fast_tag_t tag, u32 data);
  256. /**
  257. * @brief Encode an ASCII String
  258. *
  259. * @param codec Pointer to a fast_codec_t
  260. * @param tag The fast_codec_tag we are decoding
  261. * @param data char * containing the value to encode
  262. * @param size The number of characters to encode
  263. *  @remark This function will encode exactly size number of char's, it will not 
  264. *          not assume a NULL terminated string.
  265. */
  266. int fast_encode_str        (fast_codec_t* codec, fast_tag_t tag, u8* data, int size);
  267. /**
  268. * @brief Format and print the last reported codec error to a human readable string to a FILE stream
  269. *
  270. *   @param codec Pointer to a fast_codec_t
  271. *   @param fptr  FILE stream
  272. *   @returns The error string
  273. */
  274. int fast_print_error       (fast_codec_t* codec, FILE* fptr);
  275. /**
  276. * @brief Convert the last reported codec error to a human readable string
  277. *
  278. *   @param codec Pointer to a fast_codec_t
  279. *   @returns The error string
  280. */
  281. const char* fast_error_string (fast_codec_t* codec);
  282. /**
  283. * @brief Convert a u8 byte arrray of characters to a u32
  284. *
  285. * @param  data Pointer to a u8 containing ASCII number
  286. * @param  size Lenght of data
  287. *  @returns The converted u32 number
  288. *  @remark This function will convert an ASCII string of numbers to a binary value
  289. *          All characters must be in range of '0' - '9'
  290. */
  291. u32 fast_ascii_to_u32 (u8* data, int size);
  292. /** @} */
  293. #ifdef __cplusplus
  294. }
  295. #endif
  296. #endif // _fastapi_h_