1 // -*- C++ -*-
2 //===-------------------- support/win32/locale_win32.cpp ------------------===//
3 //
4 //                     The LLVM Compiler Infrastructure
5 //
6 // This file is dual licensed under the MIT and the University of Illinois Open
7 // Source Licenses. See LICENSE.TXT for details.
8 //
9 //===----------------------------------------------------------------------===//
10 
11 #include <ctype.h>
12 
13 // Bionic exports the non-standard _ctype_ array in <ctype.h>,
14 // unfortunately, cannot be used directly for libc++ because it doesn't
15 // have a proper bit-flag for blank characters.
16 //
17 // Note that the header does define a _B flag (as 0x80), but it
18 // is only set on the space (32) character, and used to implement
19 // isprint() properly. The implementation of isblank() relies on
20 // direct comparisons with 9 and 32 instead.
21 //
22 // The following is a local copy of the Bionic _ctype_ array that has
23 // been modified in the following way:
24 //
25 //   - It stores 16-bit unsigned values, instead of 8-bit char ones.
26 //
27 //   - Bit flag _BLANK (0x100) is used to indicate blank characters.
28 //     It is only set for indices 9 (TAB) and 32 (SPACE).
29 //
30 //   - Support signed char properly for indexing.
31 
32 // Used to tag blank characters, this doesn't appear in <ctype.h> nor
33 // the original Bionic _ctype_ array.
34 #define _BLANK  0x100
35 
36 // NOTE: A standalone forward declaration is required to ensure that this
37 // variable is properly exported with a C name. In other words, this does
38 // _not_ work:
39 //
40 //  extern "C" {
41 //  const char* const _ctype_android = ...;
42 //  }
43 //
44 extern "C" const unsigned short* const _ctype_android;
45 
46 #if !defined(_U)
47 #  if !defined(_CTYPE_U)
48 #   error Bionic header ctype.h does not define either _U nor _CTYPE_U
49 #  endif
50 #  define _U _CTYPE_U
51 #  define _L _CTYPE_L
52 #  define _N _CTYPE_N
53 #  define _S _CTYPE_S
54 #  define _P _CTYPE_P
55 #  define _C _CTYPE_C
56 #  define _X _CTYPE_X
57 #  define _B _CTYPE_B
58 #endif
59 
60 static const unsigned short ctype_android_tab[256+128] = {
61        /* -128..-1 */
62         _C,     _C,           _C,     _C,     _C,     _C,     _C,     _C, /* 80 */
63         _C,     _C,           _C,     _C,     _C,     _C,     _C,     _C, /* 88 */
64         _C,     _C,           _C,     _C,     _C,     _C,     _C,     _C, /* 90 */
65         _C,     _C,           _C,     _C,     _C,     _C,     _C,     _C, /* 98 */
66         _P,     _P,           _P,     _P,     _P,     _P,     _P,     _P, /* A0 */
67         _P,     _P,           _P,     _P,     _P,     _P,     _P,     _P, /* A8 */
68         _P,     _P,           _P,     _P,     _P,     _P,     _P,     _P, /* B0 */
69         _P,     _P,           _P,     _P,     _P,     _P,     _P,     _P, /* B8 */
70         _P,     _P,           _P,     _P,     _P,     _P,     _P,     _P, /* C0 */
71         _P,     _P,           _P,     _P,     _P,     _P,     _P,     _P, /* C8 */
72         _P,     _P,           _P,     _P,     _P,     _P,     _P,     _P, /* D0 */
73         _P,     _P,           _P,     _P,     _P,     _P,     _P,     _P, /* D8 */
74         _P,     _P,           _P,     _P,     _P,     _P,     _P,     _P, /* E0 */
75         _P,     _P,           _P,     _P,     _P,     _P,     _P,     _P, /* E8 */
76         _P,     _P,           _P,     _P,     _P,     _P,     _P,     _P, /* F0 */
77         _P,     _P,           _P,     _P,     _P,     _P,     _P,     _P, /* F8 */
78        /* 0..127 */
79         _C,     _C,           _C,     _C,     _C,     _C,     _C,     _C,
80         _C,     _C|_S|_BLANK, _C|_S,  _C|_S,  _C|_S,  _C|_S,  _C,     _C,
81         _C,     _C,           _C,     _C,     _C,     _C,     _C,     _C,
82         _C,     _C,           _C,     _C,     _C,     _C,     _C,     _C,
83   _S|_B|_BLANK, _P,           _P,     _P,     _P,     _P,     _P,     _P,
84         _P,     _P,           _P,     _P,     _P,     _P,     _P,     _P,
85         _N,     _N,           _N,     _N,     _N,     _N,     _N,     _N,
86         _N,     _N,           _P,     _P,     _P,     _P,     _P,     _P,
87         _P,     _U|_X,        _U|_X,  _U|_X,  _U|_X,  _U|_X,  _U|_X,  _U,
88         _U,     _U,           _U,     _U,     _U,     _U,     _U,     _U,
89         _U,     _U,           _U,     _U,     _U,     _U,     _U,     _U,
90         _U,     _U,           _U,     _P,     _P,     _P,     _P,     _P,
91         _P,     _L|_X,        _L|_X,  _L|_X,  _L|_X,  _L|_X,  _L|_X,  _L,
92         _L,     _L,           _L,     _L,     _L,     _L,     _L,     _L,
93         _L,     _L,           _L,     _L,     _L,     _L,     _L,     _L,
94         /* determine printability based on the IS0 8859 8-bit standard */
95         _L,     _L,           _L,     _P,     _P,     _P,     _P,     _C,
96         /* 128..255, same as -128..127 */
97         _C,     _C,           _C,     _C,     _C,     _C,     _C,     _C, /* 80 */
98         _C,     _C,           _C,     _C,     _C,     _C,     _C,     _C, /* 88 */
99         _C,     _C,           _C,     _C,     _C,     _C,     _C,     _C, /* 90 */
100         _C,     _C,           _C,     _C,     _C,     _C,     _C,     _C, /* 98 */
101         _P,     _P,           _P,     _P,     _P,     _P,     _P,     _P, /* A0 */
102         _P,     _P,           _P,     _P,     _P,     _P,     _P,     _P, /* A8 */
103         _P,     _P,           _P,     _P,     _P,     _P,     _P,     _P, /* B0 */
104         _P,     _P,           _P,     _P,     _P,     _P,     _P,     _P, /* B8 */
105         _P,     _P,           _P,     _P,     _P,     _P,     _P,     _P, /* C0 */
106         _P,     _P,           _P,     _P,     _P,     _P,     _P,     _P, /* C8 */
107         _P,     _P,           _P,     _P,     _P,     _P,     _P,     _P, /* D0 */
108         _P,     _P,           _P,     _P,     _P,     _P,     _P,     _P, /* D8 */
109         _P,     _P,           _P,     _P,     _P,     _P,     _P,     _P, /* E0 */
110         _P,     _P,           _P,     _P,     _P,     _P,     _P,     _P, /* E8 */
111         _P,     _P,           _P,     _P,     _P,     _P,     _P,     _P, /* F0 */
112         _P,     _P,           _P,     _P,     _P,     _P,     _P,     _P, /* F8 */
113 };
114 
115 const unsigned short* const _ctype_android = ctype_android_tab + 128;
116