Usermode/libc - Fix strchr and strrchr behavior
[tpg/acess2.git] / Usermode / Libraries / libc.so_src / string.c
index ae91b13..09481d8 100644 (file)
@@ -87,8 +87,13 @@ EXPORT char *strcpy(char *dst, const char *src)
 EXPORT char *strncpy(char *dst, const char *src, size_t num)
 {
        char *to = dst;
-       while(*src && num--)    *to++ = *src++;
-       *to = '\0';
+       while(num --)
+       {
+               if(*src)
+                       *to++ = *src++;
+               else
+                       *to++ = '\0';
+       }
        return dst;
 }
 
@@ -125,9 +130,10 @@ EXPORT char *strncat(char *dst, const char *src, size_t n)
  */
 EXPORT size_t strlen(const char *str)
 {
-       size_t  retval;
-       for(retval = 0; *str != '\0'; str++, retval++);
-       return retval;
+       size_t  len = 0;
+       while(str[len] != '\0')
+               len ++;
+       return len;
 }
 
 /**
@@ -137,9 +143,9 @@ EXPORT size_t strlen(const char *str)
  */
 EXPORT size_t strnlen(const char *str, size_t maxlen)
 {
-       size_t  len;
-       for( len = 0; maxlen -- && *str; str ++, len ++ )
-               ;
+       size_t  len = 0;
+       while( len < maxlen && str[len] != '\0' )
+               len ++;
        return len;
 }
 
@@ -178,15 +184,16 @@ EXPORT char *strndup(const char *str, size_t maxlen)
 /**
  * \fn EXPORT char *strchr(char *str, int character)
  * \brief Locate a character in a string
+ * \note The terminating NUL is part of the string
  */
 EXPORT char *strchr(const char *_str, int character)
 {
        const unsigned char* str = (const unsigned char*)_str;
-       for(;*str;str++)
+       do
        {
                if( *str == character )
                        return (char*)str;
-       }
+       } while( *str++ );
        return NULL;
 }
 
@@ -197,11 +204,12 @@ EXPORT char *strchr(const char *_str, int character)
 EXPORT char *strrchr(const char *_str, int character)
 {
        const unsigned char* str = (const unsigned char*)_str;
-       for( int i = strlen(_str); i--; )
+       size_t  i = strlen(_str);
+       do
        {
                if(str[i] == character)
                        return (void*)&str[i];
-       }
+       } while( i -- );
        return NULL;
 }
 

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