X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Flib.c;h=66c966036fa692954f97a76313f54df1b3670ae3;hb=d5834686ad14b66420060192445f06bce85db389;hp=2ce5c980a728c0990944932a75e3b0d3a52c3e59;hpb=3e11c7767641614fbb3fad38fffefa0da9e66919;p=tpg%2Facess2.git diff --git a/Kernel/lib.c b/Kernel/lib.c index 2ce5c980..66c96603 100644 --- a/Kernel/lib.c +++ b/Kernel/lib.c @@ -27,7 +27,7 @@ char *strcpy(char *__str1, const char *__str2); char *strncpy(char *__str1, const char *__str2, size_t max); int strcmp(const char *str1, const char *str2); int strncmp(const char *str1, const char *str2, size_t num); -char *strdup(const char *Str); +char *_strdup(const char *File, int Line, const char *Str); char **str_split(const char *__str, char __ch); int strpos8(const char *str, Uint32 Search); int ReadUTF8(Uint8 *str, Uint32 *Val); @@ -54,7 +54,8 @@ EXPORT(strcpy); EXPORT(strncpy); EXPORT(strcmp); EXPORT(strncmp); -EXPORT(strdup); +//EXPORT(strdup); +EXPORT(_strdup); // Takes File/Line too EXPORT(str_split); EXPORT(strpos8); EXPORT(DivUp); @@ -177,6 +178,10 @@ void itoa(char *buf, Uint num, int base, int minLength, char pad) if(pos==__maxlen){return pos;}\ if(__s){__s[pos++]=ch;}else{pos++;}\ }while(0) +#define GETVAL() do {\ + if(isLongLong) val = va_arg(args, Uint64);\ + else val = va_arg(args, unsigned int);\ + }while(0) /** * \brief VArg String Number Print Formatted */ @@ -214,9 +219,6 @@ int vsnprintf(char *__s, size_t __maxlen, const char *__format, va_list args) goto printString; } - // Get Argument - val = va_arg(args, Uint); - // - Padding Side Flag if(c == '+') { bPadLeft = 1; @@ -233,8 +235,7 @@ int vsnprintf(char *__s, size_t __maxlen, const char *__format, va_list args) // - Minimum length if(c == '*') { // Dynamic length - minSize = val; - val = va_arg(args, Uint); + minSize = va_arg(args, unsigned int); c = *__format++; } else if('1' <= c && c <= '9') @@ -256,9 +257,6 @@ int vsnprintf(char *__s, size_t __maxlen, const char *__format, va_list args) { c = *__format++; if(c == 'l') { - #if BITS == 32 - val |= (Uint64)va_arg(args, Uint) << 32; - #endif c = *__format++; isLongLong = 1; } @@ -270,6 +268,7 @@ int vsnprintf(char *__s, size_t __maxlen, const char *__format, va_list args) { case 'd': case 'i': + GETVAL(); if( isLongLong && val >> 63 ) { PUTCH('-'); val = -val; @@ -281,26 +280,39 @@ int vsnprintf(char *__s, size_t __maxlen, const char *__format, va_list args) itoa(p, val, 10, minSize, pad); goto printString; case 'u': + GETVAL(); itoa(p, val, 10, minSize, pad); goto printString; + case 'X': + #if BITS == 64 + isLongLong = 1; // TODO: Handle non-x86 64-bit archs + #endif + GETVAL(); + itoa(p, val, 16, minSize, pad); + goto printString; + case 'x': + GETVAL(); itoa(p, val, 16, minSize, pad); goto printString; case 'o': + GETVAL(); itoa(p, val, 8, minSize, pad); goto printString; case 'b': + GETVAL(); itoa(p, val, 2, minSize, pad); goto printString; case 'B': //Boolean + val = va_arg(args, unsigned int); if(val) p = "True"; else p = "False"; goto printString; // String - Null Terminated Array case 's': - p = (char*)(tVAddr)val; + p = va_arg(args, char*); // Get Argument printString: if(!p) p = "(null)"; len = strlen(p); @@ -310,7 +322,7 @@ int vsnprintf(char *__s, size_t __maxlen, const char *__format, va_list args) break; case 'C': // Non-Null Terminated Character Array - p = (char*)(tVAddr)val; + p = va_arg(args, char*); if(!p) goto printString; while(minSize--) PUTCH(*p++); break; @@ -318,6 +330,7 @@ int vsnprintf(char *__s, size_t __maxlen, const char *__format, va_list args) // Single Character case 'c': default: + GETVAL(); PUTCH( (Uint8)val ); break; } @@ -451,6 +464,7 @@ int strncmp(const char *Str1, const char *Str2, size_t num) return *Str1-*Str2; } +#if 0 /** * \fn char *strdup(const char *Str) * \brief Duplicates a string @@ -459,9 +473,25 @@ char *strdup(const char *Str) { char *ret; ret = malloc(strlen(Str)+1); + if( !ret ) return NULL; + strcpy(ret, Str); + return ret; +} +#else + +/** + * \fn char *_strdup(const char *File, int Line, const char *Str) + * \brief Duplicates a string + */ +char *_strdup(const char *File, int Line, const char *Str) +{ + char *ret; + ret = Heap_Allocate(File, Line, strlen(Str)+1); + if( !ret ) return NULL; strcpy(ret, Str); return ret; } +#endif /** * \brief Split a string using the passed character