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