- 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 )
- for(;count--;) dp[count] = sp[count];
- else
- for(;count--;) *dp++ = *sp++;
- return dest;
+ const char *sp = (const char *)src;
+ char *dp = (char *)dest;
+ // Check if the areas overlap
+ 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;
+}
+
+/**
+ * \fn EXPORT int memcmp(const void *mem1, const void *mem2, size_t count)
+ * \brief Compare two regions of memory
+ * \param mem1 Region 1
+ * \param mem2 Region 2
+ * \param count Number of bytes to check
+ */
+EXPORT int memcmp(const void *mem1, const void *mem2, size_t count)
+{
+ const unsigned char *p1 = mem1, *p2 = mem2;
+ while(count--)
+ {
+ if( *p1 != *p2 )
+ return *p1 - *p2;
+ p1 ++;
+ p2 ++;
+ }
+ return 0;
+}
+
+/**
+ * \fn EXPORT void *memchr(void *ptr, int value, size_t num)
+ * \brief Locates the first occurence of \a value starting at \a ptr
+ * \param ptr Starting memory location
+ * \param value Value to find
+ * \param num Size of memory area to check
+ */
+EXPORT void *memchr(const void *ptr, int value, size_t num)
+{
+ while(num--)
+ {
+ 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;