improved int to string conversion
This commit is contained in:
parent
105758079a
commit
65c2780b94
@ -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);
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user