--- /dev/null
+/* FILENAME: stdlib.c\r
+ *\r
+ * Functions normally found in a standard C lib.\r
+ *\r
+ * 12/28/2005 - added memcmp and memmove\r
+ *\r
+ * Notes: These functions support ASCII only!!!\r
+ */\r
+\r
+//#include "m51cn128evb.h"\r
+#include "stdlib.h"\r
+\r
+#define TRUE 1\r
+#define FALSE 0\r
+#define NULL 0\r
+\r
+/****************************************************************/\r
+int\r
+isspace (int ch)\r
+{\r
+ if ((ch == ' ') || (ch == '\t')) /* \n ??? */\r
+ return TRUE;\r
+ else\r
+ return FALSE;\r
+}\r
+\r
+/****************************************************************/\r
+int\r
+isalnum (int ch)\r
+{\r
+ /* ASCII only */\r
+ if (((ch >= '0') && (ch <= '9')) ||\r
+ ((ch >= 'A') && (ch <= 'Z')) ||\r
+ ((ch >= 'a') && (ch <= 'z')))\r
+ return TRUE;\r
+ else\r
+ return FALSE;\r
+}\r
+\r
+/****************************************************************/\r
+int\r
+isdigit (int ch)\r
+{\r
+ /* ASCII only */\r
+ if ((ch >= '0') && (ch <= '9'))\r
+ return TRUE;\r
+ else\r
+ return FALSE;\r
+}\r
+\r
+/****************************************************************/\r
+int\r
+isupper (int ch)\r
+{\r
+ /* ASCII only */\r
+ if ((ch >= 'A') && (ch <= 'Z'))\r
+ return TRUE;\r
+ else\r
+ return FALSE;\r
+}\r
+\r
+/****************************************************************/\r
+int\r
+strcasecmp (const char *s1, const char *s2)\r
+{\r
+ char c1, c2;\r
+ int result = 0;\r
+\r
+ while (result == 0)\r
+ {\r
+ c1 = *s1++;\r
+ c2 = *s2++;\r
+ if ((c1 >= 'a') && (c1 <= 'z'))\r
+ c1 = (char)(c1 - ' ');\r
+ if ((c2 >= 'a') && (c2 <= 'z'))\r
+ c2 = (char)(c2 - ' ');\r
+ if ((result = (c1 - c2)) != 0)\r
+ break;\r
+ if ((c1 == 0) || (c2 == 0))\r
+ break;\r
+ }\r
+ return result;\r
+}\r
+\r
+\r
+/****************************************************************/\r
+int\r
+stricmp (const char *s1, const char *s2)\r
+{\r
+ return (strcasecmp(s1, s2));\r
+}\r
+\r
+/****************************************************************/\r
+int\r
+strncasecmp (const char *s1, const char *s2, int n)\r
+{\r
+ char c1, c2;\r
+ int k = 0;\r
+ int result = 0;\r
+\r
+ while ( k++ < n )\r
+ {\r
+ c1 = *s1++;\r
+ c2 = *s2++;\r
+ if ((c1 >= 'a') && (c1 <= 'z'))\r
+ c1 = (char)(c1 - ' ');\r
+ if ((c2 >= 'a') && (c2 <= 'z'))\r
+ c2 = (char)(c2 - ' ');\r
+ if ((result = (c1 - c2)) != 0)\r
+ break;\r
+ if ((c1 == 0) || (c2 == 0))\r
+ break;\r
+ }\r
+ return result;\r
+}\r
+\r
+/****************************************************************/\r
+int\r
+strnicmp (const char *s1, const char *s2, int n)\r
+{\r
+ return (strncasecmp(s1, s2, n));\r
+}\r
+\r
+/****************************************************************/\r
+unsigned long\r
+strtoul (char *str, char **ptr, int base)\r
+{\r
+ unsigned long rvalue = 0;\r
+ int neg = 0;\r
+ int c;\r
+\r
+ /* Validate parameters */\r
+ if ((str != NULL) && (base >= 0) && (base <= 36))\r
+ {\r
+ /* Skip leading white spaces */\r
+ while (isspace(*str))\r
+ {\r
+ ++str;\r
+ }\r
+\r
+ /* Check for notations */\r
+ switch (str[0])\r
+ {\r
+ case '0':\r
+ if (base == 0)\r
+ {\r
+ if ((str[1] == 'x') || (str[1] == 'X'))\r
+ {\r
+ base = 16;\r
+ str += 2;\r
+ }\r
+ else\r
+ {\r
+ base = 8;\r
+ str++;\r
+ }\r
+ }\r
+ break;\r
+ \r
+ case '-':\r
+ neg = 1;\r
+ str++;\r
+ break;\r
+\r
+ case '+':\r
+ str++;\r
+ break;\r
+\r
+ default:\r
+ break;\r
+ }\r
+\r
+ if (base == 0)\r
+ base = 10;\r
+\r
+ /* Valid "digits" are 0..9, A..Z, a..z */\r
+ while (isalnum(c = *str))\r
+ {\r
+ /* Convert char to num in 0..36 */\r
+ if ((c -= ('a' - 10)) < 10) /* 'a'..'z' */\r
+ {\r
+ if ((c += ('a' - 'A')) < 10) /* 'A'..'Z' */\r
+ {\r
+ c += ('A' - '0' - 10); /* '0'..'9' */\r
+ }\r
+ }\r
+\r
+ /* check c against base */\r
+ if (c >= base)\r
+ {\r
+ break;\r
+ }\r
+\r
+ if (neg)\r
+ {\r
+ rvalue = (rvalue * base) - c;\r
+ }\r
+ else\r
+ {\r
+ rvalue = (rvalue * base) + c;\r
+ }\r
+\r
+ ++str;\r
+ }\r
+ }\r
+\r
+ /* Upon exit, 'str' points to the character at which valid info */\r
+ /* STOPS. No chars including and beyond 'str' are used. */\r
+\r
+ if (ptr != NULL)\r
+ *ptr = str;\r
+ \r
+ return rvalue;\r
+ }\r
+\r
+/****************************************************************/\r
+int\r
+atoi (const char *str)\r
+{\r
+ char *s = (char *)str;\r
+ \r
+ return ((int)strtoul(s, NULL, 10));\r
+}\r
+\r
+/****************************************************************/\r
+int\r
+strlen (const char *str)\r
+{\r
+ char *s = (char *)str;\r
+ int len = 0;\r
+\r
+ if (s == NULL)\r
+ return 0;\r
+\r
+ while (*s++ != '\0')\r
+ ++len;\r
+\r
+ return len;\r
+}\r
+\r
+/****************************************************************/\r
+char *\r
+strcat (char *dest, const char *src)\r
+{\r
+ char *dp;\r
+ char *sp = (char *)src;\r
+\r
+ if ((dest != NULL) && (src != NULL))\r
+ {\r
+ dp = &dest[strlen(dest)];\r
+\r
+ while (*sp != '\0')\r
+ {\r
+ *dp++ = *sp++;\r
+ }\r
+ *dp = '\0';\r
+ }\r
+ return dest;\r
+}\r
+\r
+/****************************************************************/\r
+char *\r
+strncat (char *dest, const char *src, int n)\r
+{\r
+ char *dp;\r
+ char *sp = (char *)src;\r
+\r
+ if ((dest != NULL) && (src != NULL) && (n > 0))\r
+ {\r
+ dp = &dest[strlen(dest)];\r
+\r
+ while ((*sp != '\0') && (n-- > 0))\r
+ {\r
+ *dp++ = *sp++;\r
+ }\r
+ *dp = '\0';\r
+ }\r
+ return dest;\r
+}\r
+\r
+/****************************************************************/\r
+char *\r
+strcpy (char *dest, const char *src)\r
+{\r
+ char *dp = (char *)dest;\r
+ char *sp = (char *)src;\r
+\r
+ if ((dest != NULL) && (src != NULL))\r
+ {\r
+ while (*sp != '\0')\r
+ {\r
+ *dp++ = *sp++;\r
+ }\r
+ *dp = '\0';\r
+ }\r
+ return dest;\r
+}\r
+\r
+/****************************************************************/\r
+char *\r
+strncpy (char *dest, const char *src, int n)\r
+{\r
+ char *dp = (char *)dest;\r
+ char *sp = (char *)src;\r
+\r
+ if ((dest != NULL) && (src != NULL) && (n > 0))\r
+ {\r
+ while ((*sp != '\0') && (n-- > 0))\r
+ {\r
+ *dp++ = *sp++;\r
+ }\r
+ *dp = '\0';\r
+ }\r
+ return dest;\r
+}\r
+\r
+/****************************************************************/\r
+int\r
+strcmp (const char *s1, const char *s2)\r
+{\r
+ /* No checks for NULL */\r
+ char *s1p = (char *)s1;\r
+ char *s2p = (char *)s2;\r
+\r
+ while (*s2p != '\0')\r
+ {\r
+ if (*s1p != *s2p)\r
+ break;\r
+\r
+ ++s1p;\r
+ ++s2p;\r
+ }\r
+ return (*s1p - *s2p);\r
+}\r
+\r
+/****************************************************************/\r
+int\r
+strncmp (const char *s1, const char *s2, int n)\r
+{\r
+ /* No checks for NULL */\r
+ char *s1p = (char *)s1;\r
+ char *s2p = (char *)s2;\r
+\r
+ if (n <= 0)\r
+ return 0;\r
+\r
+ while (*s2p != '\0')\r
+ {\r
+ if (*s1p != *s2p)\r
+ break;\r
+\r
+ if (--n == 0)\r
+ break;\r
+\r
+ ++s1p;\r
+ ++s2p;\r
+ }\r
+ return (*s1p - *s2p);\r
+}\r
+\r
+/****************************************************************/\r
+char *\r
+strstr(const char *s1, const char *s2)\r
+{\r
+ char *sp = (char *)s1;\r
+ int len1 = strlen(s1);\r
+ int len2 = strlen(s2);\r
+\r
+ while (len1 >= len2) \r
+ {\r
+ if (strncmp(sp, s2, len2) == 0)\r
+ {\r
+ return (sp);\r
+ }\r
+ ++sp;\r
+ --len1;\r
+ }\r
+\r
+ return (NULL);\r
+}\r
+\r
+/****************************************************************/\r
+char *\r
+strchr(const char *str, int c)\r
+{\r
+ char *sp = (char *)str;\r
+ char ch = (char)(c & 0xff);\r
+\r
+ while (*sp != '\0')\r
+ {\r
+ if (*sp == ch)\r
+ {\r
+ return (sp);\r
+ }\r
+ ++sp;\r
+ }\r
+\r
+ return (NULL);\r
+}\r
+\r
+/****************************************************************/\r
+void *\r
+memcpy (void *dest, const void *src, unsigned n)\r
+{\r
+ unsigned char *dbp = (unsigned char *)dest;\r
+ unsigned char *sbp = (unsigned char *)src;\r
+\r
+ if ((dest != NULL) && (src != NULL) && (n > 0))\r
+ {\r
+ while (n--)\r
+ *dbp++ = *sbp++;\r
+ }\r
+ return dest;\r
+}\r
+\r
+/****************************************************************/\r
+void *\r
+memset (void *s, int c, unsigned n)\r
+{\r
+ /* Not optimized, but very portable */\r
+ unsigned char *sp = (unsigned char *)s;\r
+\r
+ if ((s != NULL) && (n > 0))\r
+ {\r
+ while (n--)\r
+ {\r
+ *sp++ = (unsigned char)c;\r
+ }\r
+ }\r
+ return s;\r
+}\r
+\r
+/****************************************************************/\r
+int\r
+memcmp (const void *s1, const void *s2, unsigned n)\r
+{\r
+ unsigned char *s1p, *s2p;\r
+\r
+ if (s1 && s2 && (n > 0))\r
+ {\r
+ s1p = (unsigned char *)s1;\r
+ s2p = (unsigned char *)s2;\r
+\r
+ while ((--n >= 0) && (*s1p == *s2p))\r
+ {\r
+ if (*s1p != *s2p)\r
+ return (*s1p - *s2p);\r
+ ++s1p;\r
+ ++s2p;\r
+ }\r
+ }\r
+\r
+ return (0);\r
+}\r
+\r
+/****************************************************************/\r
+void *\r
+memmove (void *dest, const void *src, unsigned n)\r
+{\r
+ unsigned char *dbp = (unsigned char *)dest;\r
+ unsigned char *sbp = (unsigned char *)src;\r
+ unsigned char *dend = dbp + n;\r
+ unsigned char *send = sbp + n;\r
+\r
+ if ((dest != NULL) && (src != NULL) && (n > 0))\r
+ {\r
+ /* see if a memcpy would overwrite source buffer */\r
+ if ((sbp < dbp) && (dbp < send))\r
+ {\r
+ while (n--)\r
+ *(--dend) = *(--send);\r
+ }\r
+ else\r
+ {\r
+ while (n--)\r
+ *dbp++ = *sbp++;\r
+ }\r
+ }\r
+\r
+ return dest;\r
+}\r
+\r
+/****************************************************************/\r
+\r
+char *\r
+strrchr(const char *s, int c)\r
+{\r
+ const char *last = NULL;\r
+ if (c == '\0')\r
+ return strchr(s, c);\r
+ while ((s = strchr(s, c)) != NULL) {\r
+ last = s;\r
+ s++;\r
+ }\r
+ return (char *) last;\r
+}\r
+\r