1 /*
2 * DviChar.c
3 *
4 * Map DVI (ditroff output) character names to
5 * font indexes and back
6 */
7
8 #include "DviChar.h"
9
10 extern char *xmalloc();
11
12 #define allocHash() ((DviCharNameHash *) xmalloc (sizeof (DviCharNameHash)))
13
14 struct map_list {
15 struct map_list *next;
16 DviCharNameMap *map;
17 };
18
19 static struct map_list *world;
20
21 static int standard_maps_loaded = 0;
22 static void load_standard_maps ();
23 static int hash_name ();
24 static dispose_hash(), compute_hash();
25
26 DviCharNameMap *
DviFindMap(encoding)27 DviFindMap (encoding)
28 char *encoding;
29 {
30 struct map_list *m;
31
32 if (!standard_maps_loaded)
33 load_standard_maps ();
34 for (m = world; m; m=m->next)
35 if (!strcmp (m->map->encoding, encoding))
36 return m->map;
37 return 0;
38 }
39
40 void
DviRegisterMap(map)41 DviRegisterMap (map)
42 DviCharNameMap *map;
43 {
44 struct map_list *m;
45
46 if (!standard_maps_loaded)
47 load_standard_maps ();
48 for (m = world; m; m = m->next)
49 if (!strcmp (m->map->encoding, map->encoding))
50 break;
51 if (!m) {
52 m = (struct map_list *) xmalloc (sizeof *m);
53 m->next = world;
54 world = m;
55 }
56 dispose_hash (map);
57 m->map = map;
58 compute_hash (map);
59 }
60
61 static
dispose_hash(map)62 dispose_hash (map)
63 DviCharNameMap *map;
64 {
65 DviCharNameHash **buckets;
66 DviCharNameHash *h, *next;
67 int i;
68
69 buckets = map->buckets;
70 for (i = 0; i < DVI_HASH_SIZE; i++) {
71 for (h = buckets[i]; h; h=next) {
72 next = h->next;
73 free (h);
74 }
75 }
76 }
77
78 static int
hash_name(name)79 hash_name (name)
80 char *name;
81 {
82 int i = 0;
83
84 while (*name)
85 i = (i << 1) ^ *name++;
86 if (i < 0)
87 i = -i;
88 return i;
89 }
90
91 static
compute_hash(map)92 compute_hash (map)
93 DviCharNameMap *map;
94 {
95 DviCharNameHash **buckets;
96 int c, s, i;
97 DviCharNameHash *h;
98
99 buckets = map->buckets;
100 for (i = 0; i < DVI_HASH_SIZE; i++)
101 buckets[i] = 0;
102 for (c = 0; c < DVI_MAP_SIZE; c++)
103 for (s = 0; s < DVI_MAX_SYNONYMS; s++) {
104 if (!map->dvi_names[c][s])
105 break;
106 i = hash_name (map->dvi_names[c][s]) % DVI_HASH_SIZE;
107 h = allocHash ();
108 h->next = buckets[i];
109 buckets[i] = h;
110 h->name = map->dvi_names[c][s];
111 h->position = c;
112 }
113
114 }
115
116 int
DviCharIndex(map,name)117 DviCharIndex (map, name)
118 DviCharNameMap *map;
119 char *name;
120 {
121 int i;
122 DviCharNameHash *h;
123
124 i = hash_name (name) % DVI_HASH_SIZE;
125 for (h = map->buckets[i]; h; h=h->next)
126 if (!strcmp (h->name, name))
127 return h->position;
128 return -1;
129 }
130
131 static DviCharNameMap ISO8859_1_map = {
132 "iso8859-1",
133 0,
134 {
135 { 0, /* 0 */},
136 { 0, /* 1 */},
137 { 0, /* 2 */},
138 { 0, /* 3 */},
139 { 0, /* 4 */},
140 { 0, /* 5 */},
141 { 0, /* 6 */},
142 { 0, /* 7 */},
143 { 0, /* 8 */},
144 { 0, /* 9 */},
145 { 0, /* 10 */},
146 { 0, /* 11 */},
147 { 0, /* 12 */},
148 { 0, /* 13 */},
149 { 0, /* 14 */},
150 { 0, /* 15 */},
151 { 0, /* 16 */},
152 { 0, /* 17 */},
153 { 0, /* 18 */},
154 { 0, /* 19 */},
155 { 0, /* 20 */},
156 { 0, /* 21 */},
157 { 0, /* 22 */},
158 { 0, /* 23 */},
159 { 0, /* 24 */},
160 { 0, /* 25 */},
161 { 0, /* 26 */},
162 { 0, /* 27 */},
163 { 0, /* 28 */},
164 { 0, /* 29 */},
165 { 0, /* 30 */},
166 { 0, /* 31 */},
167 { 0, /* 32 */},
168 { "!", /* 33 */},
169 { "\"", /* 34 */},
170 { "#","sh", /* 35 */},
171 { "$","Do", /* 36 */},
172 { "%", /* 37 */},
173 { "&", /* 38 */},
174 { "'", /* 39 */},
175 { "(", /* 40 */},
176 { ")", /* 41 */},
177 { "*", /* 42 */},
178 { "+", /* 43 */},
179 { ",", /* 44 */},
180 { "\\-", /* 45 */},
181 { ".", /* 46 */},
182 { "/","sl", /* 47 */},
183 { "0", /* 48 */},
184 { "1", /* 49 */},
185 { "2", /* 50 */},
186 { "3", /* 51 */},
187 { "4", /* 52 */},
188 { "5", /* 53 */},
189 { "6", /* 54 */},
190 { "7", /* 55 */},
191 { "8", /* 56 */},
192 { "9", /* 57 */},
193 { ":", /* 58 */},
194 { ";", /* 59 */},
195 { "<", /* 60 */},
196 { "=","eq", /* 61 */},
197 { ">", /* 62 */},
198 { "?", /* 63 */},
199 { "@","at", /* 64 */},
200 { "A", /* 65 */},
201 { "B", /* 66 */},
202 { "C", /* 67 */},
203 { "D", /* 68 */},
204 { "E", /* 69 */},
205 { "F", /* 70 */},
206 { "G", /* 71 */},
207 { "H", /* 72 */},
208 { "I", /* 73 */},
209 { "J", /* 74 */},
210 { "K", /* 75 */},
211 { "L", /* 76 */},
212 { "M", /* 77 */},
213 { "N", /* 78 */},
214 { "O", /* 79 */},
215 { "P", /* 80 */},
216 { "Q", /* 81 */},
217 { "R", /* 82 */},
218 { "S", /* 83 */},
219 { "T", /* 84 */},
220 { "U", /* 85 */},
221 { "V", /* 86 */},
222 { "W", /* 87 */},
223 { "X", /* 88 */},
224 { "Y", /* 89 */},
225 { "Z", /* 90 */},
226 { "[","lB", /* 91 */},
227 { "\\","rs", /* 92 */},
228 { "]","rB", /* 93 */},
229 { "^","a^","ha" /* 94 */},
230 { "_", /* 95 */},
231 { "`","oq", /* 96 */},
232 { "a", /* 97 */},
233 { "b", /* 98 */},
234 { "c", /* 99 */},
235 { "d", /* 100 */},
236 { "e", /* 101 */},
237 { "f", /* 102 */},
238 { "g", /* 103 */},
239 { "h", /* 104 */},
240 { "i", /* 105 */},
241 { "j", /* 106 */},
242 { "k", /* 107 */},
243 { "l", /* 108 */},
244 { "m", /* 109 */},
245 { "n", /* 110 */},
246 { "o", /* 111 */},
247 { "p", /* 112 */},
248 { "q", /* 113 */},
249 { "r", /* 114 */},
250 { "s", /* 115 */},
251 { "t", /* 116 */},
252 { "u", /* 117 */},
253 { "v", /* 118 */},
254 { "w", /* 119 */},
255 { "x", /* 120 */},
256 { "y", /* 121 */},
257 { "z", /* 122 */},
258 { "{","lC", /* 123 */},
259 { "|","or","ba" /* 124 */},
260 { "}","rC", /* 125 */},
261 { "~","a~","ap","ti" /* 126 */},
262 { 0, /* 127 */},
263 { 0, /* 128 */},
264 { 0, /* 129 */},
265 { 0, /* 130 */},
266 { 0, /* 131 */},
267 { 0, /* 132 */},
268 { 0, /* 133 */},
269 { 0, /* 134 */},
270 { 0, /* 135 */},
271 { 0, /* 136 */},
272 { 0, /* 137 */},
273 { 0, /* 138 */},
274 { 0, /* 139 */},
275 { 0, /* 140 */},
276 { 0, /* 141 */},
277 { 0, /* 142 */},
278 { 0, /* 143 */},
279 { 0, /* 144 */},
280 { 0, /* 145 */},
281 { 0, /* 146 */},
282 { 0, /* 147 */},
283 { 0, /* 148 */},
284 { 0, /* 149 */},
285 { 0, /* 150 */},
286 { 0, /* 151 */},
287 { 0, /* 152 */},
288 { 0, /* 153 */},
289 { 0, /* 154 */},
290 { 0, /* 155 */},
291 { 0, /* 156 */},
292 { 0, /* 157 */},
293 { 0, /* 158 */},
294 { 0, /* 159 */},
295 { 0, /* 160 */},
296 { "r!", "\241", /* 161 */},
297 { "ct", "\242", /* 162 */},
298 { "Po", "\243", /* 163 */},
299 { "Cs", "\244", /* 164 */},
300 { "Ye", "\245", /* 165 */},
301 { "bb", "\246", /* 166 */},
302 { "sc", "\247", /* 167 */},
303 { "ad", "\250", /* 168 */},
304 { "co", "\251", /* 169 */},
305 { "Of", "\252", /* 170 */},
306 { "Fo", "\253", /* 171 */},
307 { "no", "\254", /* 172 */},
308 { "-", "hy", "\255" /* 173 */},
309 { "rg", "\256", /* 174 */},
310 { "a-", "\257", /* 175 */},
311 { "de", "\260", /* 176 */},
312 { "+-", "\261", /* 177 */},
313 { "S2", "\262", /* 178 */},
314 { "S3", "\263", /* 179 */},
315 { "aa", "\264", /* 180 */},
316 /* Omit *m here; we want *m to match the other greek letters in the
317 symbol font. */
318 { "\265", /* 181 */},
319 { "ps", "\266", /* 182 */},
320 { "md", "\267", /* 183 */},
321 { "ac", "\270", /* 184 */},
322 { "S1", "\271", /* 185 */},
323 { "Om", "\272", /* 186 */},
324 { "Fc", "\273", /* 187 */},
325 { "14", "\274", /* 188 */},
326 { "12", "\275", /* 189 */},
327 { "34", "\276", /* 190 */},
328 { "r?", "\277", /* 191 */},
329 { "`A", "\300", /* 192 */},
330 { "'A", "\301", /* 193 */},
331 { "^A", "\302", /* 194 */},
332 { "~A", "\303", /* 195 */},
333 { ":A", "\304", /* 196 */},
334 { "oA", "\305", /* 197 */},
335 { "AE", "\306", /* 198 */},
336 { ",C", "\307", /* 199 */},
337 { "`E", "\310", /* 200 */},
338 { "'E", "\311", /* 201 */},
339 { "^E", "\312", /* 202 */},
340 { ":E", "\313", /* 203 */},
341 { "`I", "\314", /* 204 */},
342 { "'I", "\315", /* 205 */},
343 { "^I", "\316", /* 206 */},
344 { ":I", "\317", /* 207 */},
345 { "-D", "\320", /* 208 */},
346 { "~N", "\321", /* 209 */},
347 { "`O", "\322", /* 210 */},
348 { "'O", "\323", /* 211 */},
349 { "^O", "\324", /* 212 */},
350 { "~O", "\325", /* 213 */},
351 { ":O", "\326", /* 214 */},
352 { "mu", "\327", /* 215 */},
353 { "/O", "\330", /* 216 */},
354 { "`U", "\331", /* 217 */},
355 { "'U", "\332", /* 218 */},
356 { "^U", "\333", /* 219 */},
357 { ":U", "\334", /* 220 */},
358 { "'Y", "\335", /* 221 */},
359 { "TP", "\336", /* 222 */},
360 { "ss", "\337", /* 223 */},
361 { "`a", "\340", /* 224 */},
362 { "'a", "\341", /* 225 */},
363 { "^a", "\342", /* 226 */},
364 { "~a", "\343", /* 227 */},
365 { ":a", "\344", /* 228 */},
366 { "oa", "\345", /* 229 */},
367 { "ae", "\346", /* 230 */},
368 { ",c", "\347", /* 231 */},
369 { "`e", "\350", /* 232 */},
370 { "'e", "\351", /* 233 */},
371 { "^e", "\352", /* 234 */},
372 { ":e", "\353", /* 235 */},
373 { "`i", "\354", /* 236 */},
374 { "'i", "\355", /* 237 */},
375 { "^i", "\356", /* 238 */},
376 { ":i", "\357", /* 239 */},
377 { "Sd", "\360", /* 240 */},
378 { "~n", "\361", /* 241 */},
379 { "`o", "\362", /* 242 */},
380 { "'o", "\363", /* 243 */},
381 { "^o", "\364", /* 244 */},
382 { "~o", "\365", /* 245 */},
383 { ":o", "\366", /* 246 */},
384 { "di", "\367", /* 247 */},
385 { "/o", "\370", /* 248 */},
386 { "`u", "\371", /* 249 */},
387 { "'u", "\372", /* 250 */},
388 { "^u", "\373", /* 251 */},
389 { ":u", "\374", /* 252 */},
390 { "'y", "\375", /* 253 */},
391 { "Tp", "\376", /* 254 */},
392 { ":y", "\377", /* 255 */},
393 }};
394
395 static DviCharNameMap Adobe_Symbol_map = {
396 "adobe-fontspecific",
397 1,
398 {
399 { 0, /* 0 */},
400 { 0, /* 1 */},
401 { 0, /* 2 */},
402 { 0, /* 3 */},
403 { 0, /* 4 */},
404 { 0, /* 5 */},
405 { 0, /* 6 */},
406 { 0, /* 7 */},
407 { 0, /* 8 */},
408 { 0, /* 9 */},
409 { 0, /* 10 */},
410 { 0, /* 11 */},
411 { 0, /* 12 */},
412 { 0, /* 13 */},
413 { 0, /* 14 */},
414 { 0, /* 15 */},
415 { 0, /* 16 */},
416 { 0, /* 17 */},
417 { 0, /* 18 */},
418 { 0, /* 19 */},
419 { 0, /* 20 */},
420 { 0, /* 21 */},
421 { 0, /* 22 */},
422 { 0, /* 23 */},
423 { 0, /* 24 */},
424 { 0, /* 25 */},
425 { 0, /* 26 */},
426 { 0, /* 27 */},
427 { 0, /* 28 */},
428 { 0, /* 29 */},
429 { 0, /* 30 */},
430 { 0, /* 31 */},
431 { 0, /* 32 */},
432 { "!", /* 33 */},
433 { "fa", /* 34 */},
434 { "#", "sh", /* 35 */},
435 { "te", /* 36 */},
436 { "%", /* 37 */},
437 { "&", /* 38 */},
438 { "st", /* 39 */},
439 { "(", /* 40 */},
440 { ")", /* 41 */},
441 { "**", /* 42 */},
442 { "+", "pl", /* 43 */},
443 { ",", /* 44 */},
444 { "\\-", "mi", /* 45 */},
445 { ".", /* 46 */},
446 { "/", "sl", /* 47 */},
447 { "0", /* 48 */},
448 { "1", /* 49 */},
449 { "2", /* 50 */},
450 { "3", /* 51 */},
451 { "4", /* 52 */},
452 { "5", /* 53 */},
453 { "6", /* 54 */},
454 { "7", /* 55 */},
455 { "8", /* 56 */},
456 { "9", /* 57 */},
457 { ":", /* 58 */},
458 { ";", /* 59 */},
459 { "<", /* 60 */},
460 { "=", "eq", /* 61 */},
461 { ">", /* 62 */},
462 { "?", /* 63 */},
463 { "=~", /* 64 */},
464 { "*A", /* 65 */},
465 { "*B", /* 66 */},
466 { "*X", /* 67 */},
467 { "*D", /* 68 */},
468 { "*E", /* 69 */},
469 { "*F", /* 70 */},
470 { "*G", /* 71 */},
471 { "*Y", /* 72 */},
472 { "*I", /* 73 */},
473 { "+h", /* 74 */},
474 { "*K", /* 75 */},
475 { "*L", /* 76 */},
476 { "*M", /* 77 */},
477 { "*N", /* 78 */},
478 { "*O", /* 79 */},
479 { "*P", /* 80 */},
480 { "*H", /* 81 */},
481 { "*R", /* 82 */},
482 { "*S", /* 83 */},
483 { "*T", /* 84 */},
484 { 0, /* 85 */},
485 { "ts", /* 86 */},
486 { "*W", /* 87 */},
487 { "*C", /* 88 */},
488 { "*Q", /* 89 */},
489 { "*Z", /* 90 */},
490 { "[", "lB", /* 91 */},
491 { "tf", "3d", /* 92 */},
492 { "]", "rB", /* 93 */},
493 { "pp", /* 94 */},
494 { "_", /* 95 */},
495 { "rn", /* 96 */},
496 { "*a", /* 97 */},
497 { "*b", /* 98 */},
498 { "*x", /* 99 */},
499 { "*d", /* 100 */},
500 { "*e", /* 101 */},
501 { "*f", /* 102 */},
502 { "*g", /* 103 */},
503 { "*y", /* 104 */},
504 { "*i", /* 105 */},
505 { "+f", /* 106 */},
506 { "*k", /* 107 */},
507 { "*l", /* 108 */},
508 { "*m", "\265", /* 109 */},
509 { "*n", /* 110 */},
510 { "*o", /* 111 */},
511 { "*p", /* 112 */},
512 { "*h", /* 113 */},
513 { "*r", /* 114 */},
514 { "*s", /* 115 */},
515 { "*t", /* 116 */},
516 { "*u", /* 117 */},
517 { "+p", /* 118 */},
518 { "*w", /* 119 */},
519 { "*c", /* 120 */},
520 { "*q", /* 121 */},
521 { "*z", /* 122 */},
522 { "lC", "{", /* 123 */},
523 { "ba", "or", "|", /* 124 */},
524 { "rC", "}", /* 125 */},
525 { "ap", /* 126 */},
526 { 0, /* 127 */},
527 { 0, /* 128 */},
528 { 0, /* 129 */},
529 { 0, /* 130 */},
530 { 0, /* 131 */},
531 { 0, /* 132 */},
532 { 0, /* 133 */},
533 { 0, /* 134 */},
534 { 0, /* 135 */},
535 { 0, /* 136 */},
536 { 0, /* 137 */},
537 { 0, /* 138 */},
538 { 0, /* 139 */},
539 { 0, /* 140 */},
540 { 0, /* 141 */},
541 { 0, /* 142 */},
542 { 0, /* 143 */},
543 { 0, /* 144 */},
544 { 0, /* 145 */},
545 { 0, /* 146 */},
546 { 0, /* 147 */},
547 { 0, /* 148 */},
548 { 0, /* 149 */},
549 { 0, /* 150 */},
550 { 0, /* 151 */},
551 { 0, /* 152 */},
552 { 0, /* 153 */},
553 { 0, /* 154 */},
554 { 0, /* 155 */},
555 { 0, /* 156 */},
556 { 0, /* 157 */},
557 { 0, /* 158 */},
558 { 0, /* 159 */},
559 { 0, /* 160 */},
560 { "*U", /* 161 */},
561 { "fm", /* 162 */},
562 { "<=", /* 163 */},
563 { "f/", /* 164 */},
564 { "if", /* 165 */},
565 { "Fn", /* 166 */},
566 { "CL", /* 167 */},
567 { "DI", /* 168 */},
568 { "HE", /* 169 */},
569 { "SP", /* 170 */},
570 { "<>", /* 171 */},
571 { "<-", /* 172 */},
572 { "ua", "arrowverttp" /* 173 */},
573 { "->", /* 174 */},
574 { "da", "arrowvertbt" /* 175 */},
575 { "de", "\260", /* 176 */},
576 { "+-", "\261", /* 177 */},
577 { "sd", /* 178 */},
578 { ">=", /* 179 */},
579 { "mu", "\327", /* 180 */},
580 { "pt", /* 181 */},
581 { "pd", /* 182 */},
582 { "bu", /* 183 */},
583 { "di", "\367", /* 184 */},
584 { "!=", /* 185 */},
585 { "==", /* 186 */},
586 { "~=", "~~", /* 187 */},
587 { 0, /* 188 */},
588 { "arrowvertex", /* 189 */},
589 { "an", /* 190 */},
590 { "CR", /* 191 */},
591 { "Ah", /* 192 */},
592 { "Im", /* 193 */},
593 { "Re", /* 194 */},
594 { "wp", /* 195 */},
595 { "c*", /* 196 */},
596 { "c+", /* 197 */},
597 { "es", /* 198 */},
598 { "ca", /* 199 */},
599 { "cu", /* 200 */},
600 { "sp", /* 201 */},
601 { "ip", /* 202 */},
602 { 0, /* 203 */},
603 { "sb", /* 204 */},
604 { "ib", /* 205 */},
605 { "mo", /* 206 */},
606 { "nm", /* 207 */},
607 { "/_", /* 208 */},
608 { "gr", /* 209 */},
609 { "rg", /* 210 */},
610 { "co", /* 211 */},
611 { "tm", /* 212 */},
612 { 0, /* 213 */},
613 { "sr", /* 214 */},
614 { "md", /* 215 */},
615 { "no", "\254", /* 216 */},
616 { "AN", /* 217 */},
617 { "OR", /* 218 */},
618 { "hA", /* 219 */},
619 { "lA", /* 220 */},
620 { "uA", /* 221 */},
621 { "rA", /* 222 */},
622 { "dA", /* 223 */},
623 { "lz", /* 224 */},
624 { "la", /* 225 */},
625 { 0, /* 226 */},
626 { 0, /* 227 */},
627 { 0, /* 228 */},
628 { 0, /* 229 */},
629 { "parenlefttp", /* 230 */},
630 { "parenleftex", /* 231 */},
631 { "parenleftbt", /* 232 */},
632 { "bracketlefttp", "lc", /* 233 */},
633 { "bracketleftex", /* 234 */},
634 { "bracketleftbt", "lf", /* 235 */},
635 { "bracelefttp", "lt", /* 236 */},
636 { "braceleftmid", "lk", /* 237 */},
637 { "braceleftbt", "lb", /* 238 */},
638 { "bracerightex", "braceleftex", "bv", /* 239 */},
639 { 0, /* 240 */},
640 { "ra", /* 241 */},
641 { "is", /* 242 */},
642 { 0, /* 243 */},
643 { 0, /* 244 */},
644 { 0, /* 245 */},
645 { "parenrighttp", /* 246 */},
646 { "parenrightex", /* 247 */},
647 { "parenrightbt", /* 248 */},
648 { "bracketrighttp", "rc", /* 249 */},
649 { "bracketrightex", /* 250 */},
650 { "bracketrightbt", "rf", /* 251 */},
651 { "bracerighttp", "rt" /* 252 */},
652 { "bracerightmid", "rk" /* 253 */},
653 { "bracerightbt", "rb" /* 254 */},
654 { 0, /* 255 */},
655 }};
656
657
658 static void
load_standard_maps()659 load_standard_maps ()
660 {
661 standard_maps_loaded = 1;
662 DviRegisterMap (&ISO8859_1_map);
663 DviRegisterMap (&Adobe_Symbol_map);
664 }
665