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