X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FLibraries%2Flibc.so_src%2Fstring.c;h=6ee6d6cadf58022c8f3283b0d198152cd064f89a;hb=85653b526282abdbcab5c9b2d3aed13b74261aa9;hp=d8d08721f9def9f4fa2e613778288a1f0bfe99fa;hpb=0eb50bc9e604f654bdb0409bb66da03b733f906c;p=tpg%2Facess2.git diff --git a/Usermode/Libraries/libc.so_src/string.c b/Usermode/Libraries/libc.so_src/string.c index d8d08721..6ee6d6ca 100644 --- a/Usermode/Libraries/libc.so_src/string.c +++ b/Usermode/Libraries/libc.so_src/string.c @@ -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 */ @@ -188,13 +200,13 @@ EXPORT char *strrchr(const char *str, int character) * \fn EXPORT char *strstr(char *str1, const char *str2) * \brief Search a \a str1 for the first occurance of \a str2 */ -EXPORT char *strstr(char *str1, const char *str2) +EXPORT char *strstr(const char *str1, const char *str2) { const char *test = str2; for(;*str1;str1++) { - if(*test == '\0') return str1; + if(*test == '\0') return (char*)str1; if(*str1 == *test) test++; else test = str2; } @@ -270,14 +282,23 @@ 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; + const char *sp = (const 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 + if( sp >= dp+count ) + memcpy(dest, src, count); + else if( dp >= sp+count ) memcpy(dest, src, count); + else { + if( sp < dp ) { + while(count--) + dp[count] = sp[count]; + } + else { + while(count--) + *dp++ = *sp++; + } + } return dest; }