int main( void ) { TESTCASE(iswcntrl(L'\0')); TESTCASE(iswcntrl(L'\n')); TESTCASE(iswcntrl(L'\v')); TESTCASE(!iswcntrl(L'\t')); TESTCASE(!iswcntrl(L'a')); return TEST_RESULTS; }
int get_trait (qse_wcint_t code) { int trait = 0; if (iswupper(code)) trait |= TRAIT_UPPER; if (iswlower(code)) trait |= TRAIT_LOWER; if (iswalpha(code)) trait |= TRAIT_ALPHA; if (iswdigit(code)) trait |= TRAIT_DIGIT; if (iswxdigit(code)) trait |= TRAIT_XDIGIT; if (iswalnum(code)) trait |= TRAIT_ALNUM; if (iswspace(code)) trait |= TRAIT_SPACE; if (iswprint(code)) trait |= TRAIT_PRINT; if (iswgraph(code)) trait |= TRAIT_GRAPH; if (iswcntrl(code)) trait |= TRAIT_CNTRL; if (iswpunct(code)) trait |= TRAIT_PUNCT; if (iswblank(code)) trait |= TRAIT_BLANK; /* if (iswascii(code)) trait |= TRAIT_ASCII; if (isphonogram(code)) trait |= TRAIT_PHONO; if (isideogram(code)) trait |= TRAIT_IDEOG; if (isenglish(code)) trait |= TRAIT_ENGLI; */ return trait; }
static int getboundedstring_cb(lua_State* L) { size_t size; const char* start = luaL_checklstring(L, 1, &size); const char* send = start + size; int width = luaL_checkinteger(L, 2); const char* s = start; while (s < send) { const char* p = s; wchar_t c = readu8(&s); if (!iswcntrl(c)) { width -= emu_wcwidth(c); if (width < 0) { send = p; break; } } } lua_pushlstring(L, start, send - start); return 1; }
int iswctype(wint_t wc, wctype_t type) { switch (type) { case WCTYPE_ALNUM: return iswalnum(wc); case WCTYPE_ALPHA: return iswalpha(wc); case WCTYPE_BLANK: return iswblank(wc); case WCTYPE_CNTRL: return iswcntrl(wc); case WCTYPE_DIGIT: return iswdigit(wc); case WCTYPE_GRAPH: return iswgraph(wc); case WCTYPE_LOWER: return iswlower(wc); case WCTYPE_PRINT: return iswprint(wc); case WCTYPE_PUNCT: return iswpunct(wc); case WCTYPE_SPACE: return iswspace(wc); case WCTYPE_UPPER: return iswupper(wc); case WCTYPE_XDIGIT: return iswxdigit(wc); } return 0; }
int BLC_PREFIX(iswctype)(wint_t wc, wctype_t desc) { switch (desc) { case wctype_alnum: return iswalnum(wc); case wctype_alpha: return iswalpha(wc); case wctype_blank: return iswblank(wc); case wctype_cntrl: return iswcntrl(wc); case wctype_digit: return iswdigit(wc); case wctype_graph: return iswgraph(wc); case wctype_lower: return iswlower(wc); case wctype_print: return iswprint(wc); case wctype_punct: return iswpunct(wc); case wctype_space: return iswspace(wc); case wctype_upper: return iswupper(wc); case wctype_xdigit: return iswxdigit(wc); default: return 0; } }
void test1() { int i; for (i = 0; i < 256; i++) { printf(" %02x: ", i); check_bool(isalnum(i), iswalnum(i), '1'); check_bool(isalpha(i), iswalpha(i), '2'); check_bool(isblank(i), iswblank(i), '3'); check_bool(iscntrl(i), iswcntrl(i), '4'); check_bool(isdigit(i), iswdigit(i), '5'); check_bool(isgraph(i), iswgraph(i), '6'); check_bool(islower(i), iswlower(i), '6'); check_bool(isprint(i), iswprint(i), '7'); check_bool(ispunct(i), iswpunct(i), '8'); check_bool(isspace(i), iswspace(i), '9'); check_bool(isupper(i), iswupper(i), 'a'); check_bool(isxdigit(i), iswxdigit(i), 'b'); check_value(tolower(i), towlower(i), 'c'); check_value(toupper(i), towupper(i), 'd'); if (i % 8 == 7) printf("\n"); } printf("%\n"); }
int main () { /* Check that the isw* functions exist as functions or as macros. */ (void) iswalnum (0); (void) iswalpha (0); #if 0 /* not portable: missing on mingw */ (void) iswblank (0); #endif (void) iswcntrl (0); (void) iswdigit (0); (void) iswgraph (0); (void) iswlower (0); (void) iswprint (0); (void) iswpunct (0); (void) iswspace (0); (void) iswupper (0); (void) iswxdigit (0); /* Check that the isw* functions map WEOF to 0. */ ASSERT (!iswalnum (e)); ASSERT (!iswalpha (e)); #if 0 /* not portable: missing on mingw */ ASSERT (!iswblank (e)); #endif ASSERT (!iswcntrl (e)); ASSERT (!iswdigit (e)); ASSERT (!iswgraph (e)); ASSERT (!iswlower (e)); ASSERT (!iswprint (e)); ASSERT (!iswpunct (e)); ASSERT (!iswspace (e)); ASSERT (!iswupper (e)); ASSERT (!iswxdigit (e)); /* Check that the tow* functions exist as functions or as macros. */ (void) towlower (0); (void) towupper (0); /* Check that the tow* functions map WEOF to WEOF. */ ASSERT (towlower (e) == e); ASSERT (towupper (e) == e); return 0; }
int iswcntrl_l(wint_t c, struct __locale_t *locale) { /* Silence warning */ _CRT_UNUSED(locale); /* We're using a locale-independent representation of upper/lower case based on Unicode data. Thus, the locale doesn't matter. */ return iswcntrl (c); }
int iswpunct(wint_t wc) { if (iswcntrl(wc) || iswalnum(wc) || iswspace(wc)) return 0; // It's a printable character // thats not alpha-numeric, or a space // so its a punctuation character return 1; }
bool iswcntrl(wstring _String) { for (wstring::const_iterator iter = _String.begin(); iter != _String.end(); iter++) { if (!iswcntrl(*iter)) { return false; } } return true; }
int main (void) { /* Check that the isw* functions exist as functions or as macros. */ (void) iswalnum (0); (void) iswalpha (0); (void) iswcntrl (0); (void) iswdigit (0); (void) iswgraph (0); (void) iswlower (0); (void) iswprint (0); (void) iswpunct (0); (void) iswspace (0); (void) iswupper (0); (void) iswxdigit (0); /* Check that the isw* functions map WEOF to 0. */ ASSERT (!iswalnum (e)); ASSERT (!iswalpha (e)); ASSERT (!iswcntrl (e)); ASSERT (!iswdigit (e)); ASSERT (!iswgraph (e)); ASSERT (!iswlower (e)); ASSERT (!iswprint (e)); ASSERT (!iswpunct (e)); ASSERT (!iswspace (e)); ASSERT (!iswupper (e)); ASSERT (!iswxdigit (e)); /* Check that the tow* functions exist as functions or as macros. */ (void) towlower (0); (void) towupper (0); /* Check that the tow* functions map WEOF to WEOF. */ ASSERT (towlower (e) == e); ASSERT (towupper (e) == e); return 0; }
libedit_private int ct_chr_class(wchar_t c) { if (c == '\t') return CHTYPE_TAB; else if (c == '\n') return CHTYPE_NL; else if (c < 0x100 && iswcntrl(c)) return CHTYPE_ASCIICTL; else if (iswprint(c)) return CHTYPE_PRINT; else return CHTYPE_NONPRINT; }
static int scanner_error(mvc *lc, int cur) { switch (cur) { case EOF: (void) sql_error(lc, 1, "unexpected end of input"); return -1; /* EOF needs -1 result */ default: /* on Windows at least, iswcntrl returns TRUE for * U+FEFF, but we just want consistent error * messages */ (void) sql_error(lc, 1, "unexpected%s character (U+%04X)", iswcntrl(cur) && cur != 0xFEFF ? " control" : "", cur); } return LEX_ERROR; }
static int match_class (lua_WChar c, lua_WChar cl) { int res; switch (towlower(cl)) { case 'a' : res = iswalpha(c); break; case 'c' : res = iswcntrl(c); break; case 'd' : res = iswdigit(c); break; case 'l' : res = iswlower(c); break; case 'p' : res = iswpunct(c); break; case 's' : res = iswspace(c); break; case 'u' : res = iswupper(c); break; case 'w' : res = iswalnum(c); break; case 'x' : res = iswxdigit(c); break; case 'z' : res = (c == '\0'); break; default: return (cl == c); } return (iswlower(cl) ? res : !res); }
static int getstringwidth_cb(lua_State* L) { size_t size; const char* s = luaL_checklstring(L, 1, &size); const char* send = s + size; int width = 0; while (s < send) { wchar_t c = readu8(&s); if (!iswcntrl(c)) width += emu_wcwidth(c); } lua_pushnumber(L, width); return 1; }
/* Determine if the given character is of the specified type. */ _WCRTLINK int iswctype( wint_t wc, wctype_t desc ) { switch( desc ) { case WCTYPE_ALNUM: return( iswalnum( wc ) ); case WCTYPE_ALPHA: return( iswalpha( wc ) ); case WCTYPE_BLANK: return( iswblank( wc ) ); case WCTYPE_CNTRL: return( iswcntrl( wc ) ); case WCTYPE_DIGIT: return( iswdigit( wc ) ); case WCTYPE_GRAPH: return( iswgraph( wc ) ); case WCTYPE_LOWER: return( iswlower( wc ) ); case WCTYPE_PRINT: return( iswprint( wc ) ); case WCTYPE_PUNCT: return( iswpunct( wc ) ); case WCTYPE_SPACE: return( iswspace( wc ) ); case WCTYPE_UPPER: return( iswupper( wc ) ); case WCTYPE_XDIGIT: return( iswxdigit( wc ) ); default: return( 0 ); } }
static int write_cb(lua_State* L) { int x = luaL_checkint(L, 1); int y = luaL_checkint(L, 2); size_t size; const char* s = luaL_checklstring(L, 3, &size); const char* send = s + size; while (s < send) { wchar_t c = readu8(&s); dpy_writechar(x, y, c); if (!iswcntrl(c)) x += emu_wcwidth(c); } return 0; }
static wchar_t * cpbReadScreen (size_t *length, int fromColumn, int fromRow, int toColumn, int toRow) { wchar_t *newBuffer = NULL; int columns = toColumn - fromColumn + 1; int rows = toRow - fromRow + 1; if ((columns >= 1) && (rows >= 1) && (beginOffset >= 0)) { wchar_t fromBuffer[rows * columns]; if (readScreenText(fromColumn, fromRow, columns, rows, fromBuffer)) { wchar_t toBuffer[rows * (columns + 1)]; wchar_t *toAddress = toBuffer; const wchar_t *fromAddress = fromBuffer; int row; for (row=fromRow; row<=toRow; row+=1) { int column; for (column=fromColumn; column<=toColumn; column+=1) { wchar_t character = *fromAddress++; if (iswcntrl(character) || iswspace(character)) character = WC_C(' '); *toAddress++ = character; } if (row != toRow) *toAddress++ = WC_C('\r'); } /* make a new permanent buffer of just the right size */ { size_t newLength = toAddress - toBuffer; if ((newBuffer = cpbAllocateCharacters(newLength))) { wmemcpy(newBuffer, toBuffer, (*length = newLength)); } } } } return newBuffer; }
static void TranslateToDos(doscp_t *toDos, const char *in, char *out, int count, char *end, Case_t *Case, int *mangled) { wchar_t buffer[12]; wchar_t *s=buffer; wchar_t *t=buffer; /* first convert to wchar, so we get to use towupper etc. */ native_to_wchar(in, buffer, count, end, mangled); buffer[count]='\0'; *Case = NONE; for( ; *s ; s++) { /* skip spaces & dots */ if(*s == ' ' || *s == '.') { *mangled |= 3; continue; } if (iswcntrl(*s)) { /* "control" characters */ *mangled |= 3; *t = '_'; } else if (iswlower(*s)) { *t = towupper(*s); if(*Case == UPPER && !mtools_no_vfat) *mangled |= 1; else *Case = LOWER; } else if (iswupper(*s)) { *t = *s; if(*Case == LOWER && !mtools_no_vfat) *mangled |= 1; else *Case = UPPER; } else *t = *s; t++; } wchar_to_dos(toDos, buffer, out, t - buffer, mangled); }
int main () { /* Check that the isw* functions exist as functions or as macros. */ iswalnum (0); iswalpha (0); #if 0 /* not portable: missing on mingw */ iswblank (0); #endif iswcntrl (0); iswdigit (0); iswgraph (0); iswlower (0); iswprint (0); iswpunct (0); iswspace (0); iswupper (0); iswxdigit (0); return 0; }
void wctype_check_functions(wint_t i, wctype_t t, wctrans_t tr, locale_t l) { (void)iswalnum(i); (void)iswalnum_l(i, l); (void)iswalpha(i); (void)iswalpha_l(i, l); (void)iswblank(i); (void)iswblank_l(i, l); (void)iswcntrl(i); (void)iswcntrl_l(i, l); (void)iswctype(i, t); (void)iswctype_l(i, t, l); (void)iswdigit(i); (void)iswdigit_l(i, l); (void)iswgraph(i); (void)iswgraph_l(i, l); (void)iswlower(i); (void)iswlower_l(i, l); (void)iswprint(i); (void)iswprint_l(i, l); (void)iswpunct(i); (void)iswpunct_l(i, l); (void)iswspace(i); (void)iswspace_l(i, l); (void)iswupper(i); (void)iswupper_l(i, l); (void)iswxdigit(i); (void)iswxdigit_l(i, l); (void)towctrans(i, tr); (void)towctrans_l(i, tr, l); (void)towlower(i); (void)towlower_l(i, l); (void)towupper(i); (void)towupper_l(i, l); (void)wctrans((const char *)1234); (void)wctrans_l((const char *)1234, l); (void)wctype((const char *)1234); (void)wctype_l((const char *)1234, l); }
bool NWChar::IsControl(wchar_t c) { return iswcntrl(c); }
/* Returns the number of columns needed to represent the multibyte character string pointed to by STRING of length NBYTES. If a non-printable character occurs, and MBSW_REJECT_UNPRINTABLE is specified, -1 is returned. */ int mbsnwidth (const char *string, size_t nbytes, int flags) { const char *p = string; const char *plimit = p + nbytes; int width; width = 0; if (MB_CUR_MAX > 1) { while (p < plimit) switch (*p) { case ' ': case '!': case '"': case '#': case '%': case '&': case '\'': case '(': case ')': case '*': case '+': case ',': case '-': case '.': case '/': case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case ':': case ';': case '<': case '=': case '>': case '?': case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': case 'Y': case 'Z': case '[': case '\\': case ']': case '^': case '_': case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': case '{': case '|': case '}': case '~': /* These characters are printable ASCII characters. */ p++; width++; break; default: /* If we have a multibyte sequence, scan it up to its end. */ { mbstate_t mbstate; memset (&mbstate, 0, sizeof mbstate); do { wchar_t wc; size_t bytes; int w; bytes = mbrtowc (&wc, p, plimit - p, &mbstate); if (bytes == (size_t) -1) /* An invalid multibyte sequence was encountered. */ { if (!(flags & MBSW_REJECT_INVALID)) { p++; width++; break; } else return -1; } if (bytes == (size_t) -2) /* An incomplete multibyte character at the end. */ { if (!(flags & MBSW_REJECT_INVALID)) { p = plimit; width++; break; } else return -1; } if (bytes == 0) /* A null wide character was encountered. */ bytes = 1; w = wcwidth (wc); if (w >= 0) /* A printable multibyte character. */ { if (w > INT_MAX - width) goto overflow; width += w; } else /* An unprintable multibyte character. */ if (!(flags & MBSW_REJECT_UNPRINTABLE)) { if (!iswcntrl (wc)) { if (width == INT_MAX) goto overflow; width++; } } else return -1; p += bytes; } while (! mbsinit (&mbstate)); } break; } return width; } while (p < plimit) { unsigned char c = (unsigned char) *p++; if (isprint (c)) { if (width == INT_MAX) goto overflow; width++; } else if (!(flags & MBSW_REJECT_UNPRINTABLE)) { if (!iscntrl (c)) { if (width == INT_MAX) goto overflow; width++; } } else return -1; } return width; overflow: return INT_MAX; }
const bool needs_escape(const wint_t _char) { // Escaping is needed for control characters, // for double quote, and for backslash : return iswcntrl(_char) || (_char == '"') || (_char == '\\'); }
int __iswcntrl_l(wint_t c, locale_t l) { return iswcntrl(c); }
/// <summary>Convert string into a list of phrases with contiguous formatting</summary> /// <param name="str">string.</param> /// <returns>List of phrases</returns> PhraseList RichTextRenderer::GetPhrases(const RichString& str) { // space char as a RichCharacter static RichCharacter space(' ', Colour::Default, NULL); // lambda for assembling phrases static function<void (PhraseList& list, const RichCharacter*)> buildPhrases = [](PhraseList& list, const RichCharacter* ch) { // Init: Start first phrase if (list.empty()) list += RichPhrase(iswcntrl(ch->Char) ? space : *ch); else { RichPhrase& current = list.back(); // CRLF: Replace with space if (iswcntrl(ch->Char)) current += ' '; // Create new phrase if colour/formatting changes else if (ch->Colour != current.Colour || ch->Format != current.Format) list += RichPhrase(*ch); else // Otherwise append to last phrase current += ch->Char; } }; PhraseList phrases; // Author: Manual insert if (str.Author.length()) { // Parse colours + formatting for (auto& ch : RichStringParser(str.Author).Output.Characters) buildPhrases(phrases, ch); // Spacing phrase phrases += RichPhrase(L" ", NULL, Colour::Default); } // Title: Manual insert if (str.Title.length()) { // Parse colours + formatting for (auto& ch : RichStringParser(str.Title).Output.Characters) buildPhrases(phrases, ch); // Spacing phrase phrases += RichPhrase(L" ", NULL, Colour::Default); } // Embolden author/title, if any for (auto& p : phrases) { p.Format |= CFE_BOLD; p.CustomFont = L"Times New Roman"; } // Assemble phrases for (const RichCharacter* ch : str.Characters) buildPhrases(phrases, ch); return phrases; }
static int processStream (FILE *inputStream, const char *inputName) { mbstate_t inputState; mbstate_t outputState; memset(&inputState, 0, sizeof(inputState)); memset(&outputState, 0, sizeof(outputState)); while (!feof(inputStream)) { char inputBuffer[0X1000]; size_t inputCount = fread(inputBuffer, 1, sizeof(inputBuffer), inputStream); if (ferror(inputStream)) goto inputError; if (!inputCount) break; { char *byte = inputBuffer; while (inputCount) { wchar_t character; { size_t result = mbrtowc(&character, byte, inputCount, &inputState); if (result == (size_t)-2) break; if (result == (size_t)-1) goto inputError; if (!result) result = 1; byte += result; inputCount -= result; } if (!iswcntrl(character)) { unsigned char dots = toDots(character); if (dots || !iswspace(character)) { if (opt_sixDots) dots &= ~(BRL_DOT_7 | BRL_DOT_8); character = toCharacter(dots); } } if (!writeCharacter(&character, &outputState)) goto outputError; } } } if (!writeCharacter(NULL, &outputState)) goto outputError; fflush(outputStream); if (ferror(outputStream)) goto outputError; if (!mbsinit(&inputState)) { #ifdef EILSEQ errno = EILSEQ; #else /* EILSEQ */ errno = EINVAL; #endif /* EILSEQ */ goto inputError; } return 1; inputError: logMessage(LOG_ERR, "input error: %s: %s", inputName, strerror(errno)); return 0; outputError: logMessage(LOG_ERR, "output error: %s: %s", outputName, strerror(errno)); return 0; }
inline bool wcs_whitespace(const wchar_t c) { return (c) && (iswcntrl(c) || iswspace(c)); //return (c == L' ') || (c == L'\t') || (c == L'\n') || (c == L'\r'); }
int __wcwidth(__CONST wint_t ucs) { #ifdef _MB_CAPABLE /* sorted list of non-overlapping intervals of East Asian Ambiguous * characters, generated by "uniset +WIDTH-A -cat=Me -cat=Mn -cat=Cf c" */ static const struct interval ambiguous[] = { { 0x00A1, 0x00A1 }, { 0x00A4, 0x00A4 }, { 0x00A7, 0x00A8 }, { 0x00AA, 0x00AA }, { 0x00AE, 0x00AE }, { 0x00B0, 0x00B4 }, { 0x00B6, 0x00BA }, { 0x00BC, 0x00BF }, { 0x00C6, 0x00C6 }, { 0x00D0, 0x00D0 }, { 0x00D7, 0x00D8 }, { 0x00DE, 0x00E1 }, { 0x00E6, 0x00E6 }, { 0x00E8, 0x00EA }, { 0x00EC, 0x00ED }, { 0x00F0, 0x00F0 }, { 0x00F2, 0x00F3 }, { 0x00F7, 0x00FA }, { 0x00FC, 0x00FC }, { 0x00FE, 0x00FE }, { 0x0101, 0x0101 }, { 0x0111, 0x0111 }, { 0x0113, 0x0113 }, { 0x011B, 0x011B }, { 0x0126, 0x0127 }, { 0x012B, 0x012B }, { 0x0131, 0x0133 }, { 0x0138, 0x0138 }, { 0x013F, 0x0142 }, { 0x0144, 0x0144 }, { 0x0148, 0x014B }, { 0x014D, 0x014D }, { 0x0152, 0x0153 }, { 0x0166, 0x0167 }, { 0x016B, 0x016B }, { 0x01CE, 0x01CE }, { 0x01D0, 0x01D0 }, { 0x01D2, 0x01D2 }, { 0x01D4, 0x01D4 }, { 0x01D6, 0x01D6 }, { 0x01D8, 0x01D8 }, { 0x01DA, 0x01DA }, { 0x01DC, 0x01DC }, { 0x0251, 0x0251 }, { 0x0261, 0x0261 }, { 0x02C4, 0x02C4 }, { 0x02C7, 0x02C7 }, { 0x02C9, 0x02CB }, { 0x02CD, 0x02CD }, { 0x02D0, 0x02D0 }, { 0x02D8, 0x02DB }, { 0x02DD, 0x02DD }, { 0x02DF, 0x02DF }, { 0x0391, 0x03A1 }, { 0x03A3, 0x03A9 }, { 0x03B1, 0x03C1 }, { 0x03C3, 0x03C9 }, { 0x0401, 0x0401 }, { 0x0410, 0x044F }, { 0x0451, 0x0451 }, { 0x2010, 0x2010 }, { 0x2013, 0x2016 }, { 0x2018, 0x2019 }, { 0x201C, 0x201D }, { 0x2020, 0x2022 }, { 0x2024, 0x2027 }, { 0x2030, 0x2030 }, { 0x2032, 0x2033 }, { 0x2035, 0x2035 }, { 0x203B, 0x203B }, { 0x203E, 0x203E }, { 0x2074, 0x2074 }, { 0x207F, 0x207F }, { 0x2081, 0x2084 }, { 0x20AC, 0x20AC }, { 0x2103, 0x2103 }, { 0x2105, 0x2105 }, { 0x2109, 0x2109 }, { 0x2113, 0x2113 }, { 0x2116, 0x2116 }, { 0x2121, 0x2122 }, { 0x2126, 0x2126 }, { 0x212B, 0x212B }, { 0x2153, 0x2154 }, { 0x215B, 0x215E }, { 0x2160, 0x216B }, { 0x2170, 0x2179 }, { 0x2190, 0x2199 }, { 0x21B8, 0x21B9 }, { 0x21D2, 0x21D2 }, { 0x21D4, 0x21D4 }, { 0x21E7, 0x21E7 }, { 0x2200, 0x2200 }, { 0x2202, 0x2203 }, { 0x2207, 0x2208 }, { 0x220B, 0x220B }, { 0x220F, 0x220F }, { 0x2211, 0x2211 }, { 0x2215, 0x2215 }, { 0x221A, 0x221A }, { 0x221D, 0x2220 }, { 0x2223, 0x2223 }, { 0x2225, 0x2225 }, { 0x2227, 0x222C }, { 0x222E, 0x222E }, { 0x2234, 0x2237 }, { 0x223C, 0x223D }, { 0x2248, 0x2248 }, { 0x224C, 0x224C }, { 0x2252, 0x2252 }, { 0x2260, 0x2261 }, { 0x2264, 0x2267 }, { 0x226A, 0x226B }, { 0x226E, 0x226F }, { 0x2282, 0x2283 }, { 0x2286, 0x2287 }, { 0x2295, 0x2295 }, { 0x2299, 0x2299 }, { 0x22A5, 0x22A5 }, { 0x22BF, 0x22BF }, { 0x2312, 0x2312 }, { 0x2460, 0x24E9 }, { 0x24EB, 0x254B }, { 0x2550, 0x2573 }, { 0x2580, 0x258F }, { 0x2592, 0x2595 }, { 0x25A0, 0x25A1 }, { 0x25A3, 0x25A9 }, { 0x25B2, 0x25B3 }, { 0x25B6, 0x25B7 }, { 0x25BC, 0x25BD }, { 0x25C0, 0x25C1 }, { 0x25C6, 0x25C8 }, { 0x25CB, 0x25CB }, { 0x25CE, 0x25D1 }, { 0x25E2, 0x25E5 }, { 0x25EF, 0x25EF }, { 0x2605, 0x2606 }, { 0x2609, 0x2609 }, { 0x260E, 0x260F }, { 0x2614, 0x2615 }, { 0x261C, 0x261C }, { 0x261E, 0x261E }, { 0x2640, 0x2640 }, { 0x2642, 0x2642 }, { 0x2660, 0x2661 }, { 0x2663, 0x2665 }, { 0x2667, 0x266A }, { 0x266C, 0x266D }, { 0x266F, 0x266F }, { 0x273D, 0x273D }, { 0x2776, 0x277F }, { 0xE000, 0xF8FF }, { 0xFFFD, 0xFFFD }, { 0xF0000, 0xFFFFD }, { 0x100000, 0x10FFFD } }; /* sorted list of non-overlapping intervals of non-spacing characters */ /* generated by "uniset +cat=Me +cat=Mn +cat=Cf -00AD +1160-11FF +200B c" */ static const struct interval combining[] = { { 0x0300, 0x036F }, { 0x0483, 0x0486 }, { 0x0488, 0x0489 }, { 0x0591, 0x05BD }, { 0x05BF, 0x05BF }, { 0x05C1, 0x05C2 }, { 0x05C4, 0x05C5 }, { 0x05C7, 0x05C7 }, { 0x0600, 0x0603 }, { 0x0610, 0x0615 }, { 0x064B, 0x065E }, { 0x0670, 0x0670 }, { 0x06D6, 0x06E4 }, { 0x06E7, 0x06E8 }, { 0x06EA, 0x06ED }, { 0x070F, 0x070F }, { 0x0711, 0x0711 }, { 0x0730, 0x074A }, { 0x07A6, 0x07B0 }, { 0x07EB, 0x07F3 }, { 0x0901, 0x0902 }, { 0x093C, 0x093C }, { 0x0941, 0x0948 }, { 0x094D, 0x094D }, { 0x0951, 0x0954 }, { 0x0962, 0x0963 }, { 0x0981, 0x0981 }, { 0x09BC, 0x09BC }, { 0x09C1, 0x09C4 }, { 0x09CD, 0x09CD }, { 0x09E2, 0x09E3 }, { 0x0A01, 0x0A02 }, { 0x0A3C, 0x0A3C }, { 0x0A41, 0x0A42 }, { 0x0A47, 0x0A48 }, { 0x0A4B, 0x0A4D }, { 0x0A70, 0x0A71 }, { 0x0A81, 0x0A82 }, { 0x0ABC, 0x0ABC }, { 0x0AC1, 0x0AC5 }, { 0x0AC7, 0x0AC8 }, { 0x0ACD, 0x0ACD }, { 0x0AE2, 0x0AE3 }, { 0x0B01, 0x0B01 }, { 0x0B3C, 0x0B3C }, { 0x0B3F, 0x0B3F }, { 0x0B41, 0x0B43 }, { 0x0B4D, 0x0B4D }, { 0x0B56, 0x0B56 }, { 0x0B82, 0x0B82 }, { 0x0BC0, 0x0BC0 }, { 0x0BCD, 0x0BCD }, { 0x0C3E, 0x0C40 }, { 0x0C46, 0x0C48 }, { 0x0C4A, 0x0C4D }, { 0x0C55, 0x0C56 }, { 0x0CBC, 0x0CBC }, { 0x0CBF, 0x0CBF }, { 0x0CC6, 0x0CC6 }, { 0x0CCC, 0x0CCD }, { 0x0CE2, 0x0CE3 }, { 0x0D41, 0x0D43 }, { 0x0D4D, 0x0D4D }, { 0x0DCA, 0x0DCA }, { 0x0DD2, 0x0DD4 }, { 0x0DD6, 0x0DD6 }, { 0x0E31, 0x0E31 }, { 0x0E34, 0x0E3A }, { 0x0E47, 0x0E4E }, { 0x0EB1, 0x0EB1 }, { 0x0EB4, 0x0EB9 }, { 0x0EBB, 0x0EBC }, { 0x0EC8, 0x0ECD }, { 0x0F18, 0x0F19 }, { 0x0F35, 0x0F35 }, { 0x0F37, 0x0F37 }, { 0x0F39, 0x0F39 }, { 0x0F71, 0x0F7E }, { 0x0F80, 0x0F84 }, { 0x0F86, 0x0F87 }, { 0x0F90, 0x0F97 }, { 0x0F99, 0x0FBC }, { 0x0FC6, 0x0FC6 }, { 0x102D, 0x1030 }, { 0x1032, 0x1032 }, { 0x1036, 0x1037 }, { 0x1039, 0x1039 }, { 0x1058, 0x1059 }, { 0x1160, 0x11FF }, { 0x135F, 0x135F }, { 0x1712, 0x1714 }, { 0x1732, 0x1734 }, { 0x1752, 0x1753 }, { 0x1772, 0x1773 }, { 0x17B4, 0x17B5 }, { 0x17B7, 0x17BD }, { 0x17C6, 0x17C6 }, { 0x17C9, 0x17D3 }, { 0x17DD, 0x17DD }, { 0x180B, 0x180D }, { 0x18A9, 0x18A9 }, { 0x1920, 0x1922 }, { 0x1927, 0x1928 }, { 0x1932, 0x1932 }, { 0x1939, 0x193B }, { 0x1A17, 0x1A18 }, { 0x1B00, 0x1B03 }, { 0x1B34, 0x1B34 }, { 0x1B36, 0x1B3A }, { 0x1B3C, 0x1B3C }, { 0x1B42, 0x1B42 }, { 0x1B6B, 0x1B73 }, { 0x1DC0, 0x1DCA }, { 0x1DFE, 0x1DFF }, { 0x200B, 0x200F }, { 0x202A, 0x202E }, { 0x2060, 0x2063 }, { 0x206A, 0x206F }, { 0x20D0, 0x20EF }, { 0x302A, 0x302F }, { 0x3099, 0x309A }, { 0xA806, 0xA806 }, { 0xA80B, 0xA80B }, { 0xA825, 0xA826 }, { 0xFB1E, 0xFB1E }, { 0xFE00, 0xFE0F }, { 0xFE20, 0xFE23 }, { 0xFEFF, 0xFEFF }, { 0xFFF9, 0xFFFB }, { 0x10A01, 0x10A03 }, { 0x10A05, 0x10A06 }, { 0x10A0C, 0x10A0F }, { 0x10A38, 0x10A3A }, { 0x10A3F, 0x10A3F }, { 0x1D167, 0x1D169 }, { 0x1D173, 0x1D182 }, { 0x1D185, 0x1D18B }, { 0x1D1AA, 0x1D1AD }, { 0x1D242, 0x1D244 }, { 0xE0001, 0xE0001 }, { 0xE0020, 0xE007F }, { 0xE0100, 0xE01EF } }; /* Test for NUL character */ if (ucs == 0) return 0; /* Test for printable ASCII characters */ if (ucs >= 0x20 && ucs < 0x7f) return 1; /* Test for control characters */ if (ucs < 0xa0) return -1; /* Test for surrogate pair values. */ if (ucs >= 0xd800 && ucs <= 0xdfff) return -1; /* binary search in table of ambiguous characters */ if (__locale_cjk_lang () && bisearch(ucs, ambiguous, sizeof(ambiguous) / sizeof(struct interval) - 1)) return 2; /* binary search in table of non-spacing characters */ if (bisearch(ucs, combining, sizeof(combining) / sizeof(struct interval) - 1)) return 0; /* if we arrive here, ucs is not a combining or C0/C1 control character */ return 1 + (ucs >= 0x1100 && (ucs <= 0x115f || /* Hangul Jamo init. consonants */ ucs == 0x2329 || ucs == 0x232a || (ucs >= 0x2e80 && ucs <= 0xa4cf && ucs != 0x303f) || /* CJK ... Yi */ (ucs >= 0xac00 && ucs <= 0xd7a3) || /* Hangul Syllables */ (ucs >= 0xf900 && ucs <= 0xfaff) || /* CJK Compatibility Ideographs */ (ucs >= 0xfe10 && ucs <= 0xfe19) || /* Vertical forms */ (ucs >= 0xfe30 && ucs <= 0xfe6f) || /* CJK Compatibility Forms */ (ucs >= 0xff00 && ucs <= 0xff60) || /* Fullwidth Forms */ (ucs >= 0xffe0 && ucs <= 0xffe6) || (ucs >= 0x20000 && ucs <= 0x2fffd) || (ucs >= 0x30000 && ucs <= 0x3fffd))); #else /* !_MB_CAPABLE */ if (iswprint (ucs)) return 1; if (iswcntrl (ucs) || ucs == L'\0') return 0; return -1; #endif /* _MB_CAPABLE */ }
void test2() { unsigned char *s; unsigned char *buf; int i, j; size_t n; wchar_t c, d; mbstate_t state; s = malloc(256); if (!s) { bad++; return; } buf = malloc(MB_CUR_MAX); if (!buf) { bad++; free(s); return; } for (i = 0; i < 256; i++) s[i] = i+1; j = 0; mbrtowc(NULL, NULL, 1, &state); printf(" %02x: ", 0); while ((n = mbrtowc(&c, s+j, 256-j, &state)) == 1) { printf(" %02x: ", s[j]); check_bool(isalnum(s[j]), iswalnum(c), '1'); check_bool(isalpha(s[j]), iswalpha(c), '2'); check_bool(isblank(s[j]), iswblank(c), '3'); check_bool(iscntrl(s[j]), iswcntrl(c), '4'); check_bool(isdigit(s[j]), iswdigit(c), '5'); check_bool(isgraph(s[j]), iswgraph(c), '6'); check_bool(islower(s[j]), iswlower(c), '6'); check_bool(isprint(s[j]), iswprint(c), '7'); check_bool(ispunct(s[j]), iswpunct(c), '8'); check_bool(isspace(s[j]), iswspace(c), '9'); check_bool(isupper(s[j]), iswupper(c), 'a'); check_bool(isxdigit(s[j]), iswxdigit(c), 'b'); d = towlower(c); if (wctomb(buf, d) == 1) { check_value(tolower(s[j]), buf[0], 'c'); } else { bad++; } d = towupper(c); if (wctomb(buf, d) == 1) { check_value(toupper(s[j]), buf[0], 'c'); } else { bad++; } if (s[j] % 8 == 7) printf("\n"); j++; } if (n != 0 || j != 255) { bad++; } free(s); free(buf); }