#include <acess/sys.h>
#include <stdlib.h>
#include <stdio.h>
+#include <ctype.h>
#include "lib.h"
/**
return (int)*s1 - (int)*s2;
}
+/**
+ * \fn EXPORT int strncmp(const char *s1, const char *s2)
+ * \brief Compare two strings
+ */
+EXPORT int strncmp(const char *s1, const char *s2, size_t n)
+{
+ if( n == 0 ) return 0;
+ while(n -- && *s1 == *s2 && *s1 != '\0' && *s2 != '\0') {
+ s1++; s2++;
+ }
+ return (int)*s1 - (int)*s2;
+}
+
+EXPORT int strcasecmp(const char *s1, const char *s2)
+{
+ int rv;
+ while( (rv = toupper(*s1) - toupper(*s2)) == 0 && *s1 != '\0' && *s2 != '\0' ) {
+ s1++; s2++;
+ }
+ return rv;
+}
+
+EXPORT int strncasecmp(const char *s1, const char *s2, size_t n)
+{
+ int rv = 0;
+ if( n == 0 ) return 0;
+ while(n -- && (rv = toupper(*s1) - toupper(*s2)) == 0 && *s1 != '\0' && *s2 != '\0') {
+ s1++; s2++;
+ }
+ return rv;
+}
+
/**
* \fn EXPORT char *strcpy(char *dst, const char *src)
* \brief Copy a string to another
}
/**
- * \fn EXPORT int strlen(const char *str)
* \brief Get the length of a string
*/
-EXPORT int strlen(const char *str)
+EXPORT size_t strlen(const char *str)
{
- int retval;
- for(retval = 0; *str != '\0'; str++)
- retval++;
+ size_t retval;
+ for(retval = 0; *str != '\0'; str++, retval++);
return retval;
}
/**
- * \fn EXPORT int strncmp(const char *s1, const char *s2, size_t len)
- * \brief Compare two strings with a limit
+ * \brief Get the length of a string, with a maximum of \a maxlen
+ *
+ * Gets the length of a string (excluding the terminating \0 byte)
*/
-EXPORT int strncmp(const char *s1, const char *s2, size_t len)
+EXPORT size_t strnlen(const char *str, size_t maxlen)
{
- while(--len && *s1 == *s2 && *s1 != '\0' && *s2 != '\0') {
- s1++; s2++;
- }
- return (int)*s1 - (int)*s2;
+ size_t len;
+ for( len = 0; maxlen -- && *str; str ++, len ++ );
+ return len;
}
/**
return ret;
}
+/**
+ * \fn EXPORT char *strndup(const char *str, size_t maxlen)
+ * \brief Duplicate a string into the heap with a maximum length
+ * \param str Input string buffer
+ * \param maxlen Maximum valid size of the \a str buffer
+ * \return Heap string with the same value of \a str
+ */
+EXPORT char *strndup(const char *str, size_t maxlen)
+{
+ size_t len;
+ char *ret;
+ for( len = 0; len < maxlen && str[len]; len ++) ;
+ ret = malloc( len + 1);
+ memcpy( ret, str, len );
+ ret[len] = '\0';
+ return ret;
+}
+
/**
* \fn EXPORT char *strchr(char *str, int character)
* \brief Locate a character in a string
*/
-EXPORT char *strchr(char *str, int character)
+EXPORT char *strchr(const char *str, int character)
{
- while(*str)
+ for(;*str;str++)
{
- if(*str == character) return str;
+ if(*str == character)
+ return (char*)str;
}
return NULL;
}
* \fn EXPORT char *strrchr(char *str, int character)
* \brief Locate the last occurance of a character in a string
*/
-EXPORT char *strrchr(char *str, int character)
+EXPORT char *strrchr(const char *str, int character)
{
int i;
i = strlen(str)-1;
while(i--)
{
- if(str[i] == character) return &str[i];
+ if(str[i] == character)
+ return (void*)&str[i];
}
return NULL;
}
{
const char *test = str2;
- while(*str1)
+ for(;*str1;str1++)
{
if(*test == '\0') return str1;
if(*str1 == *test) test++;
else test = str2;
- str1 ++;
}
return NULL;
}
char *sp = (char *)src;
char *dp = (char *)dest;
// Check if corruption will happen
- if( (unsigned int)dest > (unsigned int)src && (unsigned int)dest < (unsigned int)src+count )
+ if( (intptr_t)dest > (intptr_t)src && (intptr_t)dest < (intptr_t)src+count )
for(;count--;) dp[count] = sp[count];
else
for(;count--;) *dp++ = *sp++;
* \param value Value to find
* \param num Size of memory area to check
*/
-EXPORT void *memchr(void *ptr, int value, size_t num)
+EXPORT void *memchr(const void *ptr, int value, size_t num)
{
while(num--)
{
- if( *(unsigned char*)ptr == (unsigned char)value )
- return ptr;
+ if( *(const unsigned char*)ptr == (unsigned char)value )
+ return (void*)ptr;
ptr ++;
}
return NULL;
}
+
+EXPORT size_t strcspn(const char *haystack, const char *reject)
+{
+ size_t ret = 0;
+ int i;
+ while( *haystack )
+ {
+ for( i = 0; reject[i] && reject[i] == *haystack; i ++ );
+
+ if( reject[i] ) return ret;
+ ret ++;
+ }
+ return ret;
+}
+
+EXPORT size_t strspn(const char *haystack, const char *accept)
+{
+ size_t ret = 0;
+ int i;
+ while( *haystack )
+ {
+ for( i = 0; accept[i] && accept[i] == *haystack; i ++ );
+
+ if( !accept[i] ) return ret;
+ ret ++;
+ }
+ return ret;
+}