1 /*
2 * Schism Tracker - a cross-platform Impulse Tracker clone
3 * copyright (c) 2003-2005 Storlek <storlek@rigelseven.com>
4 * copyright (c) 2005-2008 Mrs. Brisby <mrs.brisby@nimh.org>
5 * copyright (c) 2009 Storlek & Mrs. Brisby
6 * copyright (c) 2010-2012 Storlek
7 * URL: http://schismtracker.org/
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 */
23
24 #include "headers.h"
25
26 #include "charset.h"
27
28 /* real character set stuff will occur here eventually... */
29
30
char_digraph(int k1,int k2)31 int char_digraph(int k1, int k2)
32 {
33 //int c;
34 #define DG(ax) ((k1==ax[0] && k2 == ax[1])||(k2==ax[0] && k1==ax[1]))
35 if (DG("NB")) return '#';
36 if (DG("DO")) return '$';
37 if (DG("At")) return '@';
38 if (DG("<(")) return '[';
39 if (DG("//")) return '\\';
40 if (DG(")>")) return ']';
41 if (DG("'>")) return '^';
42 if (DG("'!")) return '`';
43 if (DG("(!")) return '{';
44 if (DG("!!")) return '|';
45 if (DG("!)")) return '{';
46 if (DG("'?")) return '~';
47 if (DG("C,")) return 128; // LATIN CAPITAL LETTER C WITH CEDILLA
48 if (DG("u:")) return 129; // LATIN SMALL LETTER U WITH DIAERESIS
49 if (DG("e'")) return 130; // LATIN SMALL LETTER E WITH ACUTE
50 if (DG("a>")) return 131; // LATIN SMALL LETTER A WITH CIRCUMFLEX
51 if (DG("a:")) return 132; // LATIN SMALL LETTER A WITH DIAERESIS
52 if (DG("a!")) return 133; // LATIN SMALL LETTER A WITH GRAVE
53 if (DG("aa")) return 134; // LATIN SMALL LETTER A WITH RING ABOVE
54 if (DG("c,")) return 135; // LATIN SMALL LETTER C WITH CEDILLA
55 if (DG("e>")) return 136; // LATIN SMALL LETTER E WITH CIRCUMFLEX
56 if (DG("e:")) return 137; // LATIN SMALL LETTER E WITH DIAERESIS
57 if (DG("e!")) return 138; // LATIN SMALL LETTER E WITH GRAVE
58 if (DG("i:")) return 139; // LATIN SMALL LETTER I WITH DIAERESIS
59 if (DG("i>")) return 140; // LATIN SMALL LETTER I WITH CIRCUMFLEX
60 if (DG("i!")) return 141; // LATIN SMALL LETTER I WITH GRAVE
61 if (DG("A:")) return 142; // LATIN CAPITAL LETTER A WITH DIAERESIS
62 if (DG("AA")) return 143; // LATIN CAPITAL LETTER A WITH RING ABOVE
63 if (DG("E'")) return 144; // LATIN CAPITAL LETTER E WITH ACUTE
64 if (DG("ae")) return 145; // LATIN SMALL LETTER AE
65 if (DG("AE")) return 146; // LATIN CAPITAL LETTER AE
66 if (DG("o>")) return 147; // LATIN SMALL LETTER O WITH CIRCUMFLEX
67 if (DG("o:")) return 148; // LATIN SMALL LETTER O WITH DIAERESIS
68 if (DG("o!")) return 149; // LATIN SMALL LETTER O WITH GRAVE
69 if (DG("u>")) return 150; // LATIN SMALL LETTER U WITH CIRCUMFLEX
70 if (DG("u!")) return 151; // LATIN SMALL LETTER U WITH GRAVE
71 if (DG("y:")) return 152; // LATIN SMALL LETTER Y WITH DIAERESIS
72 if (DG("O:")) return 153; // LATIN CAPITAL LETTER O WITH DIAERESIS
73 if (DG("U:")) return 154; // LATIN CAPITAL LETTER U WITH DIAERESIS
74 if (DG("Ct")) return 155; // CENT SIGN
75 if (DG("Pd")) return 156; // POUND SIGN
76 if (DG("Ye")) return 157; // YEN SIGN
77 if (DG("Pt")) return 158;
78 if (DG("ff")) return 159;
79 if (DG("a'")) return 160; // LATIN SMALL LETTER A WITH ACUTE
80 if (DG("i'")) return 161; // LATIN SMALL LETTER I WITH ACUTE
81 if (DG("o'")) return 162; // LATIN SMALL LETTER O WITH ACUTE
82 if (DG("u'")) return 163; // LATIN SMALL LETTER U WITH ACUTE
83 if (DG("n?")) return 164; // LATIN SMALL LETTER N WITH TILDE
84 if (DG("N?")) return 165; // LATIN CAPITAL LETTER N WITH TILDE
85 if (DG("-a")) return 166; // FEMININE ORDINAL INDICATOR
86 if (DG("-o")) return 167; // MASCULINE ORDINAL INDICATOR
87 if (DG("?I")) return 168; // INVERTED QUESTION MARK
88
89 if (DG("NO")) return 170; // NOT SIGN
90 if (DG("12")) return 171; // VULGAR FRACTION ONE HALF
91 if (DG("14")) return 174; // VULGAR FRACTION ONE QUARTER
92 if (DG("!I")) return 175; // INVERTED EXCLAMATION MARK
93 if (DG("<<")) return 176; // LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
94 if (DG(">>")) return 177; // RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
95
96 if (DG("ss")) return 225; // LATIN SMALL LETTER SHARP S
97 if (DG("pi")) return 227; // PI... mmm... pie...
98 if (DG("My")) return 230; // MICRO SIGN
99 if (DG("o/")) return 237; // LATIN SMALL LETTER O WITH STROKE
100 if (DG("O/")) return 237; // LATIN SMALL LETTER O WITH STROKE
101 if (DG("+-")) return 241; // PLUS-MINUS SIGN
102 if (DG("-:")) return 246; // DIVISION SIGN
103 if (DG("DG")) return 248; // DEGREE SIGN
104 if (DG(".M")) return 249; // MIDDLE DOT
105 if (DG("2S")) return 253; // SUPERSCRIPT TWO
106 if (DG("nS")) return 252;
107
108 if (DG("PI")) return 20; // PILCROW SIGN
109 if (DG("SE")) return 21; // SECTION SIGN
110 #undef DG
111 return 0;
112 }
char_unicode_to_cp437(unsigned int c)113 int char_unicode_to_cp437(unsigned int c)
114 {
115 if (c >= 32 && c <= 127) return c;
116 switch (c) {
117 case 0x263A: return 1; // WHITE SMILING FACE
118 case 0x263B: return 2; // BLACK SMILING FACE
119 case 0x2661:
120 case 0x2665: return 3; // BLACK HEART
121 case 0x2662:
122 case 0x25C6:
123 case 0x2666: return 4; // BLACK DIAMOND
124 case 0x2667:
125 case 0x2663: return 5; // BLACK CLUBS
126 case 0x2664:
127 case 0x2660: return 6; // BLACK SPADE
128 case 0x25CF: return 7; // BLACK CIRCLE
129 case 0x25D8: return 8; // INVERSE BULLET
130 case 0x25CB:
131 case 0x25E6:
132 case 0x25EF: return 9; // LARGE CIRCLE
133 case 0x25D9: return 10; // INVERSE WHITE CIRCLE
134 case 0x2642: return 11; // MALE / MARS
135 case 0x2640: return 12; // FEMALE / VENUS
136 case 0x266A: return 13; // EIGHTH NOTE
137 case 0x266B: return 14; // BEAMED EIGHTH NOTES
138
139 case 0x2195: return 18; // UP DOWN ARROW
140 case 0x203C: return 19; // DOUBLE EXCLAMATION MARK
141 case 0x00B6: return 20; // PILCROW SIGN
142 case 0x00A7: return 21; // SECTION SIGN
143
144 case 0x21A8: return 23; // UP DOWN ARROW WITH BASE
145 case 0x2191: return 24; // UPWARD ARROW
146 case 0x2193: return 25; // DOWNWARD ARROW
147 case 0x2192: return 26; // RIGHTWARD ARROW
148 case 0x2190: return 27; // LEFTWARD ARROW
149
150 case 0x2194: return 29; // LEFT RIGHT ARROW
151
152 case 0x266F: return '#';// MUSIC SHARP SIGN
153 case 0x00A6: return 124;
154 case 0x0394:
155 case 0x2302: return 127;// HOUSE
156
157 case 0x20B5:
158 case 0x20B2:
159 case 0x00A2: return 155;// CENT SIGN
160 case 0x00A3: return 156;// POUND SIGN
161 case 0x00A5: return 157;// YEN SIGN
162
163 case 0x2310: return 169;// REVERSED NOT SIGN
164 case 0x00AC: return 170;// NOT SIGN
165 case 0x00BD: return 171;// 1/2
166 case 0x00BC: return 172;// 1/4
167 case 0x00A1: return 173;// INVERTED EXCLAMATION MARK
168 case 0x00AB: return 174;// <<
169 case 0x00BB: return 175;// >>
170
171 case 0x2591: return 176;// LIGHT SHADE
172 case 0x2592: return 177;// MEDIUM SHADE
173 case 0x2593: return 178;// DARK SHADE
174
175 // BOX DRAWING
176 case 0x2502: return 179;
177 case 0x2524: return 180;
178 case 0x2561: return 181;
179 case 0x2562: return 182;
180 case 0x2556: return 183;
181 case 0x2555: return 184;
182 case 0x2563: return 185;
183 case 0x2551: return 186;
184 case 0x2557: return 187;
185 case 0x255D: return 188;
186 case 0x255C: return 189;
187 case 0x255B: return 190;
188 case 0x2510: return 191;
189 case 0x2514: return 192;
190 case 0x2534: return 193;
191 case 0x252C: return 194;
192 case 0x251C: return 195;
193 case 0x2500: return 196;
194 case 0x253C: return 197;
195 case 0x255E: return 198;
196 case 0x255F: return 199;
197 case 0x255A: return 200;
198 case 0x2554: return 201;
199 case 0x2569: return 202;
200 case 0x2566: return 203;
201 case 0x2560: return 204;
202 case 0x2550: return 205;
203 case 0x256C: return 206;
204 case 0x2567: return 207;
205 case 0x2568: return 208;
206 case 0x2564: return 209;
207 case 0x2565: return 210;
208 case 0x2559: return 211;
209 case 0x2558: return 212;
210 case 0x2552: return 213;
211 case 0x2553: return 214;
212 case 0x256B: return 215;
213 case 0x256A: return 216;
214 case 0x2518: return 217;
215 case 0x250C: return 218;
216 case 0x25A0: return 219;// BLACK SQUARE
217 case 0x2584: return 220;// LOWER HALF BLOCK
218 case 0x258C: return 221;// LEFT HALF BLOCK
219 case 0x2590: return 222;// RIGHT HALF BLOCK
220 case 0x2580: return 223;// UPPER HALF BLOCK
221
222 case 0x03B1: return 224;// GREEK SMALL LETTER ALPHA
223 case 0x03B2: return 225;// GREEK SMALL LETTER BETA
224 case 0x0393: return 226;// GREEK CAPITAL LETTER GAMMA
225 case 0x03C0: return 227;// mmm... pie...
226 case 0x03A3:
227 case 0x2211: return 228;// N-ARY SUMMATION / CAPITAL SIGMA
228 case 0x03C3: return 229;// GREEK SMALL LETTER SIGMA
229 case 0x03BC:
230 case 0x00b5: return 230;// GREEK SMALL LETTER MU
231 case 0x03C4:
232 case 0x03D2: return 231;// GREEK UPSILON+HOOK
233
234 case 0x03B8: return 233;// GREEK SMALL LETTER THETA
235 case 0x03A9: return 234;// GREEK CAPITAL LETTER OMEGA
236 case 0x03B4: return 235;// GREEK SMALL LETTER DELTA
237
238 case 0x221E: return 236;// INFINITY
239 case 0x00D8:
240 case 0x00F8: return 237;// LATIN ... LETTER O WITH STROKE
241 case 0x03F5: return 238;// GREEK LUNATE EPSILON SYMBOL
242 case 0x2229:
243 case 0x03A0: return 239;// GREEK CAPITAL LETTER PI
244 case 0x039E: return 240;// GREEK CAPITAL LETTER XI
245 case 0x00b1: return 241;// PLUS-MINUS SIGN
246 case 0x2265: return 242;// GREATER-THAN OR EQUAL TO
247 case 0x2264: return 243;// LESS-THAN OR EQUAL TO
248 case 0x2320: return 244;// TOP HALF INTEGRAL
249 case 0x2321: return 245;// BOTTOM HALF INTEGRAL
250 case 0x00F7: return 246;// DIVISION SIGN
251 case 0x2248: return 247;// ALMOST EQUAL TO
252 case 0x00B0: return 248;// DEGREE SIGN
253 case 0x00B7: return 249;// MIDDLE DOT
254 case 0x2219:
255 case 0x0387: return 250;// GREEK ANO TELEIA
256 case 0x221A: return 251;// SQUARE ROOT
257 // NO UNICODE ALLOCATION?
258 case 0x00B2: return 253;// SUPERSCRIPT TWO
259 case 0x220E: return 254;// QED
260 };
261 return c;
262 }
263