Usermode/libc - Fixes and additions from curl
[tpg/acess2.git] / Usermode / Libraries / libc.so_src / string.c
index 2ab271f..0757c24 100644 (file)
@@ -7,6 +7,7 @@
 #include <stdio.h>
 #include <ctype.h>
 #include "lib.h"
+#include <string.h>
 
 /**
  * \fn EXPORT int strcmp(const char *s1, const char *s2)
@@ -282,14 +283,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;
 }
 
@@ -358,3 +368,48 @@ EXPORT size_t strspn(const char *haystack, const char *accept)
        }
        return ret;
 }
+
+EXPORT char *strpbrk(const char *haystack, const char *accept)
+{
+       while( *haystack )
+       {
+               for( int i = 0; accept[i]; i ++ )
+               {
+                       if( accept[i] == *haystack )
+                               return (char*)haystack;
+               }
+       }
+       return NULL;
+}
+
+char *strtok(char *str, const char *delim)
+{
+       static char *__saveptr;
+       return strtok_r(str, delim, &__saveptr);
+}
+char *strtok_r(char *str, const char *delim, char **saveptr)
+{
+       char *pos = (str ? str : *saveptr);
+       
+       while( strchr(delim, *pos) )
+               pos ++;
+
+       if( *pos == '\0' )
+               return NULL;
+
+       char *ret = pos;
+       while( !strchr(delim, *pos) )
+               pos ++;
+       
+       // Cap the returned string
+       // - If we're at the end of the original string, don't shift pos
+       if( *pos != '\0' ) {
+               *pos = '\0';
+               pos ++;
+       }
+       
+       *saveptr = pos;
+       
+       return ret;
+}
+

UCC git Repository :: git.ucc.asn.au