4 * Map DVI (ditroff output) character names to
5 * font indexes and back
12 extern char *xmalloc(int);
14 #define allocHash() ((DviCharNameHash *) xmalloc (sizeof (DviCharNameHash)))
17 struct map_list *next;
21 static struct map_list *world;
23 static int standard_maps_loaded = 0;
24 static void load_standard_maps (void);
25 static int hash_name (const char *);
26 static void dispose_hash(DviCharNameMap *);
27 static void compute_hash(DviCharNameMap *);
30 DviFindMap (char *encoding)
34 if (!standard_maps_loaded)
35 load_standard_maps ();
36 for (m = world; m; m=m->next)
37 if (!strcmp (m->map->encoding, encoding))
43 DviRegisterMap (DviCharNameMap *map)
47 if (!standard_maps_loaded)
48 load_standard_maps ();
49 for (m = world; m; m = m->next)
50 if (!strcmp (m->map->encoding, map->encoding))
53 m = (struct map_list *) xmalloc (sizeof *m);
63 dispose_hash (DviCharNameMap *map)
65 DviCharNameHash **buckets;
66 DviCharNameHash *h, *next;
69 buckets = map->buckets;
70 for (i = 0; i < DVI_HASH_SIZE; i++) {
71 for (h = buckets[i]; h; h=next) {
79 hash_name (const char *name)
84 i = (i << 1) ^ *name++;
91 compute_hash (DviCharNameMap *map)
93 DviCharNameHash **buckets;
97 buckets = map->buckets;
98 for (i = 0; i < DVI_HASH_SIZE; i++)
100 for (c = 0; c < DVI_MAP_SIZE; c++)
101 for (s = 0; s < DVI_MAX_SYNONYMS; s++) {
102 if (!map->dvi_names[c][s])
104 i = hash_name (map->dvi_names[c][s]) % DVI_HASH_SIZE;
106 h->next = buckets[i];
108 h->name = map->dvi_names[c][s];
115 DviCharIndex (DviCharNameMap *map, const char *name)
120 i = hash_name (name) % DVI_HASH_SIZE;
121 for (h = map->buckets[i]; h; h=h->next)
122 if (!strcmp (h->name, name))
127 static DviCharNameMap ISO8859_1_map = {
165 { "\"", "dq", /* 34 */},
166 { "#", "sh", /* 35 */},
167 { "$", "Do", /* 36 */},
170 { "'", "cq", /* 39 */},
178 { "/", "sl", /* 47 */},
195 { "@", "at", /* 64 */},
222 { "[", "lB", /* 91 */},
223 { "\\", "rs", /* 92 */},
224 { "]", "rB", /* 93 */},
225 { "^", "a^", "ha", /* 94 */},
227 { "`", "oq", /* 96 */},
254 { "{", "lC", /* 123 */},
255 { "|", "ba", /* 124 */},
256 { "}", "rC", /* 125 */},
257 { "~", "a~", "ti", /* 126 */},
304 { "-", "hy", /* 173 */},
389 static DviCharNameMap Adobe_Symbol_map = {
390 "adobe-fontspecific",
428 { "#", "sh", /* 35 */},
436 { "+", "pl", /* 43 */},
438 { "\\-", "mi", /* 45 */},
440 { "/", "sl", /* 47 */},
454 { "=", "eq", /* 61 */},
484 { "[", "lB", /* 91 */},
485 { "tf", "3d", /* 92 */},
486 { "]", "rB", /* 93 */},
489 { "radicalex", /* 96 */},
516 { "lC", "{", /* 123 */},
517 { "ba", "|", /* 124 */},
518 { "rC", "}", /* 125 */},
566 { "ua", "arrowverttp", /* 173 */},
568 { "da", "arrowvertbt", /* 175 */},
580 { "~=", "~~", /* 187 */},
582 { "arrowvertex", /* 189 */},
607 { "sr", "sqrt", /* 214 */},
623 { "parenlefttp", /* 230 */},
624 { "parenleftex", /* 231 */},
625 { "parenleftbt", /* 232 */},
626 { "bracketlefttp", "lc", /* 233 */},
627 { "bracketleftex", /* 234 */},
628 { "bracketleftbt", "lf", /* 235 */},
629 { "bracelefttp", "lt", /* 236 */},
630 { "braceleftmid", "lk", /* 237 */},
631 { "braceleftbt", "lb", /* 238 */},
632 { "bracerightex", "braceleftex", "braceex", "bv", /* 239 */},
635 { "is", "integral", /* 242 */},
639 { "parenrighttp", /* 246 */},
640 { "parenrightex", /* 247 */},
641 { "parenrightbt", /* 248 */},
642 { "bracketrighttp", "rc", /* 249 */},
643 { "bracketrightex", /* 250 */},
644 { "bracketrightbt", "rf", /* 251 */},
645 { "bracerighttp", "rt", /* 252 */},
646 { "bracerightmid", "rk", /* 253 */},
647 { "bracerightbt", "rb", /* 254 */},
653 load_standard_maps (void)
655 standard_maps_loaded = 1;
656 DviRegisterMap (&ISO8859_1_map);
657 DviRegisterMap (&Adobe_Symbol_map);