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