X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Flib.c;h=76cc4286268fa0a84f4d2cae83656226fc1ccb91;hb=e56e258bdc6345e33454ddb127b2d87c536a0f39;hp=c4251a63dd7baf84e51df15253e76c663ffd6e13;hpb=193a19846230cd653ca61b65d54538974116c1ea;p=tpg%2Facess2.git diff --git a/Kernel/lib.c b/Kernel/lib.c index c4251a63..76cc4286 100644 --- a/Kernel/lib.c +++ b/Kernel/lib.c @@ -3,6 +3,7 @@ * Common Library Functions */ #include +#include // === CONSTANTS === #define RANDOM_SEED 0xACE55052 @@ -190,11 +191,7 @@ void itoa(char *buf, Uint64 num, int base, int minLength, char pad) /** * \brief Append a character the the vsnprintf output */ -#define PUTCH(c) do{\ - char ch=(c);\ - if(pos==__maxlen){return pos;}\ - if(__s){__s[pos++]=ch;}else{pos++;}\ - }while(0) +#define PUTCH(c) _putch(c) #define GETVAL() do {\ if(isLongLong) val = va_arg(args, Uint64);\ else val = va_arg(args, unsigned int);\ @@ -214,15 +211,24 @@ int vsnprintf(char *__s, size_t __maxlen, const char *__format, va_list args) // Flags int bPadLeft = 0; - //Log("vsnprintf: (__s=%p, __maxlen=%i, __format='%s', ...)", __s, __maxlen, __format); - + auto void _putch(char ch); + + void _putch(char ch) + { + if(pos < __maxlen) + { + if(__s) __s[pos] = ch; + pos ++; + } + } + while((c = *__format++) != 0) { // Non control character if(c != '%') { PUTCH(c); continue; } - + c = *__format++; - //Log("pos = %i", pos); + if(c == '\0') break; // Literal % if(c == '%') { PUTCH('%'); continue; } @@ -231,9 +237,9 @@ int vsnprintf(char *__s, size_t __maxlen, const char *__format, va_list args) if(c == 'p') { Uint ptr = va_arg(args, Uint); PUTCH('*'); PUTCH('0'); PUTCH('x'); - itoa(tmpBuf, ptr, 16, BITS/4, '0'); - p = tmpBuf; - goto printString; + for( len = BITS/4; len --; ) + PUTCH( cUCDIGITS[ (ptr>>(len*4))&15 ] ); + continue ; } // - Padding Side Flag @@ -357,7 +363,7 @@ int vsnprintf(char *__s, size_t __maxlen, const char *__format, va_list args) // String - Null Terminated Array case 's': p = va_arg(args, char*); // Get Argument - if( !CheckString(p) ) p = "(inval)"; // Avoid #PFs + if( !p || !CheckString(p) ) p = "(inval)"; // Avoid #PFs printString: if(!p) p = "(null)"; len = strlen(p); @@ -489,11 +495,11 @@ char *strcpy(char *__str1, const char *__str2) * \brief Copy a string to a new location * \note Copies at most `max` chars */ -char *strncpy(char *__str1, const char *__str2, size_t max) +char *strncpy(char *__str1, const char *__str2, size_t __max) { - while(*__str2 && max-- >= 1) + while(*__str2 && __max-- >= 1) *__str1++ = *__str2++; - if(max) + if(__max) *__str1 = '\0'; // Terminate String return __str1; } @@ -719,37 +725,39 @@ int WriteUTF8(Uint8 *str, Uint32 Val) { // ASCII if( Val < 128 ) { - *str = Val; + if( str ) { + *str = Val; + } return 1; } // Two Byte if( Val < 0x8000 ) { - *str = 0xC0 | (Val >> 6); - str ++; - *str = 0x80 | (Val & 0x3F); + if( str ) { + *str++ = 0xC0 | (Val >> 6); + *str++ = 0x80 | (Val & 0x3F); + } return 2; } // Three Byte if( Val < 0x10000 ) { - *str = 0xE0 | (Val >> 12); - str ++; - *str = 0x80 | ((Val >> 6) & 0x3F); - str ++; - *str = 0x80 | (Val & 0x3F); + if( str ) { + *str++ = 0xE0 | (Val >> 12); + *str++ = 0x80 | ((Val >> 6) & 0x3F); + *str++ = 0x80 | (Val & 0x3F); + } return 3; } // Four Byte if( Val < 0x110000 ) { - *str = 0xF0 | (Val >> 18); - str ++; - *str = 0x80 | ((Val >> 12) & 0x3F); - str ++; - *str = 0x80 | ((Val >> 6) & 0x3F); - str ++; - *str = 0x80 | (Val & 0x3F); + if( str ) { + *str++ = 0xF0 | (Val >> 18); + *str++ = 0x80 | ((Val >> 12) & 0x3F); + *str++ = 0x80 | ((Val >> 6) & 0x3F); + *str++ = 0x80 | (Val & 0x3F); + } return 4; } @@ -821,65 +829,38 @@ int rand(void) */ int CheckString(const char *String) { - if( !MM_GetPhysAddr( (tVAddr)String ) ) + tVAddr addr; + int bUser; + + addr = (tVAddr)String; + + if( !MM_GetPhysAddr( addr ) ) return 0; // Check 1st page - if( MM_IsUser( (tVAddr)String ) ) + bUser = MM_IsUser( addr ); + + while( *(char*)addr ) { - // Traverse String - while( *String ) + if( (addr & (PAGE_SIZE-1)) == 0 ) { - if( !MM_IsUser( (tVAddr)String ) ) + if(bUser && !MM_IsUser(addr) ) return 0; - // Increment string pointer - String ++; - } - return 1; - } - else if( MM_GetPhysAddr( (tVAddr)String ) ) - { - // Traverse String - while( *String ) - { - if( !MM_GetPhysAddr( (tVAddr)String ) ) + if(!bUser && !MM_GetPhysAddr(addr) ) return 0; - // Increment string pointer - String ++; } - return 1; + addr ++; } - return 0; + return 1; } /** * \brief Check if a sized memory region is valid memory + * \return Boolean success */ int CheckMem(const void *Mem, int NumBytes) { - tVAddr addr = (tVAddr)Mem; - - if( MM_IsUser( addr ) ) - { - while( NumBytes-- ) - { - if( !MM_IsUser( addr ) ) - return 0; - addr ++; - } - return 1; - } - else if( MM_GetPhysAddr( addr ) ) - { - while( NumBytes-- ) - { - if( !MM_GetPhysAddr( addr ) ) - return 0; - addr ++; - } - return 1; - } - return 0; + return MM_IsValidBuffer( (tVAddr)Mem, NumBytes ); } /* * * \} @@ -956,12 +937,19 @@ void *memmove(void *__dest, const void *__src, size_t len) char *dest = __dest; const char *src = __src; void *ret = __dest; + + if( len == 0 || dest == src ) + return dest; if( (tVAddr)dest > (tVAddr)src + len ) return memcpy(dest, src, len); if( (tVAddr)dest + len < (tVAddr)src ) return memcpy(dest, src, len); + // NOTE: Assumes memcpy works forward + if( (tVAddr)dest < (tVAddr)src ) + return memcpy(dest, src, len); + if( (tVAddr)dest < (tVAddr)src ) block_size = (tVAddr)src - (tVAddr)dest; else