1 /* Many of the following #defines are completely unused for the
2 nonce.  For each character,  its code point in code page 437,
3 Unicode,  and page 8859-1 are given.  The first is used for
4 non-wide builds in Win32 console,  DOS,  SDL,  and OS/2.
5 Unicode is used for all wide builds,  and for the non-wide
6 build of Win32a.  Code page 8859-1 is used for non-wide X11.
7 
8    All of these characters exist in CP437 and Unicode.  Some
9 don't exist in 8859-1,  in which case the last column is 'TBD'.
10 Only 32 are used in ncurses.  So caution is advised. */
11 
12 #ifdef USE_ISO8859_CHARSET
13    #define CHOOSE( A, B, C)   (C)
14    #define TBD '!'
15 #else
16    #define CHOOSE( A, B, C) (USE_UNICODE_ACS_CHARS ? B : A)
17 #endif
18 
19 /* Codes found from https://en.wikipedia.org/wiki/Code_page_437 */
20 
21 #define SMILE                             CHOOSE( 0x01,  0x263a,  'O')
22 #define REV_SMILE                         CHOOSE( 0x02,  0x263b,  'O')
23 #define HEART                             CHOOSE( 0x03,  0x2665,  'H')
24 #define DIAMOND                           CHOOSE( 0x04,  0x2666, 0x01)
25 #define CLUB                              CHOOSE( 0x05,  0x2663,  'C')
26 #define SPADE                             CHOOSE( 0x06,  0x2660,  'S')
27 #define MEDIUM_BULLET                     CHOOSE( 0x07,  0x2022, 0xb7)
28 #define REV_BULLET                        CHOOSE( 0x08,  0x2508, 0xb7)
29 #define WHITE_BULLET                      CHOOSE( 0x09,  0x25cb,    7)
30 #define REV_WHITE_BULLET                  CHOOSE( 0x0a,  0x25D9,    7)
31 #define MALE_SYM                          CHOOSE( 0x0b,  0x2642,  'm')
32 #define FEMALE_SYM                        CHOOSE( 0x0c,  0x2640,  'f')
33 #define QTR_NOTE                          CHOOSE( 0x0d,  0x266a, 0xbc)
34 #define EIGHTH_NOTE                       CHOOSE( 0x0e,  0x266b, 0xbd)
35 #define SPLAT                             CHOOSE( 0x0f,  0xa4  , 0xa4)
36 #define RIGHT_TRIANGLE                    CHOOSE( 0x10,  0x25b6,  '>')
37 #define LEFT_TRIANGLE                     CHOOSE( 0x11,  0x25c0,  '<')
38 #define UP_DOWN_ARROW                     CHOOSE( 0x12,  0x2195, 0x19)
39 #define DBL_BANG                          CHOOSE( 0x13,  0x203c,  '!')
40 #define PILCROW                           CHOOSE( 0x14,  0xb6  , 0xb6)
41 #define SECTION_SIGN                      CHOOSE( 0x15,  0xa7  , 0xa7)
42 #define LOW_QTR_BLOCK                     CHOOSE( 0x16,  0x25b2,  '_')
43 #define UP_DOWN_ARROW_UNDERSCORED         CHOOSE( 0x17,  0x21ab, 0x19)
44 #define UP_ARROW                          CHOOSE( 0x18,  0x2191,  '^')
45 #define DOWN_ARROW                        CHOOSE( 0x19,  0x2193,  'v')
46 #define RIGHT_ARROW                       CHOOSE( 0x1a,  0x2192,  '>')
47 #define LEFT_ARROW                        CHOOSE( 0x1b,  0x2190,  '<')
48 #define RIGHT_ANGLE                       CHOOSE( 0x1c,  0x221f,  0xe)
49 #define LEFT_RIGHT_ARROW                  CHOOSE( 0x1d,  0x2194,  '-')
50 #define UP_TRIANGLE                       CHOOSE( 0x1e,  0x25b2,  '^')
51 #define DOWN_TRIANGLE                     CHOOSE( 0x1f,  0x25bc,  'v')
52 
53 #define UPPERCASE_C_CEDILLA               CHOOSE( 0x80,  0xc7  , 0xc7)
54 #define LOWERCASE_U_UMLAUT                CHOOSE( 0x81,  0xfc  , 0xfc)
55 #define LOWERCASE_E_ACUTE                 CHOOSE( 0x82,  0xe9  , 0xe9)
56 #define LOWERCASE_A_CIRCUMFLEX            CHOOSE( 0x83,  0xe2  , 0xe2)
57 #define LOWERCASE_A_UMLAUT                CHOOSE( 0x84,  0xe4  , 0xe4)
58 #define LOWERCASE_A_GRAVE                 CHOOSE( 0x85,  0xe0  , 0xea)
59 #define LOWERCASE_A_RING                  CHOOSE( 0x86,  0xe5  , 0xe5)
60 #define LOWERCASE_C_CEDILLA               CHOOSE( 0x87,  0xe7  , 0xe7)
61 #define LOWERCASE_E_CIRCUMFLEX            CHOOSE( 0x88,  0xea  , 0xea)
62 #define LOWERCASE_E_UMLAUT                CHOOSE( 0x89,  0xeb  , 0xeb)
63 #define LOWERCASE_E_GRAVE                 CHOOSE( 0x8a,  0xe8  , 0xe8)
64 #define LOWERCASE_I_UMLAUT                CHOOSE( 0x8b,  0xef  , 0xef)
65 #define LOWERCASE_I_CIRCUMFLEX            CHOOSE( 0x8c,  0xee  , 0xee)
66 #define LOWERCASE_I_GRAVE                 CHOOSE( 0x8d,  0xec  , 0xce)
67 #define UPPERCASE_A_UMLAUT                CHOOSE( 0x8e,  0xc4  , 0xc4)
68 #define UPPERCASE_A_RING                  CHOOSE( 0x8f,  0xc5  , 0xc5)
69 
70 #define UPPERCASE_E_ACUTE                 CHOOSE( 0x90,  0xc9  , 0xc9)
71 #define LOWERCASE_AE_LIGATURE             CHOOSE( 0x91,  0xe6  , 0xe6)
72 #define UPPERCASE_AE_LIGATURE             CHOOSE( 0x92,  0xc6  , 0xc6)
73 #define LOWERCASE_O_CIRCUMFLEX            CHOOSE( 0x93,  0xf4  , 0xf4)
74 #define LOWERCASE_O_UMLAUT                CHOOSE( 0x94,  0xf6  , 0xf6)
75 #define LOWERCASE_O_GRAVE                 CHOOSE( 0x95,  0xf2  , 0xf2)
76 #define LOWERCASE_U_CIRCUMFLEX            CHOOSE( 0x96,  0xfb  , 0xfb)
77 #define LOWERCASE_U_GRAVE                 CHOOSE( 0x97,  0xf9  , 0xf9)
78 #define LOWERCASE_Y_UMLAUT                CHOOSE( 0x98,  0xff  , 0xff)
79 #define UPPERCASE_O_UMLAUT                CHOOSE( 0x99,  0xd6  , 0xd6)
80 #define UPPERCASE_U_UMLAUT                CHOOSE( 0x9a,  0xdc  , 0xdc)
81 #define CENT_SIGN                         CHOOSE( 0x9b,  0xa2  , 0xa2)
82 #define STERLING_SIGN                     CHOOSE( 0x9c,  0xa3  ,   30)
83 #define YEN_SIGN                          CHOOSE( 0x9d,  0xa5  , 0xa5)
84 #define PESETA_SIGN                       CHOOSE( 0x9e,  0x20a7,  TBD)
85 #define F_WITH_HOOK                       CHOOSE( 0x9f,  0x0192,  TBD)
86 
87 #define LOWERCASE_A_ACUTE                 CHOOSE( 0xa0,  0xe1  , 0xe1)
88 #define LOWERCASE_I_ACUTE                 CHOOSE( 0xa1,  0xed  , 0xed)
89 #define LOWERCASE_O_ACUTE                 CHOOSE( 0xa2,  0xf3  , 0xf3)
90 #define LOWERCASE_U_ACUTE                 CHOOSE( 0xa3,  0xfa  , 0xfa)
91 #define LOWERCASE_N_TILDE                 CHOOSE( 0xa4,  0xf1  , 0xf1)
92 #define UPPERCASE_N_TILDE                 CHOOSE( 0xa5,  0xd1  , 0xd1)
93 #define A_ORDINAL                         CHOOSE( 0xa6,  0xaa  , 0xaa)
94 #define O_ORDINAL                         CHOOSE( 0xa7,  0xba  , 0xba)
95 #define INVERTED_QUESTION_MARK            CHOOSE( 0xa8,  0xbf  , 0xbf)
96 #define REVERSED_NOT_SIGN                 CHOOSE( 0xa9,  0x2310,  TBD)
97 #define NOT_SIGN                          CHOOSE( 0xaa,  0xac  , 0xac)
98 #define VULGAR_HALF                       CHOOSE( 0xab,  0xbd  , 0xbd)
99 #define VULGAR_QUARTER                    CHOOSE( 0xac,  0xbc  , 0xbc)
100 #define INVERTED_EXCLAMATION_MARK         CHOOSE( 0xad,  0xa1  , 0xa1)
101 #define LEFT_ANGLE_QUOTE_MARK             CHOOSE( 0xae,  0xab  , 0xab)
102 #define RIGHT_ANGLE_QUOTE_MARK            CHOOSE( 0xaf,  0xbb  , 0xbb)
103 
104 #define LIGHT_SHADE                       CHOOSE( 0xb0,  0x2591, '#' )
105 #define MEDIUM_SHADE                      CHOOSE( 0xb1,  0x2592,    2)
106 #define DARK_SHADE                        CHOOSE( 0xb2,  0x2593,  TBD)
107 #define BOX_VLINE                         CHOOSE( 0xb3,  0x2502,   25)
108 #define BOX_RTEE                          CHOOSE( 0xb4,  0x2524,   22)
109 #define BOX_SD_RTEE                       CHOOSE( 0xb5,  0x2561,   22)
110 #define BOX_DS_RTEE                       CHOOSE( 0xb6,  0x2562,   22)
111 #define BOX_DS_URCORNER                   CHOOSE( 0xb7,  0x2556,   12)
112 #define BOX_SD_URCORNER                   CHOOSE( 0xb8,  0x2555,   12)
113 #define BOX_D_RTEE                        CHOOSE( 0xb9,  0x2563,   22)
114 #define BOX_D_VLINE                       CHOOSE( 0xba,  0x2551,   25)
115 #define BOX_D_URCORNER                    CHOOSE( 0xbb,  0x2557,   12)
116 #define BOX_D_LRCORNER                    CHOOSE( 0xbc,  0x255D,   11)
117 #define BOX_DS_LRCORNER                   CHOOSE( 0xbd,  0x255c,   11)
118 #define BOX_SD_LRCORNER                   CHOOSE( 0xbe,  0x255b,   11)
119 #define BOX_URCORNER                      CHOOSE( 0xbf,  0x2510,   12)
120 
121 #define BOX_LLCORNER                      CHOOSE( 0xc0,  0x2514,   14)
122 #define BOX_BTEE                          CHOOSE( 0xc1,  0x2534,   23)
123 #define BOX_TTEE                          CHOOSE( 0xc2,  0x252c,   24)
124 #define BOX_LTEE                          CHOOSE( 0xc3,  0x251c,   21)
125 #define BOX_HLINE                         CHOOSE( 0xc4,  0x2500,   18)
126 #define BOX_PLUS                          CHOOSE( 0xc5,  0x253c,   15)
127 #define BOX_SD_LTEE                       CHOOSE( 0xc6,  0x255e,   21)
128 #define BOX_DS_LTEE                       CHOOSE( 0xc7,  0x255f,   21)
129 #define BOX_D_LLCORNER                    CHOOSE( 0xc8,  0x255A,   14)
130 #define BOX_D_ULCORNER                    CHOOSE( 0xc9,  0x2554,   13)
131 #define BOX_D_BTEE                        CHOOSE( 0xca,  0x2569,   23)
132 #define BOX_D_TTEE                        CHOOSE( 0xcb,  0x2566,   24)
133 #define BOX_D_LTEE                        CHOOSE( 0xcc,  0x2560,   21)
134 #define BOX_D_HLINE                       CHOOSE( 0xcd,  0x2550,   18)
135 #define BOX_D_PLUS                        CHOOSE( 0xce,  0x256C,   15)
136 #define BOX_SD_BTEE                       CHOOSE( 0xcf,  0x2567,   23)
137 
138 #define BOX_DS_BTEE                       CHOOSE( 0xd0,  0x2568,   23)
139 #define BOX_SD_TTEE                       CHOOSE( 0xd1,  0x2564,   24)
140 #define BOX_DS_TTEE                       CHOOSE( 0xd2,  0x2565,   24)
141 #define BOX_DS_LLCORNER                   CHOOSE( 0xd3,  0x2559,   14)
142 #define BOX_SD_LLCORNER                   CHOOSE( 0xd4,  0x2558,   14)
143 #define BOX_SD_ULCORNER                   CHOOSE( 0xd5,  0x2552,   13)
144 #define BOX_DS_ULCORNER                   CHOOSE( 0xd6,  0x2553,   13)
145 #define BOX_DS_PLUS                       CHOOSE( 0xd7,  0x256b,   15)
146 #define BOX_SD_PLUS                       CHOOSE( 0xd8,  0x256a,   15)
147 #define BOX_LRCORNER                      CHOOSE( 0xd9,  0x2518,   11)
148 #define BOX_ULCORNER                      CHOOSE( 0xda,  0x250c,   13)
149 #define FULL_BLOCK                        CHOOSE( 0xdb,  0x2588,    0)
150 #define LOWER_HALF_BLOCK                  CHOOSE( 0xdc,  0x2584,  TBD)
151 #define LEFT_HALF_BLOCK                   CHOOSE( 0xdd,  0x258c,  TBD)
152 #define RIGHT_HALF_BLOCK                  CHOOSE( 0xde,  0x2590,  TBD)
153 #define UPPER_HALF_BLOCK                  CHOOSE( 0xdf,  0x2580,  TBD)
154 
155 #define ALPHA                             CHOOSE( 0xe0,  0x03b1,  TBD)
156 #define BETA                              CHOOSE( 0xe1,  0x00df,  TBD)
157 #define GAMMA                             CHOOSE( 0xe2,  0x0393,  TBD)
158 #define PI                                CHOOSE( 0xe3,  0x03c0,   28)
159 #define UPPERCASE_SIGMA                   CHOOSE( 0xe4,  0x03a3,  TBD)
160 #define LOWERCASE_SIGMA                   CHOOSE( 0xe5,  0x03c3,  TBD)
161 #define MU                                CHOOSE( 0xe6,  0x00b5, 0xb5)
162 #define TAU                               CHOOSE( 0xe7,  0x03c4,  TBD)
163 #define UPPERCASE_PHI                     CHOOSE( 0xe8,  0x03a6,  TBD)
164 #define THETA                             CHOOSE( 0xe9,  0x0398,  TBD)
165 #define OMEGA                             CHOOSE( 0xea,  0x03a9,  TBD)
166 #define DELTA                             CHOOSE( 0xeb,  0x03b4,  TBD)
167 #define INFINITY_SIGN                     CHOOSE( 0xec,  0x221e,  TBD)
168 #define LOWERCASE_PHI                     CHOOSE( 0xed,  0x03c6,  TBD)
169 #define EPSILON                           CHOOSE( 0xee,  0x03b5,  TBD)
170 #define INTERSECTION                      CHOOSE( 0xef,  0x2229,  TBD)
171 
172 #define TRIPLE_BAR                        CHOOSE( 0xf0,  0x2261,  TBD)
173 #define PLUS_OR_MINUS                     CHOOSE( 0xf1,  0x00b1,    8)
174 #define GREATER_THAN_OR_EQUAL_TO          CHOOSE( 0xf2,  0x2265,   27)
175 #define LESSER_THAN_OR_EQUAL_TO           CHOOSE( 0xf3,  0x2264,   26)
176 #define UPPER_HALF_INTEGRAL_SIGN          CHOOSE( 0xf4,  0x2320,  TBD)
177 #define LOWER_HALF_INTEGRAL_SIGN          CHOOSE( 0xf5,  0x2321,  TBD)
178 #define DIVISION_SIGN                     CHOOSE( 0xf6,  0x00f7, 0xf7)
179 #define APPROXIMATELY_EQUALS_SIGN         CHOOSE( 0xf7,  0x2248,  TBD)
180 #define DEGREE_SIGN                       CHOOSE( 0xf8,  0x00b0, 0xb0)
181 #define LARGE_BULLET                      CHOOSE( 0xf9,  0x2219,    7)
182 #define SMALL_BULLET                      CHOOSE( 0xfa,  0x00b7, 0xb7)
183 #define SQUARE_ROOT                       CHOOSE( 0xfb,  0x221a,  TBD)
184 #define SUPERSCRIPT_N                     CHOOSE( 0xfc,  0x207f,  TBD)
185 #define SUPERSCRIPT_2                     CHOOSE( 0xfd,  0x00b2, 0xb2)
186 #define CENTERED_SQUARE                   CHOOSE( 0xfe,  0x25a0,  TBD)
187 #define NON_BREAKING_SPACE                CHOOSE( 0xff,  0x00a0,  TBD)
188 
189 
190 
191       /* It says at http://unicode.org/charts/PDF/U2300.pdf */
192       /* that '...the scan line numbers here refer to old,  */
193       /* low-resolution technology for terminals, with only */
194       /* nine scan lines per fixed-size character glyph.    */
195       /* Even-numbered scan lines are unified with box      */
196       /* drawing graphics."                                 */
197       /*  The utility of these is questionable;  they'd     */
198       /* work Just Fine in win32a (_if_ the appropriate     */
199       /* glyphs are available),  but not elsewhere.         */
200 #define HORIZ_SCAN_LINE_1                 CHOOSE( 0x2d,  0x23ba,   16)
201 #define HORIZ_SCAN_LINE_3                 CHOOSE( 0x2d,  0x23bb,   17)
202 #define HORIZ_SCAN_LINE_7                 CHOOSE( 0x2d,  0x23bc,   19)
203 #define HORIZ_SCAN_LINE_9                 CHOOSE(  '_',  0x23bd,   20)
204 
205       /* Code page 437 lacks a 'for real' not-equals,  so for that, */
206       /* we use the double-horizontal single-vertical box drawing : */
207 #define NOT_EQUALS_SIGN                   CHOOSE( 0xd8, 0x2260,    29)
208 
209 # define A(x) ((chtype)x | A_ALTCHARSET)
210 
211 chtype acs_map[128] =
212 {
213    A(0), A(1), A(2), A(3), A(4), A(5), A(6), A(7), A(8),
214    A(9), A(10),
215    CLUB, HEART, SPADE, SMILE, REV_SMILE,                      /* 11 12 13 14 15 */
216    MEDIUM_BULLET, WHITE_BULLET, PILCROW, SECTION_SIGN,        /* 16 17 18 19 */
217    A_ORDINAL, O_ORDINAL, LOWERCASE_PHI,                       /* 20 21 22 */
218    INVERTED_EXCLAMATION_MARK, INVERTED_QUESTION_MARK,         /* 23 24 */
219    REVERSED_NOT_SIGN, NOT_SIGN,                               /* 25 26 */
220    UPPER_HALF_INTEGRAL_SIGN, LOWER_HALF_INTEGRAL_SIGN,        /* 27 28   */
221    SUPERSCRIPT_N, CENTERED_SQUARE, F_WITH_HOOK,               /* 29 30 31 */
222 
223    RIGHT_ARROW, LEFT_ARROW, UP_ARROW, DOWN_ARROW,             /* 32 !"# */
224 
225    PI, NOT_EQUALS_SIGN,  VULGAR_HALF, VULGAR_QUARTER,         /* $%&' */
226    '(',
227    LEFT_ANGLE_QUOTE_MARK, RIGHT_ANGLE_QUOTE_MARK,             /* )* */
228    DARK_SHADE, SUPERSCRIPT_2, INFINITY_SIGN,                  /* +,- */
229    ALPHA, BETA, GAMMA, UPPERCASE_SIGMA, LOWERCASE_SIGMA,      /* ./012  */
230    '3',
231    MU, TAU, UPPERCASE_PHI, THETA, OMEGA, DELTA, EPSILON,      /* 456789: */
232 
233    BOX_SD_LRCORNER, BOX_SD_URCORNER, BOX_SD_ULCORNER,         /* ;<= */
234    BOX_SD_LLCORNER, BOX_SD_PLUS,                              /* >? */
235    BOX_SD_LTEE, BOX_SD_RTEE, BOX_SD_BTEE, BOX_SD_TTEE,        /* @ABC */
236 
237    BOX_D_LRCORNER, BOX_D_URCORNER, BOX_D_ULCORNER,             /* DEF */
238    BOX_D_LLCORNER, BOX_D_PLUS,                                 /* GH */
239    BOX_D_LTEE, BOX_D_RTEE, BOX_D_BTEE, BOX_D_TTEE,             /* IJKL */
240 
241    BOX_DS_LRCORNER, BOX_DS_URCORNER, BOX_DS_ULCORNER,          /* MNO */
242    BOX_DS_LLCORNER, BOX_DS_PLUS,                               /* PQ */
243    BOX_DS_LTEE, BOX_DS_RTEE, BOX_DS_BTEE, BOX_DS_TTEE,         /* RSTU */
244 
245    BOX_LRCORNER, BOX_URCORNER, BOX_ULCORNER,                   /* VWX */
246    BOX_LLCORNER, BOX_PLUS,                                     /* YZ */
247    BOX_LTEE, BOX_RTEE, BOX_BTEE, BOX_TTEE,                     /* [\]^ */
248 
249    BOX_HLINE, BOX_VLINE, BOX_D_HLINE, BOX_D_VLINE,             /* _`ab */
250 
251    DIVISION_SIGN, APPROXIMATELY_EQUALS_SIGN,                   /* cd */
252    INTERSECTION, TRIPLE_BAR,                                   /* ef */
253    SMALL_BULLET, LARGE_BULLET, SQUARE_ROOT,                    /* ghi */
254    DIAMOND, MEDIUM_SHADE,                                      /* jk */
255    HORIZ_SCAN_LINE_1, HORIZ_SCAN_LINE_3,                       /* lm */
256    HORIZ_SCAN_LINE_7, HORIZ_SCAN_LINE_9,                       /* no */
257    UPPER_HALF_BLOCK, LOWER_HALF_BLOCK,                         /* pq */
258    LEFT_HALF_BLOCK, RIGHT_HALF_BLOCK, FULL_BLOCK,              /* rst */
259    LESSER_THAN_OR_EQUAL_TO, GREATER_THAN_OR_EQUAL_TO,          /* uv */
260    DEGREE_SIGN, PLUS_OR_MINUS, LIGHT_SHADE, SPLAT,             /* wxyz */
261    CENT_SIGN, YEN_SIGN, PESETA_SIGN, STERLING_SIGN,            /* {|}~ */
262     A(127)
263 };
264 
265 # undef A
266