x11-xserver-utils/xditview/DviChar.c

679 lines
12 KiB
C

/* $XConsortium: DviChar.c,v 1.7 91/07/31 00:39:31 keith Exp $ */
/*
* DviChar.c
*
* Map DVI (ditrof output) character names to
* font indexes and back
*/
/* $XFree86$ */
# include <X11/Intrinsic.h>
# include "DviChar.h"
# define allocHash() ((DviCharNameHash *) XtMalloc (sizeof (DviCharNameHash)))
struct map_list {
struct map_list *next;
DviCharNameMap *map;
};
static struct map_list *world;
static int standard_maps_loaded = 0;
static void load_standard_maps (void);
static int hash_name (char *name);
static void dispose_hash(DviCharNameMap *map);
static void compute_hash(DviCharNameMap *map);
DviCharNameMap *
DviFindMap (encoding)
char *encoding;
{
struct map_list *m;
if (!standard_maps_loaded)
load_standard_maps ();
for (m = world; m; m=m->next)
if (!strcmp (m->map->encoding, encoding))
return m->map;
return 0;
}
void
DviRegisterMap (map)
DviCharNameMap *map;
{
struct map_list *m;
if (!standard_maps_loaded)
load_standard_maps ();
for (m = world; m; m = m->next)
if (!strcmp (m->map->encoding, map->encoding))
break;
if (!m) {
m = (struct map_list *) XtMalloc (sizeof *m);
m->next = world;
world = m;
}
dispose_hash (map);
m->map = map;
compute_hash (map);
}
static void
dispose_hash (map)
DviCharNameMap *map;
{
DviCharNameHash **buckets;
DviCharNameHash *h, *next;
int i;
buckets = map->buckets;
for (i = 0; i < DVI_HASH_SIZE; i++) {
for (h = buckets[i]; h; h=next) {
next = h->next;
XtFree ((char *) h);
}
}
}
static int
hash_name (name)
char *name;
{
int i = 0;
while (*name)
i = (i << 1) ^ *name++;
if (i < 0)
i = -i;
return i;
}
static void
compute_hash (map)
DviCharNameMap *map;
{
DviCharNameHash **buckets;
int c, s, i;
DviCharNameHash *h;
buckets = map->buckets;
for (i = 0; i < DVI_HASH_SIZE; i++)
buckets[i] = 0;
for (c = 0; c < DVI_MAP_SIZE; c++)
for (s = 0; s < DVI_MAX_SYNONYMS; s++) {
if (!map->dvi_names[c][s])
break;
i = hash_name (map->dvi_names[c][s]) % DVI_HASH_SIZE;
h = allocHash ();
h->next = buckets[i];
buckets[i] = h;
h->name = map->dvi_names[c][s];
h->position = c;
}
}
int
DviCharIndex (map, name)
DviCharNameMap *map;
char *name;
{
int i;
DviCharNameHash *h;
i = hash_name (name) % DVI_HASH_SIZE;
for (h = map->buckets[i]; h; h=h->next)
if (!strcmp (h->name, name))
return h->position;
return -1;
}
static DviCharNameMap ISO8859_1_map = {
"iso8859-1",
0,
{
{ 0, /* 0 */},
{ 0, /* 1 */},
{ 0, /* 2 */},
{ 0, /* 3 */},
{ 0, /* 4 */},
{ 0, /* 5 */},
{ 0, /* 6 */},
{ 0, /* 7 */},
{ 0, /* 8 */},
{ 0, /* 9 */},
{ 0, /* 10 */},
{ 0, /* 11 */},
{ 0, /* 12 */},
{ 0, /* 13 */},
{ 0, /* 14 */},
{ 0, /* 15 */},
{ 0, /* 16 */},
{ 0, /* 17 */},
{ 0, /* 18 */},
{ 0, /* 19 */},
{ 0, /* 20 */},
{ 0, /* 21 */},
{ 0, /* 22 */},
{ 0, /* 23 */},
{ 0, /* 24 */},
{ 0, /* 25 */},
{ 0, /* 26 */},
{ 0, /* 27 */},
{ 0, /* 28 */},
{ 0, /* 29 */},
{ 0, /* 30 */},
{ 0, /* 31 */},
{ 0, /* 32 */},
{ "!", /* 33 */},
{ "\"", /* 34 */},
{ "#", /* 35 */},
{ "$", /* 36 */},
{ "%", /* 37 */},
{ "&", /* 38 */},
{ "'", /* 39 */},
{ "(", /* 40 */},
{ ")", /* 41 */},
{ "*", /* 42 */},
{ "+", /* 43 */},
{ ",", /* 44 */},
{ "-","\\-", /* 45 */},
{ ".", /* 46 */},
{ "/","sl", /* 47 */},
{ "0", /* 48 */},
{ "1", /* 49 */},
{ "2", /* 50 */},
{ "3", /* 51 */},
{ "4", /* 52 */},
{ "5", /* 53 */},
{ "6", /* 54 */},
{ "7", /* 55 */},
{ "8", /* 56 */},
{ "9", /* 57 */},
{ ":", /* 58 */},
{ ";", /* 59 */},
{ "<", /* 60 */},
{ "=","eq", /* 61 */},
{ ">", /* 62 */},
{ "?", /* 63 */},
{ "@", /* 64 */},
{ "A", /* 65 */},
{ "B", /* 66 */},
{ "C", /* 67 */},
{ "D", /* 68 */},
{ "E", /* 69 */},
{ "F", /* 70 */},
{ "G", /* 71 */},
{ "H", /* 72 */},
{ "I", /* 73 */},
{ "J", /* 74 */},
{ "K", /* 75 */},
{ "L", /* 76 */},
{ "M", /* 77 */},
{ "N", /* 78 */},
{ "O", /* 79 */},
{ "P", /* 80 */},
{ "Q", /* 81 */},
{ "R", /* 82 */},
{ "S", /* 83 */},
{ "T", /* 84 */},
{ "U", /* 85 */},
{ "V", /* 86 */},
{ "W", /* 87 */},
{ "X", /* 88 */},
{ "Y", /* 89 */},
{ "Z", /* 90 */},
{ "[", /* 91 */},
{ "\\", /* 92 */},
{ "]", /* 93 */},
{ "a^", /* 94 */},
{ "_","ru","ul", /* 95 */},
{ "`", /* 96 */},
{ "a", /* 97 */},
{ "b", /* 98 */},
{ "c", /* 99 */},
{ "d", /* 100 */},
{ "e", /* 101 */},
{ "f", /* 102 */},
{ "g", /* 103 */},
{ "h", /* 104 */},
{ "i", /* 105 */},
{ "j", /* 106 */},
{ "k", /* 107 */},
{ "l", /* 108 */},
{ "m", /* 109 */},
{ "n", /* 110 */},
{ "o", /* 111 */},
{ "p", /* 112 */},
{ "q", /* 113 */},
{ "r", /* 114 */},
{ "s", /* 115 */},
{ "t", /* 116 */},
{ "u", /* 117 */},
{ "v", /* 118 */},
{ "w", /* 119 */},
{ "x", /* 120 */},
{ "y", /* 121 */},
{ "z", /* 122 */},
{ "{", /* 123 */},
{ "|","or" /* 124 */},
{ "}", /* 125 */},
{ "a~","ap" /* 126 */},
{ 0, /* 127 */},
{ 0, /* 128 */},
{ 0, /* 129 */},
{ 0, /* 130 */},
{ 0, /* 131 */},
{ 0, /* 132 */},
{ 0, /* 133 */},
{ 0, /* 134 */},
{ 0, /* 135 */},
{ 0, /* 136 */},
{ 0, /* 137 */},
{ 0, /* 138 */},
{ 0, /* 139 */},
{ 0, /* 140 */},
{ 0, /* 141 */},
{ 0, /* 142 */},
{ 0, /* 143 */},
{ 0, /* 144 */},
{ 0, /* 145 */},
{ 0, /* 146 */},
{ 0, /* 147 */},
{ 0, /* 148 */},
{ 0, /* 149 */},
{ 0, /* 150 */},
{ 0, /* 151 */},
{ 0, /* 152 */},
{ 0, /* 153 */},
{ 0, /* 154 */},
{ 0, /* 155 */},
{ 0, /* 156 */},
{ 0, /* 157 */},
{ 0, /* 158 */},
{ 0, /* 159 */},
{ 0, /* 160 */},
{ "I!", /* 161 */},
{ "ct", /* 162 */},
{ "po", /* 163 */},
{ "cu", /* 164 */},
{ "$J", /* 165 */},
{ 0, /* 166 */},
{ "sc", /* 167 */},
{ 0, /* 168 */},
{ "co", /* 169 */},
{ 0, /* 170 */},
{ "d<", /* 171 */},
{ "no", /* 172 */},
{ "hy", /* 173 */},
{ "rg", /* 174 */},
{ "ma", /* 175 */},
{ "de", /* 176 */},
{ "+-", /* 177 */},
{ 0, /* 178 */},
{ 0, /* 179 */},
{ "aa", /* 180 */},
{ "*m", /* 181 */},
{ "pp", /* 182 */},
{ 0, /* 183 */},
{ "cd", /* 184 */},
{ 0, /* 185 */},
{ 0, /* 186 */},
{ "d>", /* 187 */},
{ "14", /* 188 */},
{ "12", /* 189 */},
{ "34", /* 190 */},
{ "I?", /* 191 */},
{ 0, /* 192 */},
{ 0, /* 193 */},
{ 0, /* 194 */},
{ 0, /* 195 */},
{ 0, /* 196 */},
{ 0, /* 197 */},
{ "AE", /* 198 */},
{ 0, /* 199 */},
{ 0, /* 200 */},
{ 0, /* 201 */},
{ 0, /* 202 */},
{ 0, /* 203 */},
{ 0, /* 204 */},
{ 0, /* 205 */},
{ 0, /* 206 */},
{ 0, /* 207 */},
{ 0, /* 208 */},
{ 0, /* 209 */},
{ 0, /* 210 */},
{ 0, /* 211 */},
{ 0, /* 212 */},
{ 0, /* 213 */},
{ 0, /* 214 */},
{ "mu", /* 215 */},
{ "O/", /* 216 */},
{ 0, /* 217 */},
{ 0, /* 218 */},
{ 0, /* 219 */},
{ 0, /* 220 */},
{ 0, /* 221 */},
{ 0, /* 222 */},
{ "ss", /* 223 */},
{ 0, /* 224 */},
{ 0, /* 225 */},
{ 0, /* 226 */},
{ 0, /* 227 */},
{ 0, /* 228 */},
{ 0, /* 229 */},
{ "ae", /* 230 */},
{ 0, /* 231 */},
{ 0, /* 232 */},
{ 0, /* 233 */},
{ 0, /* 234 */},
{ 0, /* 235 */},
{ 0, /* 236 */},
{ 0, /* 237 */},
{ 0, /* 238 */},
{ 0, /* 239 */},
{ 0, /* 240 */},
{ 0, /* 241 */},
{ 0, /* 242 */},
{ 0, /* 243 */},
{ 0, /* 244 */},
{ 0, /* 245 */},
{ 0, /* 246 */},
{ 0, /* 247 */},
{ 0, /* 248 */},
{ 0, /* 249 */},
{ 0, /* 250 */},
{ 0, /* 251 */},
{ 0, /* 252 */},
{ 0, /* 253 */},
{ 0, /* 254 */},
{ 0, /* 255 */},
},
{
{ "fi", "fi", },
{ "fl", "fl", },
{ "ff", "ff", },
{ "Fi", "ffi", },
{ "Fl", "ffl", },
{ 0, 0, },
}
};
static DviCharNameMap Adobe_Symbol_map = {
"adobe-fontspecific",
1,
{
{ 0, /* 0 */},
{ 0, /* 1 */},
{ 0, /* 2 */},
{ 0, /* 3 */},
{ 0, /* 4 */},
{ 0, /* 5 */},
{ 0, /* 6 */},
{ 0, /* 7 */},
{ 0, /* 8 */},
{ 0, /* 9 */},
{ 0, /* 10 */},
{ 0, /* 11 */},
{ 0, /* 12 */},
{ 0, /* 13 */},
{ 0, /* 14 */},
{ 0, /* 15 */},
{ 0, /* 16 */},
{ 0, /* 17 */},
{ 0, /* 18 */},
{ 0, /* 19 */},
{ 0, /* 20 */},
{ 0, /* 21 */},
{ 0, /* 22 */},
{ 0, /* 23 */},
{ 0, /* 24 */},
{ 0, /* 25 */},
{ 0, /* 26 */},
{ 0, /* 27 */},
{ 0, /* 28 */},
{ 0, /* 29 */},
{ 0, /* 30 */},
{ 0, /* 31 */},
{ 0, /* 32 */},
{ "!", /* 33 */},
{ "fa", /* 34 */},
{ "#", /* 35 */},
{ "te", /* 36 */},
{ "%", /* 37 */},
{ "&", /* 38 */},
{ "cm", /* 39 */},
{ "(", /* 40 */},
{ ")", /* 41 */},
{ "**", /* 42 */},
{ "+","pl", /* 43 */},
{ ",", /* 44 */},
{ "-","mi","\\-", /* 45 */},
{ ".", /* 46 */},
{ "/","sl", /* 47 */},
{ "0", /* 48 */},
{ "1", /* 49 */},
{ "2", /* 50 */},
{ "3", /* 51 */},
{ "4", /* 52 */},
{ "5", /* 53 */},
{ "6", /* 54 */},
{ "7", /* 55 */},
{ "8", /* 56 */},
{ "9", /* 57 */},
{ ":", /* 58 */},
{ ";", /* 59 */},
{ "<", /* 60 */},
{ "=","eq", /* 61 */},
{ ">", /* 62 */},
{ "?", /* 63 */},
{ "=~", /* 64 */},
{ "*A", /* 65 */},
{ "*B", /* 66 */},
{ "*C", /* 67 */},
{ "*D", /* 68 */},
{ "*E", /* 69 */},
{ "*F", /* 70 */},
{ "*G", /* 71 */},
{ "*Y", /* 72 */},
{ "*I", /* 73 */},
{ 0, /* 74 */},
{ "*K", /* 75 */},
{ "*L", /* 76 */},
{ "*M", /* 77 */},
{ "*N", /* 78 */},
{ "*O", /* 79 */},
{ "*P", /* 80 */},
{ "*H", /* 81 */},
{ "*R", /* 82 */},
{ "*S", /* 83 */},
{ "*T", /* 84 */},
{ "*U", /* 85 */},
{ "ts", /* 86 */},
{ "*W", /* 87 */},
{ "*C", /* 88 */},
{ "*Q", /* 89 */},
{ "*Z", /* 90 */},
{ "[", /* 91 */},
{ "tf", /* 92 */},
{ "]", /* 93 */},
{ "bt", /* 94 */},
{ "ul", /* 95 */},
{ "rn", /* 96 */},
{ "*a", /* 97 */},
{ "*b", /* 98 */},
{ "*x", /* 99 */},
{ "*d", /* 100 */},
{ "*e", /* 101 */},
{ "*f", /* 102 */},
{ "*g", /* 103 */},
{ "*y", /* 104 */},
{ "*i", /* 105 */},
{ 0, /* 106 */},
{ "*k", /* 107 */},
{ "*l", /* 108 */},
{ "*m", /* 109 */},
{ "*n", /* 110 */},
{ "*o", /* 111 */},
{ "*p", /* 112 */},
{ "*h", /* 113 */},
{ "*r", /* 114 */},
{ "*s", /* 115 */},
{ "*t", /* 116 */},
{ "*u", /* 117 */},
{ 0, /* 118 */},
{ "*w", /* 119 */},
{ "*c", /* 120 */},
{ "*q", /* 121 */},
{ "*z", /* 122 */},
{ "{", /* 123 */},
{ "|", /* 124 */},
{ "}", /* 125 */},
{ "a~","ap", /* 126 */},
{ 0, /* 127 */},
{ 0, /* 128 */},
{ 0, /* 129 */},
{ 0, /* 130 */},
{ 0, /* 131 */},
{ 0, /* 132 */},
{ 0, /* 133 */},
{ 0, /* 134 */},
{ 0, /* 135 */},
{ 0, /* 136 */},
{ 0, /* 137 */},
{ 0, /* 138 */},
{ 0, /* 139 */},
{ 0, /* 140 */},
{ 0, /* 141 */},
{ 0, /* 142 */},
{ 0, /* 143 */},
{ 0, /* 144 */},
{ 0, /* 145 */},
{ 0, /* 146 */},
{ 0, /* 147 */},
{ 0, /* 148 */},
{ 0, /* 149 */},
{ 0, /* 150 */},
{ 0, /* 151 */},
{ 0, /* 152 */},
{ 0, /* 153 */},
{ 0, /* 154 */},
{ 0, /* 155 */},
{ 0, /* 156 */},
{ 0, /* 157 */},
{ 0, /* 158 */},
{ 0, /* 159 */},
{ 0, /* 160 */},
{ 0, /* 161 */},
{ "fm","mt", /* 162 */},
{ "<=", /* 163 */},
{ "/","sl" /* 164 */},
{ "if", /* 165 */},
{ 0, /* 166 */},
{ "Cc", /* 167 */},
{ "Cd", /* 168 */},
{ "Ch", /* 169 */},
{ "Cs", /* 170 */},
{ "<>", /* 171 */},
{ "<-", /* 172 */},
{ "ua", /* 173 */},
{ "->", /* 174 */},
{ "da", /* 175 */},
{ "de", /* 176 */},
{ "+-", /* 177 */},
{ "sd", /* 178 */},
{ ">=", /* 179 */},
{ "mu", /* 180 */},
{ "pt", /* 181 */},
{ "pd", /* 182 */},
{ "bu", /* 183 */},
{ "di", /* 184 */},
{ "!=", /* 185 */},
{ "==", /* 186 */},
{ "~=", /* 187 */},
{ "..", /* 188 */},
{ "br", /* 189 */},
{ "em", /* 190 */},
{ "cr", /* 191 */},
{ "al", /* 192 */},
{ 0, /* 193 */},
{ 0, /* 194 */},
{ 0, /* 195 */},
{ "ax", /* 196 */},
{ "a+", /* 197 */},
{ "es", /* 198 */},
{ "ca", /* 199 */},
{ "cu", /* 200 */},
{ "sp", /* 201 */},
{ "ip", /* 202 */},
{ "!s", /* 203 */},
{ "sb", /* 204 */},
{ "ib", /* 205 */},
{ "mo", /* 206 */},
{ "!m", /* 207 */},
{ "ag", /* 208 */},
{ "gr", /* 209 */},
{ 0, /* 210 */},
{ 0, /* 211 */},
{ 0, /* 212 */},
{ 0, /* 213 */},
{ "sr", /* 214 */},
{ "m.", /* 215 */},
{ "no", /* 216 */},
{ "an", /* 217 */},
{ "lo", /* 218 */},
{ "io", /* 219 */},
{ "<:", /* 220 */},
{ "u=", /* 221 */},
{ ":>", /* 222 */},
{ "d=", /* 223 */},
{ "dm", /* 224 */},
{ "L<", /* 225 */},
{ "rg", /* 226 */},
{ "co", /* 227 */},
{ "tm", /* 228 */},
{ 0, /* 229 */},
{ 0, /* 230 */},
{ 0, /* 231 */},
{ 0, /* 232 */},
{ "lc", /* 233 */},
{ 0, /* 234 */},
{ "lf", /* 235 */},
{ "lt", /* 236 */},
{ "lk", /* 237 */},
{ "lb", /* 238 */},
{ "bv", /* 239 */},
{ "AL", /* 240 */},
{ "R>", /* 241 */},
{ "is", /* 242 */},
{ 0, /* 243 */},
{ 0, /* 244 */},
{ 0, /* 245 */},
{ 0, /* 246 */},
{ 0, /* 247 */},
{ 0, /* 248 */},
{ "rc", /* 249 */},
{ 0, /* 250 */},
{ "rf", /* 251 */},
{ "rt", /* 252 */},
{ "rk", /* 253 */},
{ "rb", /* 254 */},
{ 0, /* 255 */},
},
{
{ 0, 0 },
}
};
static void
load_standard_maps ()
{
standard_maps_loaded = 1;
DviRegisterMap (&ISO8859_1_map);
DviRegisterMap (&Adobe_Symbol_map);
}