2 * AcessOS Basic C Library
12 * \fn EXPORT int strcmp(const char *s1, const char *s2)
13 * \brief Compare two strings
15 EXPORT int strcmp(const char *s1, const char *s2)
17 while(*s1 == *s2 && *s1 != '\0' && *s2 != '\0') {
20 return (int)*s1 - (int)*s2;
24 * \fn EXPORT int strncmp(const char *s1, const char *s2)
25 * \brief Compare two strings
27 EXPORT int strncmp(const char *s1, const char *s2, size_t n)
29 if( n == 0 ) return 0;
30 while(n -- && *s1 == *s2 && *s1 != '\0' && *s2 != '\0') {
33 return (int)*s1 - (int)*s2;
36 EXPORT int strcasecmp(const char *s1, const char *s2)
39 while( (rv = toupper(*s1) - toupper(*s2)) == 0 && *s1 != '\0' && *s2 != '\0' ) {
45 EXPORT int strncasecmp(const char *s1, const char *s2, size_t n)
48 if( n == 0 ) return 0;
49 while(n -- && (rv = toupper(*s1) - toupper(*s2)) == 0 && *s1 != '\0' && *s2 != '\0') {
56 * \fn EXPORT char *strcpy(char *dst, const char *src)
57 * \brief Copy a string to another
59 EXPORT char *strcpy(char *dst, const char *src)
71 * \fn EXPORT char *strncpy(char *dst, const char *src)
72 * \brief Copy at most \a num characters from \a src to \a dst
75 EXPORT char *strncpy(char *dst, const char *src, size_t num)
78 while(*src && num--) *to++ = *src++;
84 * \fn EXPORT char *strcat(char *dst, const char *src)
85 * \brief Append a string onto another
87 EXPORT char *strcat(char *dst, const char *src)
93 while(*src) *to++ = *src++;
100 * \brief Get the length of a string
102 EXPORT size_t strlen(const char *str)
105 for(retval = 0; *str != '\0'; str++, retval++);
110 * \brief Get the length of a string, with a maximum of \a maxlen
112 * Gets the length of a string (excluding the terminating \0 byte)
114 EXPORT size_t strnlen(const char *str, size_t maxlen)
117 for( len = 0; maxlen -- && *str; str ++, len ++ );
122 * \fn EXPORT char *strdup(const char *str)
123 * \brief Duplicate a string using heap memory
124 * \note Defined in POSIX Spec, not C spec
126 EXPORT char *strdup(const char *str)
128 size_t len = strlen(str);
129 char *ret = malloc(len+1);
130 if(ret == NULL) return NULL;
136 * \fn EXPORT char *strndup(const char *str, size_t maxlen)
137 * \brief Duplicate a string into the heap with a maximum length
138 * \param str Input string buffer
139 * \param maxlen Maximum valid size of the \a str buffer
140 * \return Heap string with the same value of \a str
142 EXPORT char *strndup(const char *str, size_t maxlen)
146 for( len = 0; len < maxlen && str[len]; len ++) ;
147 ret = malloc( len + 1);
148 memcpy( ret, str, len );
154 * \fn EXPORT char *strchr(char *str, int character)
155 * \brief Locate a character in a string
157 EXPORT char *strchr(const char *str, int character)
161 if(*str == character)
168 * \fn EXPORT char *strrchr(char *str, int character)
169 * \brief Locate the last occurance of a character in a string
171 EXPORT char *strrchr(const char *str, int character)
177 if(str[i] == character)
178 return (void*)&str[i];
184 * \fn EXPORT char *strstr(char *str1, const char *str2)
185 * \brief Search a \a str1 for the first occurance of \a str2
187 EXPORT char *strstr(char *str1, const char *str2)
189 const char *test = str2;
193 if(*test == '\0') return str1;
194 if(*str1 == *test) test++;
202 * \fn EXPORT void *memset(void *dest, int val, size_t num)
203 * \brief Clear memory with the specified value
205 EXPORT void *memset(void *dest, int val, size_t num)
207 unsigned char *p = dest;
208 while(num--) *p++ = val;
213 * \fn EXPORT void *memcpy(void *dest, const void *src, size_t count)
214 * \brief Copy one memory area to another
216 EXPORT void *memcpy(void *dest, const void *src, size_t count)
218 char *sp = (char *)src;
219 char *dp = (char *)dest;
220 for(;count--;) *dp++ = *sp++;
225 * \fn EXPORT void *memmove(void *dest, const void *src, size_t count)
226 * \brief Copy data in memory, avoiding overlap problems
228 EXPORT void *memmove(void *dest, const void *src, size_t count)
230 char *sp = (char *)src;
231 char *dp = (char *)dest;
232 // Check if corruption will happen
233 if( (intptr_t)dest > (intptr_t)src && (intptr_t)dest < (intptr_t)src+count )
234 for(;count--;) dp[count] = sp[count];
236 for(;count--;) *dp++ = *sp++;
241 * \fn EXPORT int memcmp(const void *mem1, const void *mem2, size_t count)
242 * \brief Compare two regions of memory
243 * \param mem1 Region 1
244 * \param mem2 Region 2
245 * \param count Number of bytes to check
247 EXPORT int memcmp(const void *mem1, const void *mem2, size_t count)
251 if( *(unsigned char*)mem1 != *(unsigned char*)mem2 )
252 return *(unsigned char*)mem1 - *(unsigned char*)mem2;
260 * \fn EXPORT void *memchr(void *ptr, int value, size_t num)
261 * \brief Locates the first occurence of \a value starting at \a ptr
262 * \param ptr Starting memory location
263 * \param value Value to find
264 * \param num Size of memory area to check
266 EXPORT void *memchr(const void *ptr, int value, size_t num)
270 if( *(const unsigned char*)ptr == (unsigned char)value )
277 EXPORT size_t strcspn(const char *haystack, const char *reject)
283 for( i = 0; reject[i] && reject[i] == *haystack; i ++ );
285 if( reject[i] ) return ret;
291 EXPORT size_t strspn(const char *haystack, const char *accept)
297 for( i = 0; accept[i] && accept[i] == *haystack; i ++ );
299 if( !accept[i] ) return ret;