diff options
Diffstat (limited to 'private/crt32/convert/isctype.c')
-rw-r--r-- | private/crt32/convert/isctype.c | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/private/crt32/convert/isctype.c b/private/crt32/convert/isctype.c new file mode 100644 index 000000000..730470b92 --- /dev/null +++ b/private/crt32/convert/isctype.c @@ -0,0 +1,119 @@ +/*** +*isctype.c - support is* ctype functions/macros for two-byte multibyte chars +* +* Copyright (c) 1991-1992, Microsoft Corporation. All rights reserved. +* +*Purpose: +* Defines _isctype.c - support is* ctype functions/macros for +* two-byte multibyte chars. +* +*Revision History: +* 10-11-91 ETC Created. +* 12-08-91 ETC Updated api; added multhread lock; check char masks. +* 04-06-92 KRS Fix logic error in return value. +* 08-07-92 GJF _CALLTYPE4 (bogus usage) -> _CRTAPI1 (legit). +* 01-19-93 CFW Change C1_* to new names, call new APIs. +* 03-04-93 CFW Removed CTRL-Z. +* 04-01-93 CFW Remove EOF test (handled by array), return masked. +* 06-02-93 SRW ignore _INTL if _NTSUBSET_ defined. +* +*******************************************************************************/ +#include <stdio.h> +#include <cruntime.h> +#include <ctype.h> +#include <locale.h> +#include <setlocal.h> +#include <os2dll.h> + +#if defined(_INTL) && !defined(_NTSUBSET_) + +/* + * Use GetCharType() API so check that character type masks agree between + * ctype.h and winnls.h + */ +#if _UPPER != C1_UPPER || \ + _LOWER != C1_LOWER || \ + _DIGIT != C1_DIGIT || \ + _SPACE != C1_SPACE || \ + _PUNCT != C1_PUNCT || \ + _CONTROL != C1_CNTRL +#error Character type masks do not agree in ctype and winnls +#endif + +/*** +*_isctype - support is* ctype functions/macros for two-byte multibyte chars +* +*Purpose: +* This function is called by the is* ctype functions/macros +* (e.g. isalpha()) when their argument is a two-byte multibyte char. +* Returns true or false depending on whether the argument satisfies +* the character class property encoded by the mask. +* +*Entry: +* int c - the multibyte character whose type is to be tested +* unsigned int mask - the mask used by the is* functions/macros +* corresponding to each character class property +* +* The leadbyte and the trailbyte should be packed into the int c as: +* +* H.......|.......|.......|.......L +* 0 0 leadbyte trailbyte +* +*Exit: +* Returns non-zero if c is of the character class. +* Returns 0 if c is not of the character class. +* +*Exceptions: +* Returns 0 on any error. +* +*******************************************************************************/ + +int _CRTAPI1 _isctype ( + int c, + int mask + ) +{ + wchar_t widechar[2], chartype; + char buffer[3]; + + /* c valid between -1 and 255 */ + if (((unsigned)(c + 1)) <= 256) + return _pctype[c] & mask; + + _mlock (_LC_CTYPE_LOCK); + + if (isleadbyte(c>>8 & 0xff)) + { + buffer[0] = (c>>8 & 0xff); /* put lead-byte at start of str */ + buffer[1] = (char)c; + buffer[2] = 0; + } + else + { + buffer[0] = (char)c; + buffer[1] = 0; + } + if (MultiByteToWideChar(_lc_codepage, MB_PRECOMPOSED, + buffer, -1, widechar, 2) == 0) + return 0; + + _munlock (_LC_CTYPE_LOCK); + + if (GetStringTypeW(CT_CTYPE1, widechar, 2, &chartype) != NO_ERROR) { + return 0; + } + + return (int)(chartype & mask); +} + +#else /* defined(_INTL) && !defined(_NTSUBSET_) */ + +int _CRTAPI1 _isctype ( + int c, + int mask + ) +{ + return 0; +} + +#endif /* _INTL */ |