The C API, FASTMessage.h, defines ffh_fast_message and its related structures. ffh_fast_message and its related structures hold the contents of decoded FAST messages.
Do not modify the contents of the ffh_fast_message and its members in your message-processing code.
When you are done with the ffh_fast_message, invoke the release_message callback on the ffh_mh_info structure.
There will be a ffh_fast_field created for every field defined in the FAST template corresponding to the given ffh_fast_message. This includes any fields absent from the incoming stream. Those ffh_fast_fields have the value of their "present" member set to false.
The ascii_string, utf8_string and byte_vector members of the ffh_vector_data are not '\0' terminated. You must use the length member of the ffh_vector_data to determine their size.
typedef uint8_t byte; typedef enum { FFT_GROUP = 1, FFT_SEQUENCE, FFT_INT32, FFT_UINT32, FFT_INT64, FFT_UINT64, FFT_DECIMAL, FFT_ASCII, FFT_UNICODE, FFT_BYTES } ffh_field_type; typedef struct { const char * name_space; const char * name; } ffh_fast_name; typedef struct { int64_t mantissa; int32_t exponent; } ffh_fast_decimal; typedef struct { size_t length; union { char * ascii_string; byte * utf8_string; byte * byte_vector; }; } ffh_vector_data; typedef struct ffh_fast_field ffh_fast_field; typedef struct { /* An array of fast_field pointers */ ffh_fast_field ** fields; /* The number of entries in the above array */ size_t field_count; }ffh_fast_group; typedef struct { ffh_fast_name template_name; uint64_t template_id; ffh_fast_group data; } ffh_fast_message; typedef struct { size_t length; ffh_fast_group * elements; /* Array of groups */ } ffh_fast_sequence; struct ffh_fast_field { ffh_fast_name name; ffh_field_type type; bool present; union { int32_t int32; uint32_t uint32; int64_t int64; uint64_t uint64; ffh_fast_decimal decimal; ffh_fast_sequence sequence; ffh_fast_group group; ffh_vector_data vector; }; };