# 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, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ "!", },
{ "\"", },
{ "#", },
{ "$", },
{ "%", },
{ "&", },
{ "'", },
{ "(", },
{ ")", },
{ "*", },
{ "+", },
{ ",", },
{ "-","\\-", },
{ ".", },
{ "/","sl", },
{ "0", },
{ "1", },
{ "2", },
{ "3", },
{ "4", },
{ "5", },
{ "6", },
{ "7", },
{ "8", },
{ "9", },
{ ":", },
{ ";", },
{ "<", },
{ "=","eq", },
{ ">", },
{ "?", },
{ "@", },
{ "A", },
{ "B", },
{ "C", },
{ "D", },
{ "E", },
{ "F", },
{ "G", },
{ "H", },
{ "I", },
{ "J", },
{ "K", },
{ "L", },
{ "M", },
{ "N", },
{ "O", },
{ "P", },
{ "Q", },
{ "R", },
{ "S", },
{ "T", },
{ "U", },
{ "V", },
{ "W", },
{ "X", },
{ "Y", },
{ "Z", },
{ "[", },
{ "\\", },
{ "]", },
{ "a^", },
{ "_","ru","ul", },
{ "`", },
{ "a", },
{ "b", },
{ "c", },
{ "d", },
{ "e", },
{ "f", },
{ "g", },
{ "h", },
{ "i", },
{ "j", },
{ "k", },
{ "l", },
{ "m", },
{ "n", },
{ "o", },
{ "p", },
{ "q", },
{ "r", },
{ "s", },
{ "t", },
{ "u", },
{ "v", },
{ "w", },
{ "x", },
{ "y", },
{ "z", },
{ "{", },
{ "|","or" },
{ "}", },
{ "a~","ap" },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ "I!", },
{ "ct", },
{ "po", },
{ "cu", },
{ "$J", },
{ 0, },
{ "sc", },
{ 0, },
{ "co", },
{ 0, },
{ "d<", },
{ "no", },
{ "hy", },
{ "rg", },
{ "ma", },
{ "de", },
{ "+-", },
{ 0, },
{ 0, },
{ "aa", },
{ "*m", },
{ "pp", },
{ 0, },
{ "cd", },
{ 0, },
{ 0, },
{ "d>", },
{ "14", },
{ "12", },
{ "34", },
{ "I?", },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ "AE", },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ "mu", },
{ "O/", },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ "ss", },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ "ae", },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
},
{
{ "fi", "fi", },
{ "fl", "fl", },
{ "ff", "ff", },
{ "Fi", "ffi", },
{ "Fl", "ffl", },
{ 0, 0, },
}
};
static DviCharNameMap Adobe_Symbol_map = {
"adobe-fontspecific",
1,
{
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ "!", },
{ "fa", },
{ "#", },
{ "te", },
{ "%", },
{ "&", },
{ "cm", },
{ "(", },
{ ")", },
{ "**", },
{ "+","pl", },
{ ",", },
{ "-","mi","\\-", },
{ ".", },
{ "/","sl", },
{ "0", },
{ "1", },
{ "2", },
{ "3", },
{ "4", },
{ "5", },
{ "6", },
{ "7", },
{ "8", },
{ "9", },
{ ":", },
{ ";", },
{ "<", },
{ "=","eq", },
{ ">", },
{ "?", },
{ "=~", },
{ "*A", },
{ "*B", },
{ "*C", },
{ "*D", },
{ "*E", },
{ "*F", },
{ "*G", },
{ "*Y", },
{ "*I", },
{ 0, },
{ "*K", },
{ "*L", },
{ "*M", },
{ "*N", },
{ "*O", },
{ "*P", },
{ "*H", },
{ "*R", },
{ "*S", },
{ "*T", },
{ "*U", },
{ "ts", },
{ "*W", },
{ "*C", },
{ "*Q", },
{ "*Z", },
{ "[", },
{ "tf", },
{ "]", },
{ "bt", },
{ "ul", },
{ "rn", },
{ "*a", },
{ "*b", },
{ "*x", },
{ "*d", },
{ "*e", },
{ "*f", },
{ "*g", },
{ "*y", },
{ "*i", },
{ 0, },
{ "*k", },
{ "*l", },
{ "*m", },
{ "*n", },
{ "*o", },
{ "*p", },
{ "*h", },
{ "*r", },
{ "*s", },
{ "*t", },
{ "*u", },
{ 0, },
{ "*w", },
{ "*c", },
{ "*q", },
{ "*z", },
{ "{", },
{ "|", },
{ "}", },
{ "a~","ap", },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ "fm","mt", },
{ "<=", },
{ "/","sl" },
{ "if", },
{ 0, },
{ "Cc", },
{ "Cd", },
{ "Ch", },
{ "Cs", },
{ "<>", },
{ "<-", },
{ "ua", },
{ "->", },
{ "da", },
{ "de", },
{ "+-", },
{ "sd", },
{ ">=", },
{ "mu", },
{ "pt", },
{ "pd", },
{ "bu", },
{ "di", },
{ "!=", },
{ "==", },
{ "~=", },
{ "..", },
{ "br", },
{ "em", },
{ "cr", },
{ "al", },
{ 0, },
{ 0, },
{ 0, },
{ "ax", },
{ "a+", },
{ "es", },
{ "ca", },
{ "cu", },
{ "sp", },
{ "ip", },
{ "!s", },
{ "sb", },
{ "ib", },
{ "mo", },
{ "!m", },
{ "ag", },
{ "gr", },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ "sr", },
{ "m.", },
{ "no", },
{ "an", },
{ "lo", },
{ "io", },
{ "<:", },
{ "u=", },
{ ":>", },
{ "d=", },
{ "dm", },
{ "L<", },
{ "rg", },
{ "co", },
{ "tm", },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ "lc", },
{ 0, },
{ "lf", },
{ "lt", },
{ "lk", },
{ "lb", },
{ "bv", },
{ "AL", },
{ "R>", },
{ "is", },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ "rc", },
{ 0, },
{ "rf", },
{ "rt", },
{ "rk", },
{ "rb", },
{ 0, },
},
{
{ 0, 0 },
}
};
static void
load_standard_maps ()
{
standard_maps_loaded = 1;
DviRegisterMap (&ISO8859_1_map);
DviRegisterMap (&Adobe_Symbol_map);
}