improved int to string conversion

This commit is contained in:
timerix 2023-01-17 20:47:26 +06:00
parent 105758079a
commit 65c2780b94
2 changed files with 19 additions and 9 deletions

View File

@ -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);
}

View File

@ -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;