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