3 * Functions normally found in a standard C lib.
5 * 12/28/2005 - added memcmp and memmove
7 * Notes: These functions support ASCII only!!!
10 //#include "m51cn128evb.h"
17 /****************************************************************/
21 if ((ch == ' ') || (ch == '\t')) /* \n ??? */
27 /****************************************************************/
32 if (((ch >= '0') && (ch <= '9')) ||
33 ((ch >= 'A') && (ch <= 'Z')) ||
34 ((ch >= 'a') && (ch <= 'z')))
40 /****************************************************************/
45 if ((ch >= '0') && (ch <= '9'))
51 /****************************************************************/
56 if ((ch >= 'A') && (ch <= 'Z'))
62 /****************************************************************/
64 strcasecmp (const char *s1, const char *s2)
73 if ((c1 >= 'a') && (c1 <= 'z'))
74 c1 = (char)(c1 - ' ');
75 if ((c2 >= 'a') && (c2 <= 'z'))
76 c2 = (char)(c2 - ' ');
77 if ((result = (c1 - c2)) != 0)
79 if ((c1 == 0) || (c2 == 0))
86 /****************************************************************/
88 stricmp (const char *s1, const char *s2)
90 return (strcasecmp(s1, s2));
93 /****************************************************************/
95 strncasecmp (const char *s1, const char *s2, int n)
105 if ((c1 >= 'a') && (c1 <= 'z'))
106 c1 = (char)(c1 - ' ');
107 if ((c2 >= 'a') && (c2 <= 'z'))
108 c2 = (char)(c2 - ' ');
109 if ((result = (c1 - c2)) != 0)
111 if ((c1 == 0) || (c2 == 0))
117 /****************************************************************/
119 strnicmp (const char *s1, const char *s2, int n)
121 return (strncasecmp(s1, s2, n));
124 /****************************************************************/
126 strtoul (char *str, char **ptr, int base)
128 unsigned long rvalue = 0;
132 /* Validate parameters */
133 if ((str != NULL) && (base >= 0) && (base <= 36))
135 /* Skip leading white spaces */
136 while (isspace(*str))
141 /* Check for notations */
147 if ((str[1] == 'x') || (str[1] == 'X'))
176 /* Valid "digits" are 0..9, A..Z, a..z */
177 while (isalnum(c = *str))
179 /* Convert char to num in 0..36 */
180 if ((c -= ('a' - 10)) < 10) /* 'a'..'z' */
182 if ((c += ('a' - 'A')) < 10) /* 'A'..'Z' */
184 c += ('A' - '0' - 10); /* '0'..'9' */
188 /* check c against base */
196 rvalue = (rvalue * base) - c;
200 rvalue = (rvalue * base) + c;
207 /* Upon exit, 'str' points to the character at which valid info */
208 /* STOPS. No chars including and beyond 'str' are used. */
216 /****************************************************************/
218 atoi (const char *str)
220 char *s = (char *)str;
222 return ((int)strtoul(s, NULL, 10));
225 /****************************************************************/
227 strlen (const char *str)
229 char *s = (char *)str;
241 /****************************************************************/
243 strcat (char *dest, const char *src)
246 char *sp = (char *)src;
248 if ((dest != NULL) && (src != NULL))
250 dp = &dest[strlen(dest)];
261 /****************************************************************/
263 strncat (char *dest, const char *src, int n)
266 char *sp = (char *)src;
268 if ((dest != NULL) && (src != NULL) && (n > 0))
270 dp = &dest[strlen(dest)];
272 while ((*sp != '\0') && (n-- > 0))
281 /****************************************************************/
283 strcpy (char *dest, const char *src)
285 char *dp = (char *)dest;
286 char *sp = (char *)src;
288 if ((dest != NULL) && (src != NULL))
299 /****************************************************************/
301 strncpy (char *dest, const char *src, int n)
303 char *dp = (char *)dest;
304 char *sp = (char *)src;
306 if ((dest != NULL) && (src != NULL) && (n > 0))
308 while ((*sp != '\0') && (n-- > 0))
317 /****************************************************************/
319 strcmp (const char *s1, const char *s2)
321 /* No checks for NULL */
322 char *s1p = (char *)s1;
323 char *s2p = (char *)s2;
333 return (*s1p - *s2p);
336 /****************************************************************/
338 strncmp (const char *s1, const char *s2, int n)
340 /* No checks for NULL */
341 char *s1p = (char *)s1;
342 char *s2p = (char *)s2;
358 return (*s1p - *s2p);
361 /****************************************************************/
363 strstr(const char *s1, const char *s2)
365 char *sp = (char *)s1;
366 int len1 = strlen(s1);
367 int len2 = strlen(s2);
371 if (strncmp(sp, s2, len2) == 0)
382 /****************************************************************/
384 strchr(const char *str, int c)
386 char *sp = (char *)str;
387 char ch = (char)(c & 0xff);
401 /****************************************************************/
403 memcpy (void *dest, const void *src, unsigned n)
405 unsigned char *dbp = (unsigned char *)dest;
406 unsigned char *sbp = (unsigned char *)src;
408 if ((dest != NULL) && (src != NULL) && (n > 0))
416 /****************************************************************/
418 memset (void *s, int c, unsigned n)
420 /* Not optimized, but very portable */
421 unsigned char *sp = (unsigned char *)s;
423 if ((s != NULL) && (n > 0))
427 *sp++ = (unsigned char)c;
433 /****************************************************************/
435 memcmp (const void *s1, const void *s2, unsigned n)
437 unsigned char *s1p, *s2p;
439 if (s1 && s2 && (n > 0))
441 s1p = (unsigned char *)s1;
442 s2p = (unsigned char *)s2;
444 while ((--n >= 0) && (*s1p == *s2p))
447 return (*s1p - *s2p);
456 /****************************************************************/
458 memmove (void *dest, const void *src, unsigned n)
460 unsigned char *dbp = (unsigned char *)dest;
461 unsigned char *sbp = (unsigned char *)src;
462 unsigned char *dend = dbp + n;
463 unsigned char *send = sbp + n;
465 if ((dest != NULL) && (src != NULL) && (n > 0))
467 /* see if a memcpy would overwrite source buffer */
468 if ((sbp < dbp) && (dbp < send))
471 *(--dend) = *(--send);
483 /****************************************************************/
486 strrchr(const char *s, int c)
488 const char *last = NULL;
491 while ((s = strchr(s, c)) != NULL) {
495 return (char *) last;