+/**
+ * \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(const char *_str, int character)
+{
+ const unsigned char* str = (const unsigned char*)_str;
+ for(;*str;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(const char *_str, int character)
+{
+ const unsigned char* str = (const unsigned char*)_str;
+ for( int i = strlen(_str); i--; )
+ {
+ if(str[i] == character)
+ return (void*)&str[i];
+ }
+ return NULL;
+}
+
+/**
+ * \fn EXPORT char *strstr(char *str1, const char *str2)
+ * \brief Search a \a str1 for the first occurance of \a str2
+ */
+EXPORT char *strstr(const char *str1, const char *str2)
+{
+ const char *test = str2;
+
+ for(;*str1;str1++)
+ {
+ if(*test == '\0') return (char*)str1;
+ if(*str1 == *test) test++;
+ else test = str2;
+ }
+ return NULL;
+}
+