X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FLibraries%2Flibc.so_src%2Fstring.c;h=6ee6d6cadf58022c8f3283b0d198152cd064f89a;hb=85653b526282abdbcab5c9b2d3aed13b74261aa9;hp=3cadee900fc586215180203f2fe2a91eed8481bc;hpb=d0b4559f2936f6d9f06be0f7c3c51527a480ec0d;p=tpg%2Facess2.git diff --git a/Usermode/Libraries/libc.so_src/string.c b/Usermode/Libraries/libc.so_src/string.c index 3cadee90..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( (intptr_t)src < (intptr_t)dest && (intptr_t)dest < (intptr_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; }