X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FKernel%2Flibc.c;h=b0c083b02ac7b9a4d01dbfc4c0aab615c30b78b2;hb=9edb6f7c288a93d9f9ce3f7233b577a601471071;hp=751497cde5139d9a2bcd470c34c2f041a9038100;hpb=d974878ee8bdb568b6c13219495dcfba35e57eaf;p=tpg%2Facess2.git diff --git a/KernelLand/Kernel/libc.c b/KernelLand/Kernel/libc.c index 751497cd..b0c083b0 100644 --- a/KernelLand/Kernel/libc.c +++ b/KernelLand/Kernel/libc.c @@ -7,6 +7,7 @@ */ #include #include // For MM_* +#include // === CONSTANTS === #define RANDOM_SEED 0xACE55052 @@ -167,6 +168,8 @@ void itoa(char *buf, Uint64 num, int base, int minLength, char pad) // Convert while(num > base-1) { num = DivMod64U(num, base, &rem); // Shift `num` and get remainder + ASSERT(rem >= 0); + ASSERT(rem < base); tmpBuf[pos] = cUCDIGITS[ rem ]; pos++; } @@ -204,7 +207,7 @@ int vsnprintf(char *__s, size_t __maxlen, const char *__format, va_list args) int minSize = 0, precision = -1, len; char tmpBuf[34]; // For Integers const char *p = NULL; - int isLongLong = 0; + int isLongLong = 0, isLong; Uint64 val; size_t pos = 0; // Flags @@ -235,7 +238,10 @@ int vsnprintf(char *__s, size_t __maxlen, const char *__format, va_list args) PUTCH( cUCDIGITS[ (ptr>>(len*4))&15 ] ); continue ; } - + + isLongLong = 0; + isLong = 0; + // - Padding Side Flag if(c == '-') { bPadLeft = 1; @@ -293,6 +299,7 @@ int vsnprintf(char *__s, size_t __maxlen, const char *__format, va_list args) isLongLong = 0; if(c == 'l') // Long is actually the default on x86 { + isLong = 1; c = *__format++; if(c == 'l') { c = *__format++; @@ -356,6 +363,18 @@ int vsnprintf(char *__s, size_t __maxlen, const char *__format, va_list args) // String - Null Terminated Array case 's': + if( isLong ) { + Uint16 *p16 = va_arg(args, Uint16*); + Uint8 tmp[5]; + while( *p16 && precision-- ) { + Uint32 cp; + p16 += ReadUTF16(p16, &cp); + tmp[WriteUTF8(tmp, cp)] = 0; + for(int i = 0; tmp[i] && i<5; i ++) + PUTCH(tmp[i]); + } + break; + } p = va_arg(args, char*); // Get Argument if( !p || !CheckString(p) ) p = "(inval)"; // Avoid #PFs printString: