1 /* FILENAME: stdlib.c
\r
3 * Functions normally found in a standard C lib.
\r
5 * 12/28/2005 - added memcmp and memmove
\r
7 * Notes: These functions support ASCII only!!!
\r
10 #include "support_common.h"
\r
13 /***********************************************************************/
\r
43 /****************************************************************/
\r
47 if ((ch == ' ') || (ch == '\t')) /* \n ??? */
\r
53 /****************************************************************/
\r
58 if (((ch >= '0') && (ch <= '9')) ||
\r
59 ((ch >= 'A') && (ch <= 'Z')) ||
\r
60 ((ch >= 'a') && (ch <= 'z')))
\r
66 /****************************************************************/
\r
71 if ((ch >= '0') && (ch <= '9'))
\r
77 /****************************************************************/
\r
82 if ((ch >= 'A') && (ch <= 'Z'))
\r
88 /****************************************************************/
\r
90 strcasecmp (const char *s1, const char *s2)
\r
99 if ((c1 >= 'a') && (c1 <= 'z'))
\r
100 c1 = (char)(c1 - ' ');
\r
101 if ((c2 >= 'a') && (c2 <= 'z'))
\r
102 c2 = (char)(c2 - ' ');
\r
103 if ((result = (c1 - c2)) != 0)
\r
105 if ((c1 == 0) || (c2 == 0))
\r
112 /****************************************************************/
\r
114 stricmp (const char *s1, const char *s2)
\r
116 return (strcasecmp(s1, s2));
\r
119 /****************************************************************/
\r
121 strncasecmp (const char *s1, const char *s2, int n)
\r
131 if ((c1 >= 'a') && (c1 <= 'z'))
\r
132 c1 = (char)(c1 - ' ');
\r
133 if ((c2 >= 'a') && (c2 <= 'z'))
\r
134 c2 = (char)(c2 - ' ');
\r
135 if ((result = (c1 - c2)) != 0)
\r
137 if ((c1 == 0) || (c2 == 0))
\r
143 /****************************************************************/
\r
145 strnicmp (const char *s1, const char *s2, int n)
\r
147 return (strncasecmp(s1, s2, n));
\r
150 /****************************************************************/
\r
152 strtoul (char *str, char **ptr, int base)
\r
154 unsigned long rvalue = 0;
\r
158 /* Validate parameters */
\r
159 if ((str != NULL) && (base >= 0) && (base <= 36))
\r
161 /* Skip leading white spaces */
\r
162 while (isspace(*str))
\r
167 /* Check for notations */
\r
173 if ((str[1] == 'x') || (str[1] == 'X'))
\r
202 /* Valid "digits" are 0..9, A..Z, a..z */
\r
203 while (isalnum(c = *str))
\r
205 /* Convert char to num in 0..36 */
\r
206 if ((c -= ('a' - 10)) < 10) /* 'a'..'z' */
\r
208 if ((c += ('a' - 'A')) < 10) /* 'A'..'Z' */
\r
210 c += ('A' - '0' - 10); /* '0'..'9' */
\r
214 /* check c against base */
\r
222 rvalue = (rvalue * base) - c;
\r
226 rvalue = (rvalue * base) + c;
\r
233 /* Upon exit, 'str' points to the character at which valid info */
\r
234 /* STOPS. No chars including and beyond 'str' are used. */
\r
242 /****************************************************************/
\r
244 atoi (const char *str)
\r
246 char *s = (char *)str;
\r
248 return ((int)strtoul(s, NULL, 10));
\r
251 /****************************************************************/
\r
253 strlen (const char *str)
\r
255 char *s = (char *)str;
\r
261 while (*s++ != '\0')
\r
267 /****************************************************************/
\r
269 strcat (char *dest, const char *src)
\r
272 char *sp = (char *)src;
\r
274 if ((dest != NULL) && (src != NULL))
\r
276 dp = &dest[strlen(dest)];
\r
278 while (*sp != '\0')
\r
287 /****************************************************************/
\r
289 strncat (char *dest, const char *src, int n)
\r
292 char *sp = (char *)src;
\r
294 if ((dest != NULL) && (src != NULL) && (n > 0))
\r
296 dp = &dest[strlen(dest)];
\r
298 while ((*sp != '\0') && (n-- > 0))
\r
307 /****************************************************************/
\r
309 strcpy (char *dest, const char *src)
\r
311 char *dp = (char *)dest;
\r
312 char *sp = (char *)src;
\r
314 if ((dest != NULL) && (src != NULL))
\r
316 while (*sp != '\0')
\r
325 /****************************************************************/
\r
327 strncpy (char *dest, const char *src, int n)
\r
329 char *dp = (char *)dest;
\r
330 char *sp = (char *)src;
\r
332 if ((dest != NULL) && (src != NULL) && (n > 0))
\r
334 while ((*sp != '\0') && (n-- > 0))
\r
343 /****************************************************************/
\r
345 strcmp (const char *s1, const char *s2)
\r
347 /* No checks for NULL */
\r
348 char *s1p = (char *)s1;
\r
349 char *s2p = (char *)s2;
\r
351 while (*s2p != '\0')
\r
359 return (*s1p - *s2p);
\r
362 /****************************************************************/
\r
364 strncmp (const char *s1, const char *s2, int n)
\r
366 /* No checks for NULL */
\r
367 char *s1p = (char *)s1;
\r
368 char *s2p = (char *)s2;
\r
373 while (*s2p != '\0')
\r
384 return (*s1p - *s2p);
\r
387 /****************************************************************/
\r
389 strstr(const char *s1, const char *s2)
\r
391 char *sp = (char *)s1;
\r
392 int len1 = strlen(s1);
\r
393 int len2 = strlen(s2);
\r
395 while (len1 >= len2)
\r
397 if (strncmp(sp, s2, len2) == 0)
\r
408 /****************************************************************/
\r
410 strchr(const char *str, int c)
\r
412 char *sp = (char *)str;
\r
413 char ch = (char)(c & 0xff);
\r
415 while (*sp != '\0')
\r
427 /****************************************************************/
\r
429 memcpy (void *dest, const void *src, unsigned n)
\r
431 unsigned char *dbp = (unsigned char *)dest;
\r
432 unsigned char *sbp = (unsigned char *)src;
\r
434 if ((dest != NULL) && (src != NULL) && (n > 0))
\r
442 /****************************************************************/
\r
444 memset (void *s, int c, unsigned n)
\r
446 /* Not optimized, but very portable */
\r
447 unsigned char *sp = (unsigned char *)s;
\r
449 if ((s != NULL) && (n > 0))
\r
453 *sp++ = (unsigned char)c;
\r
459 /****************************************************************/
\r
461 memcmp (const void *s1, const void *s2, unsigned n)
\r
463 unsigned char *s1p, *s2p;
\r
465 if (s1 && s2 && (n > 0))
\r
467 s1p = (unsigned char *)s1;
\r
468 s2p = (unsigned char *)s2;
\r
470 while ((--n >= 0) && (*s1p == *s2p))
\r
473 return (*s1p - *s2p);
\r
482 /****************************************************************/
\r
484 memmove (void *dest, const void *src, unsigned n)
\r
486 unsigned char *dbp = (unsigned char *)dest;
\r
487 unsigned char *sbp = (unsigned char *)src;
\r
488 unsigned char *dend = dbp + n;
\r
489 unsigned char *send = sbp + n;
\r
491 if ((dest != NULL) && (src != NULL) && (n > 0))
\r
493 /* see if a memcpy would overwrite source buffer */
\r
494 if ((sbp < dbp) && (dbp < send))
\r
497 *(--dend) = *(--send);
\r
509 /****************************************************************/
\r