X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FLibraries%2Flibc.so_src%2Fstring.c;h=3d30f1c6e23b50d4e93623a6ac65b096d5525575;hb=b61c005e743f800ed53fb4e7da664edd1ade3fba;hp=a5becf8bdebe419a725841f8c020bfbdfd3d8c90;hpb=2a7cece725060661c2c024a46c1d8c7cb9e2e2e2;p=tpg%2Facess2.git diff --git a/Usermode/Libraries/libc.so_src/string.c b/Usermode/Libraries/libc.so_src/string.c index a5becf8b..3d30f1c6 100644 --- a/Usermode/Libraries/libc.so_src/string.c +++ b/Usermode/Libraries/libc.so_src/string.c @@ -14,7 +14,7 @@ */ EXPORT int strcmp(const char *s1, const char *s2) { - while(*s1 == *s2 && *s1 != '\0' && *s2 != '\0') { + while(*s1 && *s1 == *s2) { s1++; s2++; } return (int)*s1 - (int)*s2; @@ -26,7 +26,7 @@ EXPORT int strcmp(const char *s1, const char *s2) */ EXPORT int strncmp(const char *s1, const char *s2, size_t n) { - while(n && *s1 == *s2 && *s1 != '\0' && *s2 != '\0') + while(n && *s1 && *s1 == *s2) { s1++; s2++; n --; @@ -100,6 +100,18 @@ EXPORT char *strcat(char *dst, const char *src) return dst; } +EXPORT char *strncat(char *dst, const char *src, size_t n) +{ + char *to = dst; + // Find the end + while(*to) to++; + // Copy + while(*src && n--) *to++ = *src++; + // End string + *to = '\0'; + return dst; +} + /** * \brief Get the length of a string */ @@ -229,6 +241,21 @@ EXPORT void *memcpy(void *__dest, const void *__src, size_t count) const char *sp = __src; while(count--) *dp++ = *sp ++; } + // TODO: Bulk aligned copies + #if 0 + else if(count > 128 && (dst & 15) == (src & 15) ) + { + // SSE/bulk copy + for( ; dst & 15; count -- ) + *(char*)dst++ = *(char*)src++; + memcpy_16byte(dst, src, count / 16); + dst += count & ~15; + src += count & ~15; + count &= 15; + while(count --) + *(char*)dst++ = *(char*)src++; + } + #endif else { void **dp, **sp; @@ -255,14 +282,15 @@ EXPORT void *memcpy(void *__dest, const void *__src, size_t count) */ EXPORT void *memmove(void *dest, const void *src, size_t count) { - char *sp = (char *)src; - char *dp = (char *)dest; - // Check if corruption will happen - if( (intptr_t)dest > (intptr_t)src && (intptr_t)dest < (intptr_t)src+count ) - for(;count--;) dp[count] = sp[count]; + char *sp = (char *)src; + char *dp = (char *)dest; + // Check if the areas overlap + if( (uintptr_t)src < (uintptr_t)dest && (uintptr_t)dest < (uintptr_t)src+count ) + for(;count--;) + dp[count] = sp[count]; else - for(;count--;) *dp++ = *sp++; - return dest; + memcpy(dest, src, count); + return dest; } /** @@ -274,12 +302,13 @@ EXPORT void *memmove(void *dest, const void *src, size_t count) */ EXPORT int memcmp(const void *mem1, const void *mem2, size_t count) { + const unsigned char *p1 = mem1, *p2 = mem2; while(count--) { - if( *(unsigned char*)mem1 != *(unsigned char*)mem2 ) - return *(unsigned char*)mem1 - *(unsigned char*)mem2; - mem1 ++; - mem2 ++; + if( *p1 != *p2 ) + return *p1 - *p2; + p1 ++; + p2 ++; } return 0; }