#include //#include #define _XA 0x200 #define _XS 0x100 #define _BB 0x80 #define _CN 0x40 #define _DI 0x20 #define _LO 0x10 #define _PU 0x08 #define _SP 0x04 #define _UP 0x02 #define _XD 0x01 #define XDI (_DI | _XD) #define XLO (_LO | _XD) #define XUP (_UP | _XD) static const SHORT CTypeTable[257] = { 0, _BB, _BB, _BB, _BB, _BB, _BB, _BB, _BB, _BB, _CN, _CN, _CN, _CN, _CN, _BB, _BB, _BB, _BB, _BB, _BB, _BB, _BB, _BB, _BB, _BB, _BB, _BB, _BB, _BB, _BB, _BB, _BB, _SP, _PU, _PU, _PU, _PU, _PU, _PU, _PU, _PU, _PU, _PU, _PU, _PU, _PU, _PU, _PU, XDI, XDI, XDI, XDI, XDI, XDI, XDI, XDI, XDI, XDI, _PU, _PU, _PU, _PU, _PU, _PU, _PU, XUP, XUP, XUP, XUP, XUP, XUP, _PU, _UP, _UP, _UP, _UP, _UP, _UP, _UP, _UP, _UP, _UP, _UP, _UP, _UP, _UP, _UP, _UP, _UP, _UP, _UP, _PU, _PU, _PU, _PU, _PU, _PU, XLO, XLO, XLO, XLO, XLO, XLO, _LO, _LO, _LO, _LO, _LO, _LO, _LO, _LO, _LO, _LO, _LO, _LO, _LO, _LO, _LO, _LO, _LO, _LO, _LO, _LO, _PU, _PU, _PU, _PU, _BB, }; const SHORT *_Ctype = &CTypeTable[1]; #define BASE_MAX 36 static const CHAR digits[] = {"0123456789abcdefghijklmnopqrstuvwxyz"}; static const CHAR ndigs[BASE_MAX+1] = { 0, 0, 33, 21, 17, 14, 13, 12, 11, 11, 10, 10, 9, 9, 9, 9, 9, 8, 8, 8, 8, 8, 8, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7 }; ULONG __Stoul (const CHAR *s, CHAR **endptr, INT base); /****************************************************************************** @doc INTERNAL @internal ULONG | __strlen | string length @parm PUCHAR | str | the string. @rdesc ULONG | the length of the string. ******************************************************************************/ ULONG __strlen(PUCHAR str) { ULONG len = 0; if (str == NULL) { return(0); } while (str[len] != '\0') { len++; } return(len); } // end of __strlen /****************************************************************************** @doc INTERNAL @internal LONG | __strcmp | compare strings @parm PUCHAR | str1 | one string. @parm PUCHAR | str2 | another string. @rdesc ULONG | the comparison result. ******************************************************************************/ LONG __strcmp(PUCHAR str1, PUCHAR str2) { ULONG len = 0; if (str1 == str2) { return(0); } if ((str1 == NULL) || (str2 == NULL)) { return(-1); } while ((str1[len] == str2[len]) && (str1[len] != '\0') && (str2[len] != '\0')) { len++; } if (str1[len] == str2[len]) { return(0); } else if (str1[len] < str2[len]) { return(-1); } else { return(1); } } // end of __strcmp /****************************************************************************** @doc INTERNAL @internal LONG | __strncmp | compare strings @parm PUCHAR | str1 | one string. @parm PUCHAR | str2 | another string. @parm ULONG | count | maximum characters to compare @rdesc ULONG | the comparison result. ******************************************************************************/ LONG __strncmp(PUCHAR str1, PUCHAR str2, ULONG count) { ULONG len = 0; if (str1 == str2) { return(0); } if ((str1 == NULL) || (str2 == NULL)) { return(-1); } while (count-- && (str1[len] == str2[len]) && (str1[len] != '\0') && (str2[len] != '\0')) { len++; } if (count == 0) { len--; } if (str1[len] == str2[len]) { return(0); } else if (str1[len] < str2[len]) { return(-1); } else { return(1); } } // end of __strncmp /****************************************************************************** @doc INTERNAL @internal LONG | __strnicmp | compare strings (case insensitive) @parm PUCHAR | str1 | one string. @parm PUCHAR | str2 | another string. @parm ULONG | count | maximum characters to compare @rdesc ULONG | the comparison result. ******************************************************************************/ LONG __strnicmp(PUCHAR str1, PUCHAR str2, ULONG count) { ULONG len = 0; if (str1 == str2) { return(0); } if ((str1 == NULL) || (str2 == NULL)) { return(-1); } while (count-- && (str1[len] == str2[len]) && (str1[len] != '\0') && (str2[len] != '\0')) { len++; } if (count == 0) { len--; } if (str1[len] == str2[len]) { return(0); } else if (str1[len] < str2[len]) { return(-1); } else { return(1); } } // end of __strnicmp /****************************************************************************** @doc INTERNAL @internal PUCHAR | __strncpy | copy strings @parm PUCHAR | str1 | one string. @parm PUCHAR | str2 | another string. @parm ULONG | count | maximum characters to copy @rdesc ULONG | ******************************************************************************/ PUCHAR __strncpy(PUCHAR str1, PUCHAR str2, ULONG count) { PUCHAR tmp = str1; if (str1 && str2 && *str2 && count) { while (count-- && (*str2 != '\0')) { *str1++ = *str2++; } *str1 = '\0'; } return (tmp); } // end of __strncpy /****************************************************************************** @doc INTERNAL @internal PUCHAR | __strcpy | copy strings @parm PUCHAR | str1 | one string. @parm PUCHAR | str2 | another string. @rdesc PUCHAR | the comparison result. ******************************************************************************/ PUCHAR __strcpy(PUCHAR str1, PUCHAR str2) { PUCHAR tmp = str1; if (str1 && str2 && *str2) { while (*str2 != '\0') { *str1++ = *str2++; } *str1 = *str2; } return (tmp); } // end of __strcpy /****************************************************************************** @doc INTERNAL @internal PUCHAR | __strstr | search for substring with another string @parm PUCHAR | str1 | source string. @parm PUCHAR | str2 | substring string. @rdesc PUCHAR | ******************************************************************************/ PUCHAR __strstr(PUCHAR str1, PUCHAR str2) { return (NULL); } // end of __strstr /****************************************************************************** @doc INTERNAL @internal PUCHAR | __memchr | search for char within buffer[0..count] @parm PUCHAR | buffer | starting address. @parm CHAR | chr | chr @parm ULONG | count | count @rdesc PUCHAR | ******************************************************************************/ PUCHAR __memchr(PUCHAR buffer, CHAR chr, ULONG count) { ULONG len = 0; if (buffer == NULL) { return(NULL); } while ((len