From: hgn Date: Sat, 12 Jul 2025 14:30:05 +0000 (+0000) Subject: some kv/msg stuff X-Git-Url: https://harrygodden.com/git/?a=commitdiff_plain;h=24300b1d0314102bacd51f3123a4e5fee54852eb;p=vg.git some kv/msg stuff --- diff --git a/vg_msg.c b/vg_msg.c index 54ce922..76d96be 100644 --- a/vg_msg.c +++ b/vg_msg.c @@ -1,6 +1,7 @@ #include "vg_msg.h" #include "vg_platform.h" #include "vg_string.h" +#include "vg_kv.h" #include #include @@ -257,7 +258,7 @@ u64 vg_msg_cast_to_u64( const void *src, u8 src_base, u8 src_size ) { if( src_base == k_vg_msg_float ) { - retrun (u64)vg_msg_cast_to_f64( src, src_base, src_size ); + return (u64)vg_msg_cast_to_f64( src, src_base, src_size ); } else { @@ -274,7 +275,7 @@ i64 vg_msg_cast_to_i64( const void *src, u8 src_base, u8 src_size ) { if( src_base == k_vg_msg_float ) { - retrun (i64)vg_msg_cast_to_f64( src, src_base, src_size ); + return (i64)vg_msg_cast_to_f64( src, src_base, src_size ); } else { @@ -303,7 +304,7 @@ f64 vg_msg_cast_to_f64( const void *src, u8 src_base, u8 src_size ) { f32 a = 0; memcpy( &a, src, sizeof(a) ); - return (f64); + return (f64)a; } else if( src_size == 8 ) { @@ -508,3 +509,75 @@ void vg_msg_print( vg_msg *msg, u32 len ) } } } + +void vg_kvs_append_from_legacy_msg2( vg_kvs *kvs, u32 root, void *buffer, u32 len, vg_stack_allocator *stack ) +{ + vg_msg b; + vg_msg_init( &b, buffer, len ); + + u32 frame_stack[ 16 ]; + u32 frame_depth = 0; + frame_stack[0] = root; + + vg_msg_cmd cmd; + while( vg_msg_next( &b, &cmd ) ) + { + if( cmd.code == k_vg_msg_frame ) + { + VG_ASSERT( frame_depth < VG_ARRAY_LEN(frame_stack) ); + u32 next = vg_kv_append( kvs, frame_stack[frame_depth++], cmd.key, NULL ); + } + else + { + if( cmd.code == k_vg_msg_endframe ) + { + VG_ASSERT( frame_depth ); + frame_depth --; + } + else if( cmd.code == k_vg_msg_kvstring ) + { + vg_kv_append( kvs, frame_stack[frame_depth], cmd.key, cmd.value ); + } + else if( cmd.code == k_vg_msg_kvbin ) + { + vg_warn( "Unsupported legacy kv code: binary blob.\n" ); + } + else + { + u32 base = cmd.code & k_vg_msg_type_base_bits, + count = vg_msg_cmd_array_count( cmd.code ), + size = vg_msg_cmd_type_size( cmd.code ); + c8 formatted[ 1024 ]; + formatted[0] = '\0'; + for( u32 i=0; ibuffer == NULL ) + return k_vg_strp_eof; + + *c = *p->buffer; + if( *c == '\0' ) + { + p->buffer = NULL; + return k_vg_strp_eof; + } + p->buffer ++; + + if( *c == '\t' || *c == '\n' || *c == ' ' || *c == '\r' ) + return k_vg_strp_whitespace; + else + return k_vg_strp_ok; +} + +vg_strp_info vg_strp_u64( vg_strp *p, u64 *value ) +{ + c8 c; + vg_strp_info info = k_vg_strp_whitespace; + while( info == k_vg_strp_whitespace ) + info = vg_strp_char( p, &c ); + + u64 result = 0; + bool got = 0; + while( info == k_vg_strp_ok ) + { + if( c >= '0' && c <= '9' ) + { + result = result*10 + ((u64)c - (u64)'0'); + got = 1; + } + else + goto err; + info = vg_strp_char( p, &c ); + } + info = k_vg_strp_ok; + goto ok; + + err: while( info == k_vg_strp_ok ) + info = vg_strp_char( p, &c ); + info = k_vg_strp_error; + + ok: *value = result; + return got? info: k_vg_strp_eof; +} + +vg_strp_info vg_strp_i64( vg_strp *p, i64 *value ) +{ + c8 c; + vg_strp_info info = k_vg_strp_whitespace; + while( info == k_vg_strp_whitespace ) + info = vg_strp_char( p, &c ); + + i64 result = 0, + sign = 1; + + if( c == '+' || c == '-' ) + { + if( c == '-' ) + sign = -1; + info = vg_strp_char( p, &c ); + } + + bool got = 0; + while( info == k_vg_strp_ok ) + { + if( c >= '0' && c <= '9' ) + { + result = result*10 + ((i64)c - (i64)'0'); + got = 1; + } + else + goto err; + + info = vg_strp_char( p, &c ); + } + info = k_vg_strp_ok; + goto ok; + + err: while( info == k_vg_strp_ok ) + info = vg_strp_char( p, &c ); + info = k_vg_strp_error; + + ok: *value = result*sign; + return got? info: k_vg_strp_eof; +} + +vg_strp_info vg_strp_f64( vg_strp *p, f64 *value ) +{ + c8 c; + vg_strp_info info = k_vg_strp_whitespace; + while( info == k_vg_strp_whitespace ) + info = vg_strp_char( p, &c ); + + i64 result = 0, + resultm= 0; + u32 dp = 0; + f64 sign = 1.0; + + if( c == '+' || c == '-' ) + { + if( c == '-' ) + sign = -1.0; + info = vg_strp_char( p, &c ); + } + + bool got = 0, got_decimal = 0; + while( info == k_vg_strp_ok ) + { + if( c == '.' ) + { + if( got_decimal ) + goto err; + resultm = result; + result = 0; + got_decimal = 1; + dp = 0; + } + else if( c >= '0' && c <= '9' ) + { + result = result*10 + ((i64)c - (i64)'0'); + got = 1; + dp ++; + } + else + goto err; + info = vg_strp_char( p, &c ); + } + + info = k_vg_strp_ok; + goto ok; + + err: while( info == k_vg_strp_ok ) + info = vg_strp_char( p, &c ); + info = k_vg_strp_error; + + ok:; + f64 int_part = 0.0, decimal_part = 0.0; + + if( got_decimal ) + { + decimal_part = (f64)result; + for( u32 i=0; i