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