#include "DviChar.h"
extern char *xmalloc();
#define allocHash() ((DviCharNameHash *) xmalloc (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 ();
static int hash_name ();
static dispose_hash(), compute_hash();
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 *) xmalloc (sizeof *m);
m->next = world;
world = m;
}
dispose_hash (map);
m->map = map;
compute_hash (map);
}
static
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;
free (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
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, },
{ "!", },
{ "\"", },
{ "#","sh", },
{ "$","Do", },
{ "%", },
{ "&", },
{ "'", },
{ "(", },
{ ")", },
{ "*", },
{ "+", },
{ ",", },
{ "\\-", },
{ ".", },
{ "/","sl", },
{ "0", },
{ "1", },
{ "2", },
{ "3", },
{ "4", },
{ "5", },
{ "6", },
{ "7", },
{ "8", },
{ "9", },
{ ":", },
{ ";", },
{ "<", },
{ "=","eq", },
{ ">", },
{ "?", },
{ "@","at", },
{ "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", },
{ "[","lB", },
{ "\\","rs", },
{ "]","rB", },
{ "^","a^","ha" },
{ "_", },
{ "`","oq", },
{ "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", },
{ "{","lC", },
{ "|","or","ba" },
{ "}","rC", },
{ "~","a~","ap","ti" },
{ 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, },
{ "r!", "\241", },
{ "ct", "\242", },
{ "Po", "\243", },
{ "Cs", "\244", },
{ "Ye", "\245", },
{ "bb", "\246", },
{ "sc", "\247", },
{ "ad", "\250", },
{ "co", "\251", },
{ "Of", "\252", },
{ "Fo", "\253", },
{ "no", "\254", },
{ "-", "hy", "\255" },
{ "rg", "\256", },
{ "a-", "\257", },
{ "de", "\260", },
{ "+-", "\261", },
{ "S2", "\262", },
{ "S3", "\263", },
{ "aa", "\264", },
{ "\265", },
{ "ps", "\266", },
{ "md", "\267", },
{ "ac", "\270", },
{ "S1", "\271", },
{ "Om", "\272", },
{ "Fc", "\273", },
{ "14", "\274", },
{ "12", "\275", },
{ "34", "\276", },
{ "r?", "\277", },
{ "`A", "\300", },
{ "'A", "\301", },
{ "^A", "\302", },
{ "~A", "\303", },
{ ":A", "\304", },
{ "oA", "\305", },
{ "AE", "\306", },
{ ",C", "\307", },
{ "`E", "\310", },
{ "'E", "\311", },
{ "^E", "\312", },
{ ":E", "\313", },
{ "`I", "\314", },
{ "'I", "\315", },
{ "^I", "\316", },
{ ":I", "\317", },
{ "-D", "\320", },
{ "~N", "\321", },
{ "`O", "\322", },
{ "'O", "\323", },
{ "^O", "\324", },
{ "~O", "\325", },
{ ":O", "\326", },
{ "mu", "\327", },
{ "/O", "\330", },
{ "`U", "\331", },
{ "'U", "\332", },
{ "^U", "\333", },
{ ":U", "\334", },
{ "'Y", "\335", },
{ "TP", "\336", },
{ "ss", "\337", },
{ "`a", "\340", },
{ "'a", "\341", },
{ "^a", "\342", },
{ "~a", "\343", },
{ ":a", "\344", },
{ "oa", "\345", },
{ "ae", "\346", },
{ ",c", "\347", },
{ "`e", "\350", },
{ "'e", "\351", },
{ "^e", "\352", },
{ ":e", "\353", },
{ "`i", "\354", },
{ "'i", "\355", },
{ "^i", "\356", },
{ ":i", "\357", },
{ "Sd", "\360", },
{ "~n", "\361", },
{ "`o", "\362", },
{ "'o", "\363", },
{ "^o", "\364", },
{ "~o", "\365", },
{ ":o", "\366", },
{ "di", "\367", },
{ "/o", "\370", },
{ "`u", "\371", },
{ "'u", "\372", },
{ "^u", "\373", },
{ ":u", "\374", },
{ "'y", "\375", },
{ "Tp", "\376", },
{ ":y", "\377", },
}};
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", },
{ "#", "sh", },
{ "te", },
{ "%", },
{ "&", },
{ "st", },
{ "(", },
{ ")", },
{ "**", },
{ "+", "pl", },
{ ",", },
{ "\\-", "mi", },
{ ".", },
{ "/", "sl", },
{ "0", },
{ "1", },
{ "2", },
{ "3", },
{ "4", },
{ "5", },
{ "6", },
{ "7", },
{ "8", },
{ "9", },
{ ":", },
{ ";", },
{ "<", },
{ "=", "eq", },
{ ">", },
{ "?", },
{ "=~", },
{ "*A", },
{ "*B", },
{ "*X", },
{ "*D", },
{ "*E", },
{ "*F", },
{ "*G", },
{ "*Y", },
{ "*I", },
{ "+h", },
{ "*K", },
{ "*L", },
{ "*M", },
{ "*N", },
{ "*O", },
{ "*P", },
{ "*H", },
{ "*R", },
{ "*S", },
{ "*T", },
{ 0, },
{ "ts", },
{ "*W", },
{ "*C", },
{ "*Q", },
{ "*Z", },
{ "[", "lB", },
{ "tf", "3d", },
{ "]", "rB", },
{ "pp", },
{ "_", },
{ "radicalex", },
{ "*a", },
{ "*b", },
{ "*x", },
{ "*d", },
{ "*e", },
{ "*f", },
{ "*g", },
{ "*y", },
{ "*i", },
{ "+f", },
{ "*k", },
{ "*l", },
{ "*m", "\265", },
{ "*n", },
{ "*o", },
{ "*p", },
{ "*h", },
{ "*r", },
{ "*s", },
{ "*t", },
{ "*u", },
{ "+p", },
{ "*w", },
{ "*c", },
{ "*q", },
{ "*z", },
{ "lC", "{", },
{ "ba", "or", "|", },
{ "rC", "}", },
{ "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, },
{ "*U", },
{ "fm", },
{ "<=", },
{ "f/", },
{ "if", },
{ "Fn", },
{ "CL", },
{ "DI", },
{ "HE", },
{ "SP", },
{ "<>", },
{ "<-", },
{ "ua", "arrowverttp" },
{ "->", },
{ "da", "arrowvertbt" },
{ "de", "\260", },
{ "+-", "\261", },
{ "sd", },
{ ">=", },
{ "mu", "\327", },
{ "pt", },
{ "pd", },
{ "bu", },
{ "di", "\367", },
{ "!=", },
{ "==", },
{ "~=", "~~", },
{ 0, },
{ "arrowvertex", },
{ "an", },
{ "CR", },
{ "Ah", },
{ "Im", },
{ "Re", },
{ "wp", },
{ "c*", },
{ "c+", },
{ "es", },
{ "ca", },
{ "cu", },
{ "sp", },
{ "ip", },
{ "nb", },
{ "sb", },
{ "ib", },
{ "mo", },
{ "nm", },
{ "/_", },
{ "gr", },
{ "rg", },
{ "co", },
{ "tm", },
{ 0, },
{ "sr", },
{ "md", },
{ "no", "\254", },
{ "AN", },
{ "OR", },
{ "hA", },
{ "lA", },
{ "uA", },
{ "rA", },
{ "dA", },
{ "lz", },
{ "la", },
{ 0, },
{ 0, },
{ 0, },
{ 0, },
{ "parenlefttp", },
{ "parenleftex", },
{ "parenleftbt", },
{ "bracketlefttp", "lc", },
{ "bracketleftex", },
{ "bracketleftbt", "lf", },
{ "bracelefttp", "lt", },
{ "braceleftmid", "lk", },
{ "braceleftbt", "lb", },
{ "bracerightex", "braceleftex", "bv", },
{ 0, },
{ "ra", },
{ "is", },
{ 0, },
{ 0, },
{ 0, },
{ "parenrighttp", },
{ "parenrightex", },
{ "parenrightbt", },
{ "bracketrighttp", "rc", },
{ "bracketrightex", },
{ "bracketrightbt", "rf", },
{ "bracerighttp", "rt" },
{ "bracerightmid", "rk" },
{ "bracerightbt", "rb" },
{ 0, },
}};
static void
load_standard_maps ()
{
standard_maps_loaded = 1;
DviRegisterMap (&ISO8859_1_map);
DviRegisterMap (&Adobe_Symbol_map);
}