From 65c2780b94fbecfe435a72ad7a6369250b8ee1ee Mon Sep 17 00:00:00 2001 From: timerix Date: Tue, 17 Jan 2023 20:47:26 +0600 Subject: [PATCH] improved int to string conversion --- src/base/type_system/base_toString.c | 17 ++++++++++------- src/kprint/kprintf.c | 11 +++++++++-- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/base/type_system/base_toString.c b/src/base/type_system/base_toString.c index 61b7085..9101bec 100644 --- a/src/base/type_system/base_toString.c +++ b/src/base/type_system/base_toString.c @@ -31,29 +31,32 @@ char* __toString_bool(void* c, uint32 fmt) { } char* toString_int(int64 n){ - int64 d=n; + int64 d=n<0 ? -1*n : n; char str[32]; uint8 i=sizeof(str); str[--i]=0; - while(d!=0){ + if(d==0) + str[--i]='0'; + else while(d!=0){ str[--i]='0' + d%10; d/=10; } - if(n>>63) + if(n<0) str[--i]='-'; return cptr_copy((char*)str+i); } char* toString_uint(uint64 n, bool withPostfix, bool uppercase){ - uint64 d=n; char str[32]; uint8 i=sizeof(str); str[--i]=0; if(withPostfix) str[--i]= uppercase ? 'U' : 'u'; - while(d!=0){ - str[--i]='0' + d%10; - d/=10; + if(n==0) + str[--i]='0'; + else while(n!=0){ + str[--i]='0' + n%10; + n/=10; } return cptr_copy((char*)str+i); } diff --git a/src/kprint/kprintf.c b/src/kprint/kprintf.c index 631b063..c39073d 100644 --- a/src/kprint/kprintf.c +++ b/src/kprint/kprintf.c @@ -53,19 +53,26 @@ void kprintf(const char* format, ...){ for(char c=format[i++]; c!=0; c=format[i++]){ if(c=='%'){ char* argstr=NULL; + bool l=false; c=format[i++]; format_escape_seq: switch (c) { case 'u': - argstr=toString_uint(va_arg(vl, uint64),0,0); + argstr=toString_uint( + l ? va_arg(vl, uint64) : va_arg(vl, uint32) + ,0,0); break; case 'i': case 'd': - argstr=toString_int(va_arg(vl, uint64)); + argstr=toString_int( + l ? va_arg(vl, int64) : va_arg(vl, int32) + ); break; case 'f': + // float32 is promoted to float64 when passed through '...' argstr=toString_float(va_arg(vl, float64),0,0); break; case 'l': + l=true; if((c=format[i++])) goto format_escape_seq; break;