| // -*- C++ -*- |
| //===------------------ support/win32/locale_android32.cpp ----------------===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is dual licensed under the MIT and the University of Illinois Open |
| // Source Licenses. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include <ctype.h> |
| |
| // Bionic exports the non-standard _ctype_ array in <ctype.h>, |
| // unfortunately, cannot be used directly for libc++ because it doesn't |
| // have a proper bit-flag for blank characters. |
| // |
| // Note that the header does define a _B flag (as 0x80), but it |
| // is only set on the space (32) character, and used to implement |
| // isprint() properly. The implementation of isblank() relies on |
| // direct comparisons with 9 and 32 instead. |
| // |
| // The following is a local copy of the Bionic _ctype_ array that has |
| // been modified in the following way: |
| // |
| // - It stores 16-bit unsigned values, instead of 8-bit char ones. |
| // |
| // - Bit flag _BLANK (0x100) is used to indicate blank characters. |
| // It is only set for indices 9 (TAB) and 32 (SPACE). |
| // |
| // - Support signed char properly for indexing. |
| |
| // Used to tag blank characters, this doesn't appear in <ctype.h> nor |
| // the original Bionic _ctype_ array. |
| #define _BLANK 0x100 |
| |
| // NOTE: A standalone forward declaration is required to ensure that this |
| // variable is properly exported with a C name. In other words, this does |
| // _not_ work: |
| // |
| // extern "C" { |
| // const char* const _ctype_android = ...; |
| // } |
| // |
| extern "C" const unsigned short* const _ctype_android; |
| |
| #if !defined(_U) |
| # if !defined(_CTYPE_U) |
| # error Bionic header ctype.h does not define either _U nor _CTYPE_U |
| # endif |
| # define _U _CTYPE_U |
| # define _L _CTYPE_L |
| # define _N _CTYPE_N |
| # define _S _CTYPE_S |
| # define _P _CTYPE_P |
| # define _C _CTYPE_C |
| # define _X _CTYPE_X |
| # define _B _CTYPE_B |
| #endif |
| |
| static const unsigned short ctype_android_tab[256+128] = { |
| /* -128..-1 */ |
| _C, _C, _C, _C, _C, _C, _C, _C, /* 80 */ |
| _C, _C, _C, _C, _C, _C, _C, _C, /* 88 */ |
| _C, _C, _C, _C, _C, _C, _C, _C, /* 90 */ |
| _C, _C, _C, _C, _C, _C, _C, _C, /* 98 */ |
| _P, _P, _P, _P, _P, _P, _P, _P, /* A0 */ |
| _P, _P, _P, _P, _P, _P, _P, _P, /* A8 */ |
| _P, _P, _P, _P, _P, _P, _P, _P, /* B0 */ |
| _P, _P, _P, _P, _P, _P, _P, _P, /* B8 */ |
| _P, _P, _P, _P, _P, _P, _P, _P, /* C0 */ |
| _P, _P, _P, _P, _P, _P, _P, _P, /* C8 */ |
| _P, _P, _P, _P, _P, _P, _P, _P, /* D0 */ |
| _P, _P, _P, _P, _P, _P, _P, _P, /* D8 */ |
| _P, _P, _P, _P, _P, _P, _P, _P, /* E0 */ |
| _P, _P, _P, _P, _P, _P, _P, _P, /* E8 */ |
| _P, _P, _P, _P, _P, _P, _P, _P, /* F0 */ |
| _P, _P, _P, _P, _P, _P, _P, _P, /* F8 */ |
| /* 0..127 */ |
| _C, _C, _C, _C, _C, _C, _C, _C, |
| _C, _C|_S|_BLANK, _C|_S, _C|_S, _C|_S, _C|_S, _C, _C, |
| _C, _C, _C, _C, _C, _C, _C, _C, |
| _C, _C, _C, _C, _C, _C, _C, _C, |
| _S|_B|_BLANK, _P, _P, _P, _P, _P, _P, _P, |
| _P, _P, _P, _P, _P, _P, _P, _P, |
| _N, _N, _N, _N, _N, _N, _N, _N, |
| _N, _N, _P, _P, _P, _P, _P, _P, |
| _P, _U|_X, _U|_X, _U|_X, _U|_X, _U|_X, _U|_X, _U, |
| _U, _U, _U, _U, _U, _U, _U, _U, |
| _U, _U, _U, _U, _U, _U, _U, _U, |
| _U, _U, _U, _P, _P, _P, _P, _P, |
| _P, _L|_X, _L|_X, _L|_X, _L|_X, _L|_X, _L|_X, _L, |
| _L, _L, _L, _L, _L, _L, _L, _L, |
| _L, _L, _L, _L, _L, _L, _L, _L, |
| /* determine printability based on the IS0 8859 8-bit standard */ |
| _L, _L, _L, _P, _P, _P, _P, _C, |
| /* 128..255, same as -128..127 */ |
| _C, _C, _C, _C, _C, _C, _C, _C, /* 80 */ |
| _C, _C, _C, _C, _C, _C, _C, _C, /* 88 */ |
| _C, _C, _C, _C, _C, _C, _C, _C, /* 90 */ |
| _C, _C, _C, _C, _C, _C, _C, _C, /* 98 */ |
| _P, _P, _P, _P, _P, _P, _P, _P, /* A0 */ |
| _P, _P, _P, _P, _P, _P, _P, _P, /* A8 */ |
| _P, _P, _P, _P, _P, _P, _P, _P, /* B0 */ |
| _P, _P, _P, _P, _P, _P, _P, _P, /* B8 */ |
| _P, _P, _P, _P, _P, _P, _P, _P, /* C0 */ |
| _P, _P, _P, _P, _P, _P, _P, _P, /* C8 */ |
| _P, _P, _P, _P, _P, _P, _P, _P, /* D0 */ |
| _P, _P, _P, _P, _P, _P, _P, _P, /* D8 */ |
| _P, _P, _P, _P, _P, _P, _P, _P, /* E0 */ |
| _P, _P, _P, _P, _P, _P, _P, _P, /* E8 */ |
| _P, _P, _P, _P, _P, _P, _P, _P, /* F0 */ |
| _P, _P, _P, _P, _P, _P, _P, _P, /* F8 */ |
| }; |
| |
| const unsigned short* const _ctype_android = ctype_android_tab + 128; |