From c45009543c686d5f2346c1ec2970f8cb49081f90 Mon Sep 17 00:00:00 2001 From: hgn Date: Thu, 17 Jul 2025 09:27:37 +0000 Subject: [PATCH] Some more string stuff yay --- vg_build.h | 2 +- vg_msg.c | 31 ++++++------ vg_string.c | 132 +++++++++++++++++++++++++++------------------------- vg_string.h | 8 +++- 4 files changed, 89 insertions(+), 84 deletions(-) diff --git a/vg_build.h b/vg_build.h index 4063e1a..ccf93e9 100644 --- a/vg_build.h +++ b/vg_build.h @@ -287,7 +287,7 @@ vg_compiler_run( struct vg_project *project, if( env->optimization ) { vg_strcat( &cmd, " -O" ); - vg_strcati32( &cmd, env->optimization ); + vg_strcati64( &cmd, env->optimization, 10 ); } else { diff --git a/vg_msg.c b/vg_msg.c index d50a11b..3edea5b 100644 --- a/vg_msg.c +++ b/vg_msg.c @@ -549,33 +549,30 @@ void vg_kvs_append_from_legacy_msg2( vg_kvs *kvs, u32 root, void *buffer, u32 le count = vg_msg_cmd_array_count( cmd.code ), size = vg_msg_cmd_type_size( cmd.code ); c8 formatted[ 1024 ]; - formatted[0] = '\0'; + vg_str value_str; + vg_strnull( &value_str, formatted, sizeof(formatted) ); + for( u32 i=0; ii --; } -/* - * FIXME: Negative numbers - */ -void vg_strcati32( vg_str *str, i32 value ){ vg_strcatu64( str, (u64)value, 10 ); } -void vg_strcatu64( vg_str *str, u64 value, u64 base ) -{ - const char *digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; - if( value ) - { - char temp[32]; - int i=0; - while( value && (i<31) ) - { - u32 digit = (u32)(value % base); - temp[ i ++ ] = digits[digit]; - value /= base; - } - - char reverse[32]; - for( int j=0; j=n ) - break; - - temp[ n-1 - (i ++) ] = '0' + (value % 10); - value /= 10; - } - - for( ;ii == -1 ) return 0; @@ -492,32 +444,80 @@ vg_strp_info vg_strp_f64( vg_strp *p, f64 *value ) return (got||got_decimal)? info: k_vg_strp_eof; } -void vg_strcatu64_internal( vg_str *str, u64 value, u64 base, u32 max_numbers ) +static u32 vg_strcatu64_internal( c8 reverse_buffer[64], u64 value, u64 base, u32 max_characters ) { - const char *digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + VG_ASSERT( base >= 2 ); + + if( max_characters == 0 ) + max_characters = 64; + + const c8 *digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; if( value ) { - char temp[32]; - int i=0; - while( value && (i= 2 ); + + c8 temp[65]; + u32 digits = vg_strcatu64_internal( temp, value<0? -value: value, base, 0 ); + if( value < 0 ) + temp[ digits ++ ] = '-'; + + u32 padding = 0; + if( digits > width ) + padding = 0; + else + padding = width - digits; + + for( u32 i=0; i= 2 ); + + c8 temp[64]; + u32 digits = vg_strcatu64_internal( temp, value, base, 0 ); + for( u32 i=0; i= 2 ); + + if( value < 0 ) + { + vg_strcatch( str,'-' ); + value = -value; + } + vg_strcatu64( str, value, base ); } void vg_strcatf64( vg_str *str, f64 value, u64 base, u32 decimal_places ) { + VG_ASSERT( decimal_places ); + VG_ASSERT( base >= 2 ); + if( value < 0.0 ) { value = -value; @@ -531,7 +531,11 @@ void vg_strcatf64( vg_str *str, f64 value, u64 base, u32 decimal_places ) u64 decimal_part = (u64)((f64)m * value + 0.5), normal_part = (u64)value; - vg_strcatu64_internal( str, normal_part, base, 31 ); + vg_strcatu64( str, normal_part, base ); vg_strcat( str, "." ); - vg_strcatu64_internal( str, decimal_part, base, decimal_places ); + + c8 temp[64]; + u32 digits = vg_strcatu64_internal( temp, decimal_part, base, decimal_places ); + for( u32 i=0; i