X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Flib.c;h=472351cb164bb7f75caeec92de019be2619cce62;hb=9a70d1ed74070f56c34b856f88931b134d429c3a;hp=28edc5617e63f35c434e2aaebadce162d4f721ba;hpb=f6ba89ba93581eea2877276e864869724a4271d7;p=tpg%2Facess2.git diff --git a/Kernel/lib.c b/Kernel/lib.c index 28edc561..472351cb 100644 --- a/Kernel/lib.c +++ b/Kernel/lib.c @@ -81,6 +81,7 @@ EXPORT(ModUtil_SetIdent); EXPORT(UnHex); EXPORT(SwapEndian16); EXPORT(SwapEndian32); +EXPORT(memmove); // === CODE === /** @@ -356,7 +357,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); @@ -948,3 +949,35 @@ Uint32 SwapEndian32(Uint32 Val) { return ((Val&0xFF)<<24) | ((Val&0xFF00)<<8) | ((Val>>8)&0xFF00) | ((Val>>24)&0xFF); } + +void *memmove(void *__dest, const void *__src, size_t len) +{ + size_t block_size; + char *dest = __dest; + const char *src = __src; + void *ret = __dest; + + if( (tVAddr)dest > (tVAddr)src + len ) + return memcpy(dest, src, len); + if( (tVAddr)dest + len < (tVAddr)src ) + return memcpy(dest, src, len); + + if( (tVAddr)dest < (tVAddr)src ) + block_size = (tVAddr)src - (tVAddr)dest; + else + block_size = (tVAddr)dest - (tVAddr)src; + + block_size &= ~0xF; + + while(len >= block_size) + { + memcpy(dest, src, block_size); + len -= block_size; + dest += block_size; + src += block_size; + } + memcpy(dest, src, len); + return ret; + +} +