📄 wctype.c
字号:
#ifdef __UCLIBC_MJN3_ONLY__#warning TODO: need to fix locale ctype table lookup stuff#endif#if 0extern const char ctype_range[];#elsestatic const char ctype_range[] = { __CTYPE_RANGES};#endif#ifdef __UCLIBC_MJN3_ONLY__#warning TODO: need to handle combining class!#endif#define WCctype_TI_MASK ((1 << WCctype_TI_SHIFT) - 1)#define WCctype_II_MASK ((1 << WCctype_II_SHIFT) - 1)int iswctype(wint_t wc, wctype_t desc){ unsigned int sc, n, i0, i1; unsigned char d = __CTYPE_unclassified; if ((ENCODING != __ctype_encoding_7_bit) || (((__uwchar_t) wc) <= 0x7f)){ if (desc < _CTYPE_iswxdigit) { if (((__uwchar_t) wc) <= WC_TABLE_DOMAIN_MAX) { /* From here on, we know wc > 0. */ sc = wc & WCctype_TI_MASK; wc >>= WCctype_TI_SHIFT; n = wc & WCctype_II_MASK; wc >>= WCctype_II_SHIFT; i0 = WCctype[wc]; i0 <<= WCctype_II_SHIFT; i1 = WCctype[WCctype_II_LEN + i0 + n]; i1 <<= (WCctype_TI_SHIFT-1); d = WCctype[WCctype_II_LEN + WCctype_TI_LEN + i1 + (sc >> 1)]; d = (sc & 1) ? (d >> 4) : (d & 0xf); } else if ( ((((__uwchar_t)(wc - 0xe0020UL)) <= 0x5f) || (wc == 0xe0001UL)) || ( (((__uwchar_t)(wc - 0xf0000UL)) < 0x20000UL) && ((wc & 0xffffU) <= 0xfffdU)) ) { d = __CTYPE_punct; } return ( ((unsigned char)(d - ctype_range[2*desc])) <= ctype_range[2*desc + 1] ) && ((desc != _CTYPE_iswblank) || (d & 1)); } /* TODO - Add locale-specific classifications. */ return (desc == _CTYPE_iswxdigit) ? __C_iswxdigit(wc) : 0; } return 0;}#elsestatic const unsigned char WCctype[] = { __CTYPE_cntrl_nonspace | (__CTYPE_cntrl_nonspace << 4), __CTYPE_cntrl_nonspace | (__CTYPE_cntrl_nonspace << 4), __CTYPE_cntrl_nonspace | (__CTYPE_cntrl_nonspace << 4), __CTYPE_cntrl_nonspace | (__CTYPE_cntrl_nonspace << 4), __CTYPE_cntrl_nonspace | (__CTYPE_cntrl_space_blank << 4), __CTYPE_cntrl_space_nonblank | (__CTYPE_cntrl_space_nonblank << 4), __CTYPE_cntrl_space_nonblank | (__CTYPE_cntrl_space_nonblank << 4), __CTYPE_cntrl_nonspace | (__CTYPE_cntrl_nonspace << 4), __CTYPE_cntrl_nonspace | (__CTYPE_cntrl_nonspace << 4), __CTYPE_cntrl_nonspace | (__CTYPE_cntrl_nonspace << 4), __CTYPE_cntrl_nonspace | (__CTYPE_cntrl_nonspace << 4), __CTYPE_cntrl_nonspace | (__CTYPE_cntrl_nonspace << 4), __CTYPE_cntrl_nonspace | (__CTYPE_cntrl_nonspace << 4), __CTYPE_cntrl_nonspace | (__CTYPE_cntrl_nonspace << 4), __CTYPE_cntrl_nonspace | (__CTYPE_cntrl_nonspace << 4), __CTYPE_cntrl_nonspace | (__CTYPE_cntrl_nonspace << 4), __CTYPE_print_space_blank | (__CTYPE_punct << 4), __CTYPE_punct | (__CTYPE_punct << 4), __CTYPE_punct | (__CTYPE_punct << 4), __CTYPE_punct | (__CTYPE_punct << 4), __CTYPE_punct | (__CTYPE_punct << 4), __CTYPE_punct | (__CTYPE_punct << 4), __CTYPE_punct | (__CTYPE_punct << 4), __CTYPE_punct | (__CTYPE_punct << 4), __CTYPE_digit | (__CTYPE_digit << 4), __CTYPE_digit | (__CTYPE_digit << 4), __CTYPE_digit | (__CTYPE_digit << 4), __CTYPE_digit | (__CTYPE_digit << 4), __CTYPE_digit | (__CTYPE_digit << 4), __CTYPE_punct | (__CTYPE_punct << 4), __CTYPE_punct | (__CTYPE_punct << 4), __CTYPE_punct | (__CTYPE_punct << 4), __CTYPE_punct | (__CTYPE_alpha_upper << 4), __CTYPE_alpha_upper | (__CTYPE_alpha_upper << 4), __CTYPE_alpha_upper | (__CTYPE_alpha_upper << 4), __CTYPE_alpha_upper | (__CTYPE_alpha_upper << 4), __CTYPE_alpha_upper | (__CTYPE_alpha_upper << 4), __CTYPE_alpha_upper | (__CTYPE_alpha_upper << 4), __CTYPE_alpha_upper | (__CTYPE_alpha_upper << 4), __CTYPE_alpha_upper | (__CTYPE_alpha_upper << 4), __CTYPE_alpha_upper | (__CTYPE_alpha_upper << 4), __CTYPE_alpha_upper | (__CTYPE_alpha_upper << 4), __CTYPE_alpha_upper | (__CTYPE_alpha_upper << 4), __CTYPE_alpha_upper | (__CTYPE_alpha_upper << 4), __CTYPE_alpha_upper | (__CTYPE_alpha_upper << 4), __CTYPE_alpha_upper | (__CTYPE_punct << 4), __CTYPE_punct | (__CTYPE_punct << 4), __CTYPE_punct | (__CTYPE_punct << 4), __CTYPE_punct | (__CTYPE_alpha_lower << 4), __CTYPE_alpha_lower | (__CTYPE_alpha_lower << 4), __CTYPE_alpha_lower | (__CTYPE_alpha_lower << 4), __CTYPE_alpha_lower | (__CTYPE_alpha_lower << 4), __CTYPE_alpha_lower | (__CTYPE_alpha_lower << 4), __CTYPE_alpha_lower | (__CTYPE_alpha_lower << 4), __CTYPE_alpha_lower | (__CTYPE_alpha_lower << 4), __CTYPE_alpha_lower | (__CTYPE_alpha_lower << 4), __CTYPE_alpha_lower | (__CTYPE_alpha_lower << 4), __CTYPE_alpha_lower | (__CTYPE_alpha_lower << 4), __CTYPE_alpha_lower | (__CTYPE_alpha_lower << 4), __CTYPE_alpha_lower | (__CTYPE_alpha_lower << 4), __CTYPE_alpha_lower | (__CTYPE_alpha_lower << 4), __CTYPE_alpha_lower | (__CTYPE_punct << 4), __CTYPE_punct | (__CTYPE_punct << 4), __CTYPE_punct | (__CTYPE_cntrl_nonspace << 4),};static const char ctype_range[] = { __CTYPE_RANGES};int iswctype(wint_t wc, wctype_t desc){ unsigned char d = __CTYPE_unclassified; if (((__uwchar_t) wc) <= 0x7f) { if (desc < _CTYPE_iswxdigit) { d = WCctype[wc >> 1]; d = (wc & 1) ? (d >> 4) : (d & 0xf); return ( ((unsigned char)(d - ctype_range[2*desc])) <= ctype_range[2*desc + 1] ) && ((desc != _CTYPE_iswblank) || (d & 1)); } if (desc == _CTYPE_iswxdigit) { return __C_isxdigit(((char) wc)); } } return 0;}#endif#endif/**********************************************************************/#ifdef L_towctrans#ifdef __WCTYPE_WITH_LOCALE#ifdef SMALL_UPLOWwint_t towctrans(wint_t wc, wctrans_t desc){ unsigned int sc, n, i; __uwchar_t u = wc; /* TODO - clean up */ if (ENCODING == __ctype_encoding_7_bit) { if ((((__uwchar_t) wc) > 0x7f) || (((unsigned int)(desc - _CTYPE_tolower)) > (_CTYPE_toupper - _CTYPE_tolower)) ){ /* We're in the C/POSIX locale, so ignore non-ASCII values * as well an any mappings other than toupper or tolower. */ return wc; } } if (((unsigned int)(desc - _CTYPE_tolower)) <= (_CTYPE_totitle - _CTYPE_tolower) ) { if (u <= WC_TABLE_DOMAIN_MAX) { sc = u & ((1 << WCuplow_TI_SHIFT) - 1); u >>= WCuplow_TI_SHIFT; n = u & ((1 << WCuplow_II_SHIFT) - 1); u >>= WCuplow_II_SHIFT; i = ((unsigned int) WCuplow[u]) << WCuplow_II_SHIFT; i = ((unsigned int) WCuplow[WCuplow_II_LEN + i + n]) << WCuplow_TI_SHIFT; i = ((unsigned int) WCuplow[WCuplow_II_LEN + WCuplow_TI_LEN + i + sc]) << 1; if (desc == _CTYPE_tolower) { ++i; } wc += WCuplow_diff[i]; if (desc == _CTYPE_totitle) { /* WARNING! These special cases work for glibc 2.2.4. Changes * may be needed if the glibc locale tables are updated. */ if ( (((__uwchar_t)(wc - 0x1c4)) <= (0x1cc - 0x1c4)) || (wc == 0x1f1) ) { ++wc; } } } } else { /* TODO - Deal with other transliterations. */ __set_errno(EINVAL); } return wc;}#elsewint_t towctrans(wint_t wc, wctrans_t desc){ if (ENCODING == __ctype_encoding_7_bit) { if ((((__uwchar_t) wc) > 0x7f) || (((unsigned int)(desc - _CTYPE_tolower)) > (_CTYPE_toupper - _CTYPE_tolower)) ){ /* We're in the C/POSIX locale, so ignore non-ASCII values * as well an any mappings other than toupper or tolower. */ return wc; } } if (desc == _CTYPE_tolower) { return towlower(wc); } else if (((unsigned int)(desc - _CTYPE_toupper)) <= (_CTYPE_totitle - _CTYPE_toupper) ) { wc = towupper(wc); if (desc == _CTYPE_totitle) { /* WARNING! These special cases work for glibc 2.2.4. Changes * may be needed if the glibc locale tables are updated. */ if ( (((__uwchar_t)(wc - 0x1c4)) <= (0x1cc - 0x1c4)) || (wc == 0x1f1) ) { ++wc; } } } else { /* TODO - Deal with other transliterations. */ __set_errno(EINVAL); } return wc;}#endif#else /* __WCTYPE_WITH_LOCALE *//* Minimal support for C/POSIX locale. */wint_t towctrans(wint_t wc, wctrans_t desc){ if (((unsigned int)(desc - _CTYPE_tolower)) <= (_CTYPE_toupper - _CTYPE_tolower) ) { /* Transliteration is either tolower or toupper. */ if (((__uwchar_t) wc) <= 0x7f) { return (desc == _CTYPE_tolower) ? _tolower(wc) : _toupper(wc); } } else { __set_errno(EINVAL); /* Invalid transliteration. */ } return wc;}#endif /* __WCTYPE_WITH_LOCALE */#endif/**********************************************************************/#ifdef L_wctransstatic const char transstring[] = __CTYPE_TRANSTRING;wctrans_t wctrans(const char *property){ const unsigned char *p; int i; p = transstring; i = 1; do { if (!strcmp(property, ++p)) { return i; } ++i; p += p[-1]; } while (*p); /* TODO - Add locale-specific translations. */ return 0;}#endif/**********************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -