| 0, 0 | 0, 0 | ||||
| }; | }; | ||||
| #ifdef NEED_WCHAR_FUNCTIONS | |||||
| // use ctype.h functions for Latin1 (character < 0x100) | |||||
| int iswalpha(int c) | |||||
| { | |||||
| if (c < 0x80) | |||||
| return isalpha(c); | |||||
| if ((c > 0x3040) && (c <= 0xa700)) | |||||
| return 1; // japanese, chinese characters | |||||
| if (c > MAX_WALPHA) | |||||
| return 0; | |||||
| return walpha_tab[c-0x80]; | |||||
| } | |||||
| int iswdigit(int c) | |||||
| { | |||||
| if (c < 0x80) | |||||
| return isdigit(c); | |||||
| return 0; | |||||
| } | |||||
| int iswalnum(int c) | |||||
| { | |||||
| if (iswdigit(c)) | |||||
| return 1; | |||||
| return iswalpha(c); | |||||
| } | |||||
| int towlower(int c) | |||||
| { | |||||
| int x; | |||||
| int ix; | |||||
| if (c < 0x80) | |||||
| return tolower(c); | |||||
| if ((c > MAX_WALPHA) || ((x = walpha_tab[c-0x80]) >= 0xfe)) | |||||
| return c; | |||||
| if (x == 0xfd) { | |||||
| // special cases, lookup translation table | |||||
| for (ix = 0; wchar_tolower[ix] != 0; ix += 2) { | |||||
| if (wchar_tolower[ix] == c) | |||||
| return wchar_tolower[ix+1]; | |||||
| } | |||||
| } | |||||
| return c + x; // convert to lower case | |||||
| } | |||||
| int towupper(int c) | |||||
| { | |||||
| int ix; | |||||
| // check whether a previous character code is the upper-case equivalent of this character | |||||
| if (towlower(c-32) == c) | |||||
| return c-32; // yes, use it | |||||
| if (towlower(c-1) == c) | |||||
| return c-1; | |||||
| for (ix = 0; wchar_toupper[ix] != 0; ix += 2) { | |||||
| if (wchar_toupper[ix] == c) | |||||
| return wchar_toupper[ix+1]; | |||||
| } | |||||
| return c; // no | |||||
| } | |||||
| int iswupper(int c) | |||||
| { | |||||
| int x; | |||||
| if (c < 0x80) | |||||
| return isupper(c); | |||||
| if (((c > MAX_WALPHA) || (x = walpha_tab[c-0x80]) == 0) || (x == 0xff)) | |||||
| return 0; | |||||
| return 1; | |||||
| } | |||||
| int iswlower(int c) | |||||
| { | |||||
| if (c < 0x80) | |||||
| return islower(c); | |||||
| if ((c > MAX_WALPHA) || (walpha_tab[c-0x80] != 0xff)) | |||||
| return 0; | |||||
| return 1; | |||||
| } | |||||
| int iswspace(int c) | |||||
| { | |||||
| if (c < 0x80) | |||||
| return isspace(c); | |||||
| if (c == 0xa0) | |||||
| return 1; | |||||
| return 0; | |||||
| } | |||||
| int iswpunct(int c) | |||||
| { | |||||
| if (c < 0x100) | |||||
| return ispunct(c); | |||||
| return 0; | |||||
| } | |||||
| const wchar_t *wcschr(const wchar_t *str, int c) | |||||
| { | |||||
| while (*str != 0) { | |||||
| if (*str == c) | |||||
| return str; | |||||
| str++; | |||||
| } | |||||
| return NULL; | |||||
| } | |||||
| #ifndef WINCE | |||||
| // wcslen() is provided by WINCE, but not the other wchar functions | |||||
| const int wcslen(const wchar_t *str) | |||||
| { | |||||
| int ix = 0; | |||||
| while (*str != 0) | |||||
| ix++; | |||||
| return ix; | |||||
| } | |||||
| #endif | |||||
| float wcstod(const wchar_t *str, wchar_t **tailptr) | |||||
| { | |||||
| int ix; | |||||
| char buf[80]; | |||||
| while (isspace(*str)) str++; | |||||
| for (ix = 0; ix < 80; ix++) { | |||||
| buf[ix] = str[ix]; | |||||
| if (isspace(buf[ix])) | |||||
| break; | |||||
| } | |||||
| *tailptr = (wchar_t *)&str[ix]; | |||||
| return atof(buf); | |||||
| } | |||||
| #endif | |||||
| // use internal data for iswalpha up to U+024F | // use internal data for iswalpha up to U+024F | ||||
| // iswalpha() on Windows is unreliable (U+AA, U+BA). | // iswalpha() on Windows is unreliable (U+AA, U+BA). | ||||
| int iswalpha2(int c) | int iswalpha2(int c) |