DviChar.c revision 65912f00
1/* $XConsortium: DviChar.c,v 1.7 91/07/31 00:39:31 keith Exp $ */
2
3/*
4 * DviChar.c
5 *
6 * Map DVI (ditrof output) character names to
7 * font indexes and back
8 */
9/* $XFree86$ */
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 (char *name);
26static void	dispose_hash(DviCharNameMap *map);
27static void	compute_hash(DviCharNameMap *map);
28
29DviCharNameMap *
30DviFindMap (char *encoding)
31{
32	struct map_list	*m;
33
34	if (!standard_maps_loaded)
35		load_standard_maps ();
36	for (m = world; m; m=m->next)
37		if (!strcmp (m->map->encoding, encoding))
38			return m->map;
39	return NULL;
40}
41
42void
43DviRegisterMap (DviCharNameMap *map)
44{
45	struct map_list	*m;
46
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))
51			break;
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;
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			XtFree ((char *) h);
74		}
75	}
76}
77
78static int
79hash_name (char *name)
80{
81	int	i = 0;
82
83	while (*name)
84		i = (i << 1) ^ *name++;
85	if (i < 0)
86		i = -i;
87	return i;
88}
89
90static void
91compute_hash (DviCharNameMap *map)
92{
93	DviCharNameHash	**buckets;
94	int		c, s, i;
95	DviCharNameHash	*h;
96
97	buckets = map->buckets;
98	for (i = 0; i < DVI_HASH_SIZE; i++)
99		buckets[i] = NULL;
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])
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, char *name)
116{
117	int		i;
118	DviCharNameHash	*h;
119
120	i = hash_name (name) % DVI_HASH_SIZE;
121	for (h = map->buckets[i]; h; h=h->next)
122		if (!strcmp (h->name, name))
123			return h->position;
124	return -1;
125}
126
127static DviCharNameMap ISO8859_1_map = {
128	"iso8859-1",
129	0,
130{
131{	NULL,		/* 0 */},
132{	NULL,		/* 1 */},
133{	NULL,		/* 2 */},
134{	NULL,		/* 3 */},
135{	NULL,		/* 4 */},
136{	NULL,		/* 5 */},
137{	NULL,		/* 6 */},
138{	NULL,		/* 7 */},
139{	NULL,		/* 8 */},
140{	NULL,		/* 9 */},
141{	NULL,		/* 10 */},
142{	NULL,		/* 11 */},
143{	NULL,		/* 12 */},
144{	NULL,		/* 13 */},
145{	NULL,		/* 14 */},
146{	NULL,		/* 15 */},
147{	NULL,		/* 16 */},
148{	NULL,		/* 17 */},
149{	NULL,		/* 18 */},
150{	NULL,		/* 19 */},
151{	NULL,		/* 20 */},
152{	NULL,		/* 21 */},
153{	NULL,		/* 22 */},
154{	NULL,		/* 23 */},
155{	NULL,		/* 24 */},
156{	NULL,		/* 25 */},
157{	NULL,		/* 26 */},
158{	NULL,		/* 27 */},
159{	NULL,		/* 28 */},
160{	NULL,		/* 29 */},
161{	NULL,		/* 30 */},
162{	NULL,		/* 31 */},
163{	NULL,		/* 32 */},
164{	"!",		/* 33 */},
165{	"\"",		/* 34 */},
166{	"#",		/* 35 */},
167{	"$",		/* 36 */},
168{	"%",		/* 37 */},
169{	"&",		/* 38 */},
170{	"'",		/* 39 */},
171{	"(",		/* 40 */},
172{	")",		/* 41 */},
173{	"*",		/* 42 */},
174{	"+",		/* 43 */},
175{	",",		/* 44 */},
176{	"-","\\-",	/* 45 */},
177{	".",		/* 46 */},
178{	"/","sl",	/* 47 */},
179{	"0",		/* 48 */},
180{	"1",		/* 49 */},
181{	"2",		/* 50 */},
182{	"3",		/* 51 */},
183{	"4",		/* 52 */},
184{	"5",		/* 53 */},
185{	"6",		/* 54 */},
186{	"7",		/* 55 */},
187{	"8",		/* 56 */},
188{	"9",		/* 57 */},
189{	":",		/* 58 */},
190{	";",		/* 59 */},
191{	"<",		/* 60 */},
192{	"=","eq",	/* 61 */},
193{	">",		/* 62 */},
194{	"?",		/* 63 */},
195{	"@",		/* 64 */},
196{	"A",		/* 65 */},
197{	"B",		/* 66 */},
198{	"C",		/* 67 */},
199{	"D",		/* 68 */},
200{	"E",		/* 69 */},
201{	"F",		/* 70 */},
202{	"G",		/* 71 */},
203{	"H",		/* 72 */},
204{	"I",		/* 73 */},
205{	"J",		/* 74 */},
206{	"K",		/* 75 */},
207{	"L",		/* 76 */},
208{	"M",		/* 77 */},
209{	"N",		/* 78 */},
210{	"O",		/* 79 */},
211{	"P",		/* 80 */},
212{	"Q",		/* 81 */},
213{	"R",		/* 82 */},
214{	"S",		/* 83 */},
215{	"T",		/* 84 */},
216{	"U",		/* 85 */},
217{	"V",		/* 86 */},
218{	"W",		/* 87 */},
219{	"X",		/* 88 */},
220{	"Y",		/* 89 */},
221{	"Z",		/* 90 */},
222{	"[",		/* 91 */},
223{	"\\",		/* 92 */},
224{	"]",		/* 93 */},
225{	"a^",		/* 94 */},
226{	"_","ru","ul",	/* 95 */},
227{	"`",		/* 96 */},
228{	"a",		/* 97 */},
229{	"b",		/* 98 */},
230{	"c",		/* 99 */},
231{	"d",		/* 100 */},
232{	"e",		/* 101 */},
233{	"f",		/* 102 */},
234{	"g",		/* 103 */},
235{	"h",		/* 104 */},
236{	"i",		/* 105 */},
237{	"j",		/* 106 */},
238{	"k",		/* 107 */},
239{	"l",		/* 108 */},
240{	"m",		/* 109 */},
241{	"n",		/* 110 */},
242{	"o",		/* 111 */},
243{	"p",		/* 112 */},
244{	"q",		/* 113 */},
245{	"r",		/* 114 */},
246{	"s",		/* 115 */},
247{	"t",		/* 116 */},
248{	"u",		/* 117 */},
249{	"v",		/* 118 */},
250{	"w",		/* 119 */},
251{	"x",		/* 120 */},
252{	"y",		/* 121 */},
253{	"z",		/* 122 */},
254{	"{",		/* 123 */},
255{	"|","or"	/* 124 */},
256{	"}",		/* 125 */},
257{	"a~","ap"	/* 126 */},
258{	NULL,		/* 127 */},
259{	NULL,		/* 128 */},
260{	NULL,		/* 129 */},
261{	NULL,		/* 130 */},
262{	NULL,		/* 131 */},
263{	NULL,		/* 132 */},
264{	NULL,		/* 133 */},
265{	NULL,		/* 134 */},
266{	NULL,		/* 135 */},
267{	NULL,		/* 136 */},
268{	NULL,		/* 137 */},
269{	NULL,		/* 138 */},
270{	NULL,		/* 139 */},
271{	NULL,		/* 140 */},
272{	NULL,		/* 141 */},
273{	NULL,		/* 142 */},
274{	NULL,		/* 143 */},
275{	NULL,		/* 144 */},
276{	NULL,		/* 145 */},
277{	NULL,		/* 146 */},
278{	NULL,		/* 147 */},
279{	NULL,		/* 148 */},
280{	NULL,		/* 149 */},
281{	NULL,		/* 150 */},
282{	NULL,		/* 151 */},
283{	NULL,		/* 152 */},
284{	NULL,		/* 153 */},
285{	NULL,		/* 154 */},
286{	NULL,		/* 155 */},
287{	NULL,		/* 156 */},
288{	NULL,		/* 157 */},
289{	NULL,		/* 158 */},
290{	NULL,		/* 159 */},
291{	NULL,		/* 160 */},
292{	"I!",		/* 161 */},
293{	"ct",		/* 162 */},
294{	"po",		/* 163 */},
295{	"cu",		/* 164 */},
296{	"$J",		/* 165 */},
297{	NULL,		/* 166 */},
298{	"sc",		/* 167 */},
299{	NULL,		/* 168 */},
300{	"co",		/* 169 */},
301{	NULL,		/* 170 */},
302{	"d<",		/* 171 */},
303{	"no",		/* 172 */},
304{	"hy",		/* 173 */},
305{	"rg",		/* 174 */},
306{	"ma",		/* 175 */},
307{	"de",		/* 176 */},
308{	"+-",		/* 177 */},
309{	NULL,		/* 178 */},
310{	NULL,		/* 179 */},
311{	"aa",		/* 180 */},
312{	"*m",		/* 181 */},
313{	"pp",		/* 182 */},
314{	NULL,		/* 183 */},
315{	"cd",		/* 184 */},
316{	NULL,		/* 185 */},
317{	NULL,		/* 186 */},
318{	"d>",		/* 187 */},
319{	"14",		/* 188 */},
320{	"12",		/* 189 */},
321{	"34",		/* 190 */},
322{	"I?",		/* 191 */},
323{	NULL,		/* 192 */},
324{	NULL,		/* 193 */},
325{	NULL,		/* 194 */},
326{	NULL,		/* 195 */},
327{	NULL,		/* 196 */},
328{	NULL,		/* 197 */},
329{	"AE",		/* 198 */},
330{	NULL,		/* 199 */},
331{	NULL,		/* 200 */},
332{	NULL,		/* 201 */},
333{	NULL,		/* 202 */},
334{	NULL,		/* 203 */},
335{	NULL,		/* 204 */},
336{	NULL,		/* 205 */},
337{	NULL,		/* 206 */},
338{	NULL,		/* 207 */},
339{	NULL,		/* 208 */},
340{	NULL,		/* 209 */},
341{	NULL,		/* 210 */},
342{	NULL,		/* 211 */},
343{	NULL,		/* 212 */},
344{	NULL,		/* 213 */},
345{	NULL,		/* 214 */},
346{	"mu",		/* 215 */},
347{	"O/",		/* 216 */},
348{	NULL,		/* 217 */},
349{	NULL,		/* 218 */},
350{	NULL,		/* 219 */},
351{	NULL,		/* 220 */},
352{	NULL,		/* 221 */},
353{	NULL,		/* 222 */},
354{	"ss",		/* 223 */},
355{	NULL,		/* 224 */},
356{	NULL,		/* 225 */},
357{	NULL,		/* 226 */},
358{	NULL,		/* 227 */},
359{	NULL,		/* 228 */},
360{	NULL,		/* 229 */},
361{	"ae",		/* 230 */},
362{	NULL,		/* 231 */},
363{	NULL,		/* 232 */},
364{	NULL,		/* 233 */},
365{	NULL,		/* 234 */},
366{	NULL,		/* 235 */},
367{	NULL,		/* 236 */},
368{	NULL,		/* 237 */},
369{	NULL,		/* 238 */},
370{	NULL,		/* 239 */},
371{	NULL,		/* 240 */},
372{	NULL,		/* 241 */},
373{	NULL,		/* 242 */},
374{	NULL,		/* 243 */},
375{	NULL,		/* 244 */},
376{	NULL,		/* 245 */},
377{	NULL,		/* 246 */},
378{	NULL,		/* 247 */},
379{	NULL,		/* 248 */},
380{	NULL,		/* 249 */},
381{	NULL,		/* 250 */},
382{	NULL,		/* 251 */},
383{	NULL,		/* 252 */},
384{	NULL,		/* 253 */},
385{	NULL,		/* 254 */},
386{	NULL,		/* 255 */},
387},
388{
389{   "fi",	    "fi",   },
390{   "fl",	    "fl",   },
391{   "ff",	    "ff",   },
392{   "Fi",	    "ffi",   },
393{   "Fl",	    "ffl",   },
394{   NULL,	    NULL,    },
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
664static void
665load_standard_maps (void)
666{
667	standard_maps_loaded = 1;
668	DviRegisterMap (&ISO8859_1_map);
669	DviRegisterMap (&Adobe_Symbol_map);
670}
671
672