+static u32 vg_msg_seekkvu32( vg_msg *msg, const char *key, enum vg_msg_dir dir )
+{
+ vg_msg_cmd cmd = vg_msg_seekkv( msg, key, dir );
+ u8 sized_type = cmd.code & k_vg_msg_sized_type_bits;
+
+ u32 result = 0x00;
+ u8 *dst = (void *)(&result);
+ const u8 *src = cmd.value;
+
+ if( (sized_type == k_vg_msg_unsigned) || (sized_type == k_vg_msg_signed) ){
+ u32 bytes = vg_msg_sized_bytecount( cmd.code );
+ if( bytes > 4 ) bytes = 4;
+ for( u32 i=0; i<bytes; i ++ ) dst[i] = src[i];
+ }
+
+ return result;
+}
+
+/* debug the thing */
+static void vg_msg_print( vg_msg *msg ){
+ vg_msg b = *msg;
+ b.cur = 0;
+
+ vg_msg_cmd cmd;
+ while( vg_msg_next( &b, &cmd ) ){
+ if( cmd.code == k_vg_msg_frame ){
+ for( u32 i=0; i<b.depth-1; i++ ) printf( " " );
+ printf( "'%s'[%u]{\n", cmd.key, cmd.key_djb2 );
+ }
+ else {
+ for( u32 i=0; i<b.depth; i++ ) printf( " " );
+
+ if( cmd.code == k_vg_msg_endframe )
+ printf( "}\n" );
+ else if( cmd.code == k_vg_msg_kvstring ){
+ printf( "'%s'[%u]: '%s'[%u]\n", cmd.key, cmd.key_djb2,
+ (char *)cmd.value, cmd.value_djb2 );
+ }
+ else
+ printf( "'%s'[%u]: <binary data>\n", cmd.key, cmd.key_djb2 );
+ }
+ }
+}