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

TAPI编程

开发平台:

C/C++

  1. // $Id: arca.c,v 1.2 2006/02/09 19:14:25 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. #include "arca.h"
  20. static fast_codec_t* arca_codec = NULL;
  21. static int cl_count  = 0;
  22. static int cl_decode = 0;
  23. //////////////////////////////////////////////////////////////////////
  24. static insert_order_msg* swap_insert_order_msg (void* data)
  25. {
  26.    insert_order_msg* msg = (insert_order_msg*) data;
  27.    swap16 (msg->size);
  28.    swap32 (msg->time);
  29.    swap32 (msg->seqno);
  30.    swap32 (msg->order_ref);
  31.    swap32 (msg->shares);
  32.    swap32 (msg->price);
  33.    return msg;
  34. }
  35. static delete_order_msg* swap_delete_order_msg (void* data)
  36. {
  37.    delete_order_msg* msg = (delete_order_msg*) data;
  38.    swap16 (msg->size);
  39.    swap32 (msg->time);
  40.    swap32 (msg->seqno);
  41.    swap32 (msg->order_ref);
  42.    return msg;
  43. }
  44. static modify_order_msg* swap_modify_order_msg (void* data)
  45. {
  46.    modify_order_msg* msg = (modify_order_msg*) data;
  47.    swap16 (msg->size);
  48.    swap32 (msg->time);
  49.    swap32 (msg->seqno);
  50.    swap32 (msg->order_ref);
  51.    swap32 (msg->shares);
  52.    swap32 (msg->price);
  53.    return msg;
  54. }
  55. static imbalance_msg* swap_imbalance_msg (void* data)
  56. {
  57.    imbalance_msg* msg = (imbalance_msg*) data;
  58.    swap16 (msg->size);
  59.    swap32 (msg->time);
  60.    swap32 (msg->seqno);
  61.    swap32 (msg->shares);
  62.    swap32 (msg->total_imbal);
  63.    swap32 (msg->market_imbal);
  64.    swap32 (msg->price);
  65.    swap32 (msg->auction_time);
  66.    return msg;
  67. }
  68. //////////////////////////////////////////////////////////////////////
  69. static u32 decode_str (int tag, u8* data, int size)
  70. {
  71.    fast_decode_str (arca_codec, tag, data, size);
  72.    return 0;
  73. }
  74. static u32 decode_u32 (int tag)
  75. {
  76.    u32 temp;
  77.    fast_decode_u32 (arca_codec, tag, & temp);
  78.    return temp;
  79. }
  80. static i32 decode_i32 (int tag)
  81. {
  82.    i32 temp;
  83.    fast_decode_i32 (arca_codec, tag, & temp);
  84.    return temp;
  85. }
  86. static inline void encode_i32 (u32 tag, i32 value)
  87. {
  88.    fast_encode_u32 (arca_codec, tag, value);
  89. }
  90. static inline void encode_u32 (u32 tag, u32 value)
  91. {
  92.    fast_encode_u32 (arca_codec, tag, value);
  93. }
  94. static inline void encode_str (int tag, u8* data, int size)
  95. {
  96.    size = (int) strnlen ((char*) data, size); // remove trailing NULLs
  97.    fast_encode_str (arca_codec, tag, data, size);
  98. }
  99. //////////////////////////////////////////////////////////////////////
  100. static inline void encode_new_msg (u32 tag)
  101. {
  102.    fast_encode_new_msg (arca_codec, tag);
  103. }
  104. static inline void encode_end_msg (u32 tag)
  105. {
  106.    fast_encode_end_msg (arca_codec, tag);
  107. }
  108. //////////////////////////////////////////////////////////////////////
  109. static void decode_insert_order (int type)
  110. {
  111.    insert_order_msg msg [1];
  112.    u32 secs, msecs;
  113.    memset (msg, 0, sizeof (*msg));
  114.    msg->type = 'A';
  115.    msg->size = sizeof (insert_order_msg) - 4;
  116.    secs  = decode_u32 (TSP_SECS);
  117.    msecs = decode_u32 (TSP_MSECS);
  118.    msg->seqno     = decode_u32 (SEQNO);
  119.    msg->order_ref = decode_u32 (ORDER_REF);
  120.    msg->shares    = decode_u32 (SHARES);
  121.    msg->price     = decode_u32 (PRICE);
  122.    msg->scale     = decode_u32 (SCALE);
  123.    msg->exch_code = decode_u32 (EXCH_CODE);
  124.    msg->sys_code  = decode_u32 (SYS_CODE);
  125.    msg->buy_sell  = decode_u32 (BUY_SELL);
  126.    decode_str (STOCK,     STR_ARGS (msg->stock));
  127.    decode_str (QUOTE_ID,  STR_ARGS (msg->quote_id));
  128.    msg->time = secs * 1000 + msecs;
  129.    swap_insert_order_msg (msg);
  130.    write_n (arca_codec->output->fd, msg, sizeof (*msg));
  131. }
  132. //////////////////////////////////////////////////////////////////////
  133. static void decode_delete_order (int type)
  134. {
  135.    delete_order_msg msg [1];
  136.    u32 secs, msecs;
  137.    memset (msg, 0, sizeof (*msg));
  138.    msg->type = 'D';
  139.    msg->size = sizeof (delete_order_msg) - 4;
  140.    secs  = decode_u32 (TSP_SECS);
  141.    msecs = decode_u32 (TSP_MSECS);
  142.    msg->time = secs * 1000 + msecs;
  143.    msg->seqno     = decode_u32 (SEQNO);
  144.    msg->order_ref = decode_u32 (ORDER_REF);
  145.    msg->exch_code = decode_u32 (EXCH_CODE);
  146.    msg->sys_code  = decode_u32 (SYS_CODE);
  147.    msg->buy_sell  = decode_u32 (BUY_SELL);
  148.    decode_str (STOCK,     STR_ARGS (msg->stock));
  149.    decode_str (QUOTE_ID,  STR_ARGS (msg->quote_id));
  150.    swap_delete_order_msg (msg);
  151.    write_n (arca_codec->output->fd, msg, sizeof (*msg));
  152. }
  153. //////////////////////////////////////////////////////////////////////
  154. static void decode_modify_order (int type)
  155. {
  156.    modify_order_msg msg [1];
  157.    u32 secs, msecs;
  158.    memset (msg, 0, sizeof (*msg));
  159.    msg->type = 'M';
  160.    msg->size = sizeof (modify_order_msg) - 4;
  161.    secs  = decode_u32 (TSP_SECS);
  162.    msecs = decode_u32 (TSP_MSECS);
  163.    msg->time = secs * 1000 + msecs;
  164.    msg->seqno     = decode_u32 (SEQNO);
  165.    msg->order_ref = decode_u32 (ORDER_REF);
  166.    msg->shares    = decode_u32 (SHARES);
  167.    msg->price     = decode_u32 (PRICE);
  168.    msg->scale     = decode_u32 (SCALE);
  169.    msg->exch_code = decode_u32 (EXCH_CODE);
  170.    msg->sys_code  = decode_u32 (SYS_CODE);
  171.    msg->buy_sell  = decode_u32 (BUY_SELL);
  172.    decode_str (STOCK,     STR_ARGS (msg->stock));
  173.    decode_str (QUOTE_ID,  STR_ARGS (msg->quote_id));
  174.    swap_modify_order_msg (msg);
  175.    write_n (arca_codec->output->fd, msg, sizeof (*msg));
  176. }
  177. //////////////////////////////////////////////////////////////////////
  178. static void decode_imbalance (int type)
  179. {
  180.    imbalance_msg msg [1];
  181.    u32 secs, msecs;
  182.    memset (msg, 0, sizeof (*msg));
  183.    msg->type = 'I';
  184.    msg->size = sizeof (imbalance_msg) - 4;
  185.    secs  = decode_u32 (TSP_SECS);
  186.    msecs = decode_u32 (TSP_MSECS);
  187.    msg->time = secs * 1000 + msecs;
  188.    msg->seqno  = decode_u32 (SEQNO);
  189.    msg->shares = decode_u32 (SHARES);
  190.    
  191.    msg->price     = decode_u32 (PRICE);
  192.    msg->scale     = decode_u32 (SCALE);
  193.    msg->exch_code = decode_u32 (EXCH_CODE);
  194.    msg->sys_code  = decode_u32 (SYS_CODE);
  195.    decode_str (STOCK, STR_ARGS (msg->stock));
  196.    msg->market_imbal = decode_i32 (MARKET_IMBAL);
  197.    msg->total_imbal  = decode_i32 (TOTAL_IMBAL);
  198.    msg->auction_type = decode_u32 (AUCT_TYPE);
  199.    msg->auction_time = decode_u32 (AUCT_TIME);
  200.    swap_imbalance_msg (msg);
  201.    write_n (arca_codec->output->fd, msg, sizeof (*msg));
  202. }
  203. //////////////////////////////////////////////////////////////////////
  204. static int encode_insert_order (insert_order_msg* msg)
  205. {
  206.    encode_new_msg (ARCA_BASE_TID);
  207.    encode_u32 (MSG_TYPE,  msg->type);
  208.    encode_u32 (TSP_SECS,  msg->time / 1000);
  209.    encode_u32 (TSP_MSECS, msg->time % 1000);
  210.    encode_u32 (SEQNO,     msg->seqno);
  211.    encode_u32 (ORDER_REF, msg->order_ref);
  212.    encode_u32 (SHARES,    msg->shares);
  213.    encode_u32 (PRICE,     msg->price);
  214.    encode_u32 (SCALE,     msg->scale);
  215.    encode_u32 (EXCH_CODE, msg->exch_code);
  216.    encode_u32 (SYS_CODE,  msg->sys_code);
  217.    encode_u32 (BUY_SELL,  msg->buy_sell);
  218.    encode_str (STOCK,     STR_ARGS (msg->stock));
  219.    encode_str (QUOTE_ID,  STR_ARGS (msg->quote_id));
  220.    encode_end_msg (ARCA_BASE_TID);
  221.    return 0;
  222. }
  223. //////////////////////////////////////////////////////////////////////
  224. static int encode_delete_order (delete_order_msg* msg)
  225. {
  226.    encode_new_msg (ARCA_BASE_TID);
  227.    encode_u32 (MSG_TYPE,  msg->type);
  228.    encode_u32 (TSP_SECS,  msg->time / 1000);
  229.    encode_u32 (TSP_MSECS, msg->time % 1000);
  230.    encode_u32 (SEQNO,     msg->seqno);
  231.    encode_u32 (ORDER_REF, msg->order_ref);
  232.    encode_u32 (EXCH_CODE, msg->exch_code);
  233.    encode_u32 (SYS_CODE,  msg->sys_code);
  234.    encode_u32 (BUY_SELL,  msg->buy_sell);
  235.    encode_str (STOCK,     STR_ARGS (msg->stock));
  236.    encode_str (QUOTE_ID,  STR_ARGS (msg->quote_id));
  237.    encode_end_msg (ARCA_BASE_TID);
  238.    return 0;
  239. }
  240. //////////////////////////////////////////////////////////////////////
  241. static int encode_modify_order (modify_order_msg* msg)
  242. {
  243.    encode_new_msg (ARCA_BASE_TID);
  244.    encode_u32 (MSG_TYPE,  msg->type);
  245.    encode_u32 (TSP_SECS,  msg->time / 1000);
  246.    encode_u32 (TSP_MSECS, msg->time % 1000);
  247.    encode_u32 (SEQNO,     msg->seqno);
  248.    encode_u32 (ORDER_REF, msg->order_ref);
  249.    encode_u32 (SHARES,    msg->shares);
  250.    encode_u32 (PRICE,     msg->price);
  251.    encode_u32 (SCALE,     msg->scale);
  252.    encode_u32 (EXCH_CODE, msg->exch_code);
  253.    encode_u32 (SYS_CODE,  msg->sys_code);
  254.    encode_u32 (BUY_SELL,  msg->buy_sell);
  255.    encode_str (STOCK,     STR_ARGS (msg->stock));
  256.    encode_str (QUOTE_ID,  STR_ARGS (msg->quote_id));
  257.    encode_end_msg (ARCA_BASE_TID);
  258.    return 0;
  259. }
  260. //////////////////////////////////////////////////////////////////////
  261. static int encode_imbalance (imbalance_msg* msg)
  262. {
  263.    encode_new_msg (ARCA_BASE_TID);
  264.    encode_u32 (MSG_TYPE,     msg->type);
  265.    encode_u32 (TSP_SECS,     msg->time / 1000);
  266.    encode_u32 (TSP_MSECS,    msg->time % 1000);
  267.    encode_u32 (SEQNO,        msg->seqno);
  268.    encode_u32 (SHARES,       msg->shares);
  269.    encode_u32 (PRICE,        msg->price);
  270.    encode_u32 (SCALE,        msg->scale);
  271.    encode_u32 (EXCH_CODE,    msg->exch_code);
  272.    encode_u32 (SYS_CODE,     msg->sys_code);
  273.    encode_str (STOCK,        STR_ARGS (msg->stock));
  274.    encode_i32 (MARKET_IMBAL, msg->market_imbal);
  275.    encode_i32 (TOTAL_IMBAL,  msg->total_imbal);
  276.    encode_u32 (AUCT_TYPE,    msg->auction_type);
  277.    encode_u32 (AUCT_TIME,    msg->auction_time);
  278.    encode_end_msg (ARCA_BASE_TID);
  279.    return 0;
  280. }
  281. //////////////////////////////////////////////////////////////////////
  282. static int arca_decoder (void)
  283. {
  284.    int count;
  285.    for (count = 1 ;; count ++)
  286.    {
  287.       u32 msg_type;
  288.       if (cl_count > 0 && count > cl_count)
  289.          break;
  290.       if (fast_decode_new_msg (arca_codec, ARCA_BASE_TID) < 0)
  291.          break;
  292.       msg_type = decode_u32 (MSG_TYPE);
  293.       switch (msg_type)
  294.       {
  295.        case 'A':
  296.          decode_insert_order (msg_type);
  297.          break;
  298.        case 'D':
  299.          decode_delete_order (msg_type);
  300.          break;
  301.        case 'M':
  302.          decode_modify_order (msg_type);
  303.          break;
  304.        case 'I':
  305.          decode_imbalance (msg_type);
  306.          break;
  307.        default:
  308.          fprintf (stderr, "fatal: %02x unknown typen", msg_type);
  309.          exit (0);
  310.       }
  311.       if (fast_decode_end_msg (arca_codec, ARCA_BASE_TID) < 0)
  312.          break;
  313.    }
  314.    return 0;
  315. }
  316. static int arca_encoder (void)
  317. {
  318.    char data [128];
  319.    int error = 0;
  320.    int count;
  321.    for (count = 0 ; cl_count == 0 || count < cl_count ; count ++)
  322.    {
  323.       char* hdr  = data;
  324.       char* body = hdr + 4; // VC can't do arith on void*
  325.       int length;
  326.       // Read four bytes header
  327.       if (read_n (arca_codec->input->fd, data, 4) < 0)
  328.          return -1;
  329.       length = (hdr [0] << 8) | hdr [1];
  330.       assert (length <= sizeof (data) - 4);
  331.       // Read the body part
  332.       if (read_n (arca_codec->input->fd, body, length) < 0)
  333.       {
  334.          perror ("read_n: body part");
  335.          break;
  336.       }
  337.       switch (data [2])
  338.       {
  339.        case 'A':
  340.          encode_insert_order (swap_insert_order_msg (data));
  341.          break;
  342.        case 'D':
  343.          encode_delete_order (swap_delete_order_msg (data));
  344.          break;
  345.        case 'I':
  346.          encode_imbalance (swap_imbalance_msg (data));
  347.          break;
  348.        case 'M':
  349.          encode_modify_order (swap_modify_order_msg (data));
  350.          break;
  351.        default:
  352.          fprintf (stderr, "fatal: unknown type='%c'n", data [2]);
  353.          abort ();
  354.       }
  355.       if (error != 0)
  356.          break;
  357.    }
  358.    return 0;
  359. }
  360. //////////////////////////////////////////////////////////////////////
  361. #define OPTS "A:c:DV?"
  362. int main (int argc, char* argv [])
  363. {
  364.    init_platform_io ();
  365.    arca_codec = fast_create_codec ();
  366.    assert (arca_codec != NULL);
  367.    for (;;)
  368.    {
  369.       int option = getopt (argc, argv, OPTS);
  370.       if (option == EOF)
  371.          break;
  372.       switch (option)
  373.       {
  374.        case 'c':
  375.          cl_count = atoi (optarg);
  376.          break;
  377.        case 'D':
  378.          cl_decode = 1;
  379.          break;
  380.        case 'V':
  381.          arca_codec->verbose ++;
  382.          break;
  383.        case '?':
  384.          fprintf (stderr, "encoder [-cDV] <infile >outfilen");
  385.          exit (0);
  386.        default:
  387.          fprintf (stderr, "error: '%c' unknown optionn", option);
  388.          exit (1);
  389.       }
  390.    }
  391.    if (cl_decode)
  392.       arca_decoder ();
  393.    else
  394.       arca_encoder ();
  395.    exit (0);
  396. }