#include <stdlib.h>
#include <string.h>
#include "DviChar.h"
extern char *xmalloc(int);
#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 (void);
static int hash_name (const char *);
static void dispose_hash(DviCharNameMap *);
static void compute_hash(DviCharNameMap *);
DviCharNameMap *
DviFindMap (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 (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 void
dispose_hash (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 (const char *name)
{
int i = 0;
while (*name)
i = (i << 1) ^ *name++;
if (i < 0)
i = -i;
return i;
}
static void
compute_hash (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 (DviCharNameMap *map, const 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, },
{ "!", },
{ "\"", "dq", },
{ "#", "sh", },
{ "$", "Do", },
{ "%", },
{ "&", },
{ "'", "cq", },
{ "(", },
{ ")", },
{ "*", },
{ "+", },
{ ",", },
{ "\\-", },
{ ".", },
{ "/", "sl", },
{ "0", },
{ "1", },
{ "2", },
{ "3", },
{ "4", },
{ "5", },
{ "6", },
{ "7", },
{ "8", },
{ "9", },
{ ":", },
{ ";", },
{ "<", },
{ "=", },
{ ">", },
{ "?", },
{ "@", "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", },
{ "|", "ba", },
{ "}", "rC", },
{ "~", "a~", "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!", },
{ "ct", },
{ "Po", },
{ "Cs", },
{ "Ye", },
{ "bb", },
{ "sc", },
{ "ad", },
{ "co", },
{ "Of", },
{ "Fo", },
{ "tno", },
{ "-", "hy", },
{ "rg", },
{ "a-", },
{ "de", },
{ "t+-", },
{ "S2", },
{ "S3", },
{ "aa", },
{ "mc", },
{ "ps", },
{ "pc", },
{ "ac", },
{ "S1", },
{ "Om", },
{ "Fc", },
{ "14", },
{ "12", },
{ "34", },
{ "r?", },
{ "`A", },
{ "'A", },
{ "^A", },
{ "~A", },
{ ":A", },
{ "oA", },
{ "AE", },
{ ",C", },
{ "`E", },
{ "'E", },
{ "^E", },
{ ":E", },
{ "`I", },
{ "'I", },
{ "^I", },
{ ":I", },
{ "-D", },
{ "~N", },
{ "`O", },
{ "'O", },
{ "^O", },
{ "~O", },
{ ":O", },
{ "tmu", },
{ "/O", },
{ "`U", },
{ "'U", },
{ "^U", },
{ ":U", },
{ "'Y", },
{ "TP", },
{ "ss", },
{ "`a", },
{ "'a", },
{ "^a", },
{ "~a", },
{ ":a", },
{ "oa", },
{ "ae", },
{ ",c", },
{ "`e", },
{ "'e", },
{ "^e", },
{ ":e", },
{ "`i", },
{ "'i", },
{ "^i", },
{ ":i", },
{ "Sd", },
{ "~n", },
{ "`o", },
{ "'o", },
{ "^o", },
{ "~o", },
{ ":o", },
{ "tdi", },
{ "/o", },
{ "`u", },
{ "'u", },
{ "^u", },
{ ":u", },
{ "'y", },
{ "Tp", },
{ ":y", },
}};
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", },
{ "*n", },
{ "*o", },
{ "*p", },
{ "*h", },
{ "*r", },
{ "*s", },
{ "*t", },
{ "*u", },
{ "+p", },
{ "*w", },
{ "*c", },
{ "*q", },
{ "*z", },
{ "lC", "{", },
{ "ba", "|", },
{ "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", },
{ "+-", },
{ "sd", },
{ ">=", },
{ "mu", },
{ "pt", },
{ "pd", },
{ "bu", },
{ "di", },
{ "!=", },
{ "==", },
{ "~=", "~~", },
{ 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", "sqrt", },
{ "md", },
{ "no", },
{ "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", "braceex", "bv", },
{ 0, },
{ "ra", },
{ "is", "integral", },
{ 0, },
{ 0, },
{ 0, },
{ "parenrighttp", },
{ "parenrightex", },
{ "parenrightbt", },
{ "bracketrighttp", "rc", },
{ "bracketrightex", },
{ "bracketrightbt", "rf", },
{ "bracerighttp", "rt", },
{ "bracerightmid", "rk", },
{ "bracerightbt", "rb", },
{ 0, },
}};
static void
load_standard_maps (void)
{
standard_maps_loaded = 1;
DviRegisterMap (&ISO8859_1_map);
DviRegisterMap (&Adobe_Symbol_map);
}