quantization functions
[vg.git] / vg_msg.h
index 0aef31e0597c559de314171d12acd35791a0b429..ce012a6fc7bc6e0883b4df78b66a07992c613b45 100644 (file)
--- a/vg_msg.h
+++ b/vg_msg.h
@@ -118,7 +118,7 @@ enum vg_msg_code{
    k_vg_msg_8b  = 0x00,
    k_vg_msg_16b = 0x01,
    k_vg_msg_32b = 0x02,
-   k_vg_msg_64b = 0x04,
+   k_vg_msg_64b = 0x03,
 };
 
 typedef struct vg_msg vg_msg;
@@ -264,7 +264,7 @@ static void vg_msg_wkvbin( vg_msg *msg, const char *key, u8 *bin, u32 len ){
 /* get the byte count of a sized code */
 static u32 vg_msg_sized_bytecount( u8 code ){
    u32 size  = 0x1 << (code & k_vg_msg_size_bits),
-       count = (code & k_vg_msg_array_count_bits) + 1;
+       count = ((code & k_vg_msg_array_count_bits)>>2) + 1;
    return size * count;
 }
 
@@ -282,6 +282,10 @@ static void vg_msg_wkvu32( vg_msg *msg, const char *key, u32 value ){
    vg_msg_wkvnum( msg, key, k_vg_msg_unsigned|k_vg_msg_32b, 1, &value );
 }
 
+static void vg_msg_wkvu64( vg_msg *msg, const char *key, u64 value ){
+   vg_msg_wkvnum( msg, key, k_vg_msg_unsigned|k_vg_msg_64b, 1, &value );
+}
+
 /*
  * The stream reading interface
  * -----------------------------------------------------------------------------
@@ -301,7 +305,7 @@ static int vg_msg_next( vg_msg *msg, vg_msg_cmd *cmd ){
    */
    if( cmd->code == 0x44 ) cmd->code = 0x82;
 #endif
-
+   cmd->key_djb2 = 0;
    if( msg->error != k_vg_msg_error_OK ) return 0;
 
    if( cmd->code == k_vg_msg_frame ){
@@ -436,24 +440,40 @@ static const char *vg_msg_seekkvstr( vg_msg *msg, const char *key,
    else return NULL;
 }
 
-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;
+static u64 vg_msg_read_as_u64( vg_msg_cmd *cmd ){
+   u8 sized_type = cmd->code & k_vg_msg_sized_type_bits;
 
-   u32 result = 0x00;
+   u64 result = 0x00;
    u8 *dst = (void *)(&result);
-   const u8 *src = cmd.value;
+   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;
+      u32 bytes = vg_msg_sized_bytecount( cmd->code );
+      if( bytes > 8 ) bytes = 8;
       for( u32 i=0; i<bytes; i ++ ) dst[i] = src[i];
    }
 
    return result;
 }
 
+static void 
+vg_msg_convert_num( vg_msg_cmd *cmd, u8 type, u32 count, void *result ){
+   u8 code = type | ((count-1)<<2);
+   if( code != cmd->code ) return;
+
+   const u8 *src = cmd->value;
+   u8 *dst = result;
+
+   u32 bytes = vg_msg_sized_bytecount( cmd->code );
+   for( u32 i=0; i<bytes; i ++ ) dst[i] = src[i];
+}
+
+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 );
+   return vg_msg_read_as_u64( &cmd );
+}
+
 /* debug the thing */
 static void vg_msg_print( vg_msg *msg ){
    vg_msg b = *msg;