+#include "vg_platform.h"
+
+/*
+ * Example data:
+ * kvstr "someinfo"
+ * kvint 200
+ * frame "person"{
+ * name "jeff"
+ * country "england"
+ * }
+ * frame "building"{
+ * capacity 1000
+ * }
+ * frame "person"{
+ * country "wales"
+ * name "micheal"
+ * }
+ *
+ * Creating the data in code:
+ * -----------------------------------------------------------------------------
+ * u8 data_buf[512];
+ * vg_msg data;
+ * vg_msg_init( &data, data_buf, 512 );
+ * vg_msg_wkvstr( &data, "kvstr", "someinfo" );
+ * vg_msg_wkvint( &data, "kvint", i32 value=200 );
+ *
+ * vg_msg_frame( &data, "person" );
+ * vg_msg_wkvstr( &data, "name", "jeff" );
+ * vg_msg_wkvstr( &data, "country", "england" );
+ * vg_msg_end_frame( &data );
+ *
+ * vg_msg_frame( &data, "building" );
+ * vg_msg_wkvint( &data, "capacity", i32 value=1000 );
+ * vg_msg_end_frame( &data );
+ *
+ * vg_msg_frame( &data, "person" );
+ * vg_msg_wkvstr( &data, "country", "wales" );
+ * vg_msg_wkvstr( &data, "name", "micheal" );
+ * vg_msg_end_frame( &data );
+ *
+ * Saving the data out
+ * -----------------------------------------------------------------------------
+ *
+ * if( data.error == k_vg_msg_error_OK ){
+ * // write data_buf, for length data.cur
+ * }
+ *
+ * Load the data
+ * -----------------------------------------------------------------------------
+ *
+ * u8 data_buf[512];
+ * u32 data_len;
+ * // read data_buf and data_len
+ * vg_msg data;
+ * vg_msg_init( &data, data_buf, data_len );
+ *
+ * Reading back the stream linearly
+ * -----------------------------------------------------------------------------
+ *
+ * vg_msg_cmd cmd;
+ * while( vg_msg_next( &data, &cmd ) ){
+ * if( cmd.code == k_vg_msg_code_frame ) printf( "{" );
+ * else if( cmd.code == k_vg_msg_code_endframe ) printf( "}" );
+ * esle if( cmd.code == k_vg_msg_code_kvstring )
+ * printf( "string: %s\n", cmd.value._buf );
+ * }
+ *
+ * Reading back the stream as frames/nodes. this is obviously slower
+ * -----------------------------------------------------------------------------
+ *
+ * vg_msg person = data
+ * while( vg_msg_seekframe( &person, "person", VG_MSG_NEXT ) ){
+ * const char *name = vg_msg_seekkvstr(&person, "name", VG_MSG_NEXT);
+ * const char *country = vg_msg_seekkvstr(&person, "country", VG_MSG_FIRST);
+ *
+ * printf( "Guy '%s' is from '%s'\n", name, country );
+ * vg_msg_skip_frame(&person);
+ * }
+ *
+ * vg_msg building = root;
+ * if( vg_msg_seekframe( &building, "building", VG_MSG_FIRST ) ){
+ * vg_msg_cmd capacity = vg_msg_seekkv(&building, "capacity", VG_MSG_FIRST);
+ * if( capacity.code & k_vg_msg_code_signed )
+ * print( "building capacity: %d\n", capacity.value._i32 );
+ *
+ * vg_msg_skip_frame( &building );
+ * }
+ *
+ */