Adding support for composite glyphs: \[xxx yyy ...] and the
[s-roff.git] / src / roff / troff / uniglyph.cc
blob3efb4910de6a0b5887d0f643a001d2ada0461d38
1 // -*- C++ -*-
2 /* Copyright (C) 2002
3 Free Software Foundation, Inc.
4 Written by Werner Lemberg <wl@gnu.org>
6 This file is part of groff.
8 groff is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 2, or (at your option) any later
11 version.
13 groff is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 for more details.
18 You should have received a copy of the GNU General Public License along
19 with groff; see the file COPYING. If not, write to the Free Software
20 Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
22 #include "lib.h"
23 #include "stringclass.h"
24 #include "ptable.h"
26 #include "unicode.h"
28 struct unicode_to_glyph {
29 char *value;
32 declare_ptable(unicode_to_glyph)
33 implement_ptable(unicode_to_glyph)
35 PTABLE(unicode_to_glyph) unicode_to_glyph_table;
37 struct {
38 const char *key;
39 char *value;
40 } unicode_to_glyph_list[] = {
41 { "0021", "!" },
42 { "0022", "\"" },
43 { "0022", "dq" },
44 { "0023", "#" },
45 { "0023", "sh" },
46 { "0024", "$" },
47 { "0024", "Do" },
48 { "0025", "%" },
49 { "0026", "&" },
50 { "0027", "aq" },
51 { "0028", "(" },
52 { "0029", ")" },
53 { "002A", "*" },
54 { "002B", "+" },
55 { "002B", "pl" },
56 { "002C", "," },
57 { "002E", "." },
58 { "002F", "/" },
59 { "002F", "sl" },
60 { "0030", "0" },
61 { "0031", "1" },
62 { "0032", "2" },
63 { "0033", "3" },
64 { "0034", "4" },
65 { "0035", "5" },
66 { "0036", "6" },
67 { "0037", "7" },
68 { "0038", "8" },
69 { "0039", "9" },
70 { "003A", ":" },
71 { "003B", ";" },
72 { "003C", "<" },
73 { "003D", "=" },
74 { "003D", "eq" },
75 { "003D_0338", "!=" },
76 { "003E", ">" },
77 { "003F", "?" },
78 { "0040", "@" },
79 { "0040", "at" },
80 { "0041", "A" },
81 { "0041_0300", "`A" },
82 { "0041_0301", "'A" },
83 { "0041_0302", "^A" },
84 { "0041_0303", "~A" },
85 { "0041_0308", ":A" },
86 { "0041_030A", "oA" },
87 { "0042", "B" },
88 { "0043", "C" },
89 { "0043_0327", ",C" },
90 { "0044", "D" },
91 { "0045", "E" },
92 { "0045_0300", "`E" },
93 { "0045_0301", "'E" },
94 { "0045_0302", "^E" },
95 { "0045_0308", ":E" },
96 { "0046", "F" },
97 { "0047", "G" },
98 { "0048", "H" },
99 { "0049", "I" },
100 { "0049_0300", "`I" },
101 { "0049_0301", "'I" },
102 { "0049_0302", "^I" },
103 { "0049_0308", ":I" },
104 { "004A", "J" },
105 { "004B", "K" },
106 { "004C", "L" },
107 { "004D", "M" },
108 { "004E", "N" },
109 { "004E_0303", "~N" },
110 { "004F", "O" },
111 { "004F_0300", "`O" },
112 { "004F_0301", "'O" },
113 { "004F_0302", "^O" },
114 { "004F_0303", "~O" },
115 { "004F_0308", ":O" },
116 { "0050", "P" },
117 { "0051", "Q" },
118 { "0052", "R" },
119 { "0053", "S" },
120 { "0053_030C", "vS" },
121 { "0054", "T" },
122 { "0055", "U" },
123 { "0055_0300", "`U" },
124 { "0055_0301", "'U" },
125 { "0055_0302", "^U" },
126 { "0055_0308", ":U" },
127 { "0056", "V" },
128 { "0057", "W" },
129 { "0058", "X" },
130 { "0059", "Y" },
131 { "0059_0301", "'Y" },
132 { "0059_0308", ":Y" },
133 { "005A", "Z" },
134 { "005A_030C", "vZ" },
135 { "005B", "lB" },
136 //{ "005B", "[" },
137 { "005C", "rs" },
138 //{ "005C", "\\" },
139 { "005D", "rB" },
140 //{ "005D", "]" },
141 { "005E", "^" },
142 { "005E", "a^" },
143 { "005E", "ha" },
144 { "005F", "_" },
145 { "005F", "ru" },
146 { "005F", "ul" },
147 { "0060", "ga" },
148 //{ "0060", "\\`" },
149 { "0061", "a" },
150 { "0061_0300", "`a" },
151 { "0061_0301", "'a" },
152 { "0061_0302", "^a" },
153 { "0061_0303", "~a" },
154 { "0061_0308", ":a" },
155 { "0061_030A", "oa" },
156 { "0062", "b" },
157 { "0063", "c" },
158 { "0063_0327", ",c" },
159 { "0064", "d" },
160 { "0065", "e" },
161 { "0065_0300", "`e" },
162 { "0065_0301", "'e" },
163 { "0065_0302", "^e" },
164 { "0065_0308", ":e" },
165 { "0066", "f" },
166 { "0067", "g" },
167 { "0068", "h" },
168 { "0069", "i" },
169 { "0069_0300", "`i" },
170 { "0069_0301", "'i" },
171 { "0069_0302", "^i" },
172 { "0069_0308", ":i" },
173 { "006A", "j" },
174 { "006B", "k" },
175 { "006C", "l" },
176 { "006D", "m" },
177 { "006E", "n" },
178 { "006E_0303", "~n" },
179 { "006F", "o" },
180 { "006F_0300", "`o" },
181 { "006F_0301", "'o" },
182 { "006F_0302", "^o" },
183 { "006F_0303", "~o" },
184 { "006F_0308", ":o" },
185 { "0070", "p" },
186 { "0071", "q" },
187 { "0072", "r" },
188 { "0073", "s" },
189 { "0073_030C", "vs" },
190 { "0074", "t" },
191 { "0075", "u" },
192 { "0075_0300", "`u" },
193 { "0075_0301", "'u" },
194 { "0075_0302", "^u" },
195 { "0075_0308", ":u" },
196 { "0076", "v" },
197 { "0077", "w" },
198 { "0078", "x" },
199 { "0079", "y" },
200 { "0079_0301", "'y" },
201 { "0079_0308", ":y" },
202 { "007A", "z" },
203 { "007A_030C", "vz" },
204 { "007B", "lC" },
205 { "007B", "{" },
206 { "007C", "ba" },
207 { "007C", "or" },
208 { "007C", "|" },
209 { "007D", "rC" },
210 { "007D", "}" },
211 { "007E", "a~" },
212 { "007E", "ti" },
213 { "007E", "~" },
214 { "00A1", "r!" },
215 { "00A2", "ct" },
216 { "00A3", "Po" },
217 { "00A4", "Cs" },
218 { "00A5", "Ye" },
219 { "00A6", "bb" },
220 { "00A7", "sc" },
221 { "00A8", "ad" },
222 { "00A9", "co" },
223 { "00AA", "Of" },
224 { "00AB", "Fo" },
225 { "00AC", "no" },
226 { "00AD", "shc" },
227 { "00AE", "rg" },
228 { "00AF", "a-" },
229 { "00B0", "de" },
230 { "00B1", "+-" },
231 { "00B1", "t+-" },
232 { "00B2", "S2" },
233 { "00B3", "S3" },
234 { "00B4", "aa" },
235 //{ "00B4", "\\'" },
236 { "00B5", "mc" },
237 { "00B6", "ps" },
238 { "00B7", "pc" },
239 { "00B8", "ac" },
240 { "00B9", "S1" },
241 { "00BA", "Om" },
242 { "00BB", "Fc" },
243 { "00BC", "14" },
244 { "00BD", "12" },
245 { "00BE", "34" },
246 { "00BF", "r?" },
247 { "00C6", "AE" },
248 { "00D0", "-D" },
249 { "00D7", "mu" },
250 { "00D7", "tmu" },
251 { "00D8", "/O" },
252 { "00DE", "TP" },
253 { "00DF", "ss" },
254 { "00E6", "ae" },
255 { "00F0", "Sd" },
256 { "00F7", "di" },
257 { "00F7", "tdi" },
258 { "00F8", "/o" },
259 { "00FE", "Tp" },
260 { "0131", ".i" },
261 { "0141", "/L" },
262 { "0142", "/l" },
263 { "0152", "OE" },
264 { "0153", "oe" },
265 { "0192", "Fn" },
266 { "02C7", "ah" },
267 { "02D8", "ab" },
268 { "02D9", "a." },
269 { "02DA", "ao" },
270 { "02DB", "ho" },
271 { "02DD", "a\"" },
272 { "0391", "*A" },
273 { "0392", "*B" },
274 { "0393", "*G" },
275 { "0394", "*D" },
276 { "0395", "*E" },
277 { "0396", "*Z" },
278 { "0397", "*Y" },
279 { "0398", "*H" },
280 { "0399", "*I" },
281 { "039A", "*K" },
282 { "039B", "*L" },
283 { "039C", "*M" },
284 { "039D", "*N" },
285 { "039E", "*C" },
286 { "039F", "*O" },
287 { "03A0", "*P" },
288 { "03A1", "*R" },
289 { "03A3", "*S" },
290 { "03A4", "*T" },
291 { "03A5", "*U" },
292 { "03A6", "*F" },
293 { "03A7", "*X" },
294 { "03A8", "*Q" },
295 { "03A9", "*W" },
296 { "03B1", "*a" },
297 { "03B2", "*b" },
298 { "03B3", "*g" },
299 { "03B4", "*d" },
300 { "03B5", "*e" },
301 { "03B6", "*z" },
302 { "03B7", "*y" },
303 { "03B8", "*h" },
304 { "03B9", "*i" },
305 { "03BA", "*k" },
306 { "03BB", "*l" },
307 { "03BC", "*m" },
308 { "03BD", "*n" },
309 { "03BE", "*c" },
310 { "03BF", "*o" },
311 { "03C0", "*p" },
312 { "03C1", "*r" },
313 { "03C2", "ts" },
314 { "03C3", "*s" },
315 { "03C4", "*t" },
316 { "03C5", "*u" },
317 { "03C6", "*f" },
318 { "03C7", "*x" },
319 { "03C8", "*q" },
320 { "03C9", "*w" },
321 { "03D1", "+h" },
322 { "03D5", "+f" },
323 { "03D6", "+p" },
324 { "2010", "-" },
325 { "2010", "hy" },
326 { "2013", "en" },
327 { "2014", "em" },
328 { "2018", "`" },
329 { "2018", "oq" },
330 { "2019", "'" },
331 { "2019", "cq" },
332 { "201A", "bq" },
333 { "201C", "lq" },
334 { "201D", "rq" },
335 { "201E", "Bq" },
336 { "2020", "dg" },
337 { "2021", "dd" },
338 { "2022", "bu" },
339 { "2030", "%0" },
340 { "2032", "fm" },
341 { "2033", "sd" },
342 { "2039", "fo" },
343 { "203A", "fc" },
344 { "203E", "rn" },
345 { "2044", "f/" },
346 { "20AC", "Eu" },
347 { "20AC", "eu" },
348 { "2111", "Im" },
349 { "2118", "wp" },
350 { "211C", "Re" },
351 { "2122", "tm" },
352 { "2135", "Ah" },
353 { "2190", "<-" },
354 { "2191", "ua" },
355 { "2192", "->" },
356 { "2193", "da" },
357 { "2194", "<>" },
358 { "21D0", "lA" },
359 { "21D1", "uA" },
360 { "21D2", "rA" },
361 { "21D3", "dA" },
362 { "21D4", "hA" },
363 { "2200", "fa" },
364 { "2202", "pd" },
365 { "2203", "te" },
366 { "2205", "es" },
367 { "2207", "gr" },
368 { "2208", "mo" },
369 { "2208_0338", "nm" },
370 { "220B", "st" },
371 { "220F", "product" },
372 { "2211", "sum" },
373 { "2212", "mi" },
374 //{ "2212", "\\-" },
375 { "2217", "**" },
376 { "221A", "sr" },
377 { "221D", "pt" },
378 { "221E", "if" },
379 { "2220", "/_" },
380 { "2227", "AN" },
381 { "2228", "OR" },
382 { "2229", "ca" },
383 { "222A", "cu" },
384 { "222B", "is" },
385 { "2234", "3d" },
386 { "2234", "tf" },
387 { "223C", "ap" },
388 { "223C", "ti" },
389 { "2245", "=~" },
390 { "2248", "~=" },
391 { "2248", "~~" },
392 { "2261", "==" },
393 { "2264", "<=" },
394 { "2265", ">=" },
395 { "226A", ">>" },
396 { "226B", "<<" },
397 { "2282", "sb" },
398 { "2282_0338", "nb" },
399 { "2283", "sp" },
400 { "2286", "ib" },
401 { "2287", "ip" },
402 { "2295", "c+" },
403 { "2297", "c*" },
404 { "22A5", "pp" },
405 { "22C5", "md" },
406 { "2308", "lc" },
407 { "2309", "rc" },
408 { "230A", "lf" },
409 { "230B", "rf" },
410 { "240D", "CR" },
411 { "2500", "an" },
412 { "2502", "br" },
413 { "2502", "bv" },
414 { "251D", "rk" },
415 { "2525", "lk" },
416 { "256D", "lt" },
417 { "256E", "rt" },
418 { "256F", "rb" },
419 { "2570", "lb" },
420 { "25A1", "sq" },
421 { "25CA", "lz" },
422 { "25EF", "ci" },
423 { "261C", "lh" },
424 { "261E", "rh" },
425 { "2660", "SP" },
426 { "2663", "CL" },
427 { "2665", "HE" },
428 { "2666", "DI" },
429 { "3008", "la" },
430 { "3009", "ra" },
431 { "FB00", "ff" },
432 { "FB01", "fi" },
433 { "FB02", "fl" },
434 { "FB03", "Fi" },
435 { "FB04", "Fl" },
438 // global constructor
439 static struct unicode_to_glyph_init {
440 unicode_to_glyph_init();
441 } _unicode_to_glyph_init;
443 unicode_to_glyph_init::unicode_to_glyph_init() {
444 for (unsigned int i = 0;
445 i < sizeof(unicode_to_glyph_list)/sizeof(unicode_to_glyph_list[0]);
446 i++) {
447 unicode_to_glyph *utg = new unicode_to_glyph;
448 utg->value = unicode_to_glyph_list[i].value;
449 unicode_to_glyph_table.define(unicode_to_glyph_list[i].key, utg);
453 const char *unicode_to_glyph_name(const char *s)
455 unicode_to_glyph *result = unicode_to_glyph_table.lookup(s);
456 return result ? result->value : 0;