/* * DviChar.c * * Map DVI (ditroff output) character names to * font indexes and back */ #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, /* 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 */}, { "\"","dq", /* 34 */}, { "#","sh", /* 35 */}, { "$","Do", /* 36 */}, { "%", /* 37 */}, { "&", /* 38 */}, { "'","cq", /* 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 */}, { "@","at", /* 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 */}, { "[","lB", /* 91 */}, { "\\","rs", /* 92 */}, { "]","rB", /* 93 */}, { "^","a^","ha" /* 94 */}, { "_", /* 95 */}, { "`","oq", /* 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 */}, { "{","lC", /* 123 */}, { "|","or","ba" /* 124 */}, { "}","rC", /* 125 */}, { "~","a~","ap","ti" /* 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 */}, { "r!", "\241", /* 161 */}, { "ct", "\242", /* 162 */}, { "Po", "\243", /* 163 */}, { "Cs", "\244", /* 164 */}, { "Ye", "\245", /* 165 */}, { "bb", "\246", /* 166 */}, { "sc", "\247", /* 167 */}, { "ad", "\250", /* 168 */}, { "co", "\251", /* 169 */}, { "Of", "\252", /* 170 */}, { "Fo", "\253", /* 171 */}, { "no", "\254", /* 172 */}, { "-", "hy", "\255" /* 173 */}, { "rg", "\256", /* 174 */}, { "a-", "\257", /* 175 */}, { "de", "\260", /* 176 */}, { "+-", "\261", /* 177 */}, { "S2", "\262", /* 178 */}, { "S3", "\263", /* 179 */}, { "aa", "\264", /* 180 */}, { "mc", "\265", /* 181 */}, { "ps", "\266", /* 182 */}, { "pc", "\267", /* 183 */}, { "ac", "\270", /* 184 */}, { "S1", "\271", /* 185 */}, { "Om", "\272", /* 186 */}, { "Fc", "\273", /* 187 */}, { "14", "\274", /* 188 */}, { "12", "\275", /* 189 */}, { "34", "\276", /* 190 */}, { "r?", "\277", /* 191 */}, { "`A", "\300", /* 192 */}, { "'A", "\301", /* 193 */}, { "^A", "\302", /* 194 */}, { "~A", "\303", /* 195 */}, { ":A", "\304", /* 196 */}, { "oA", "\305", /* 197 */}, { "AE", "\306", /* 198 */}, { ",C", "\307", /* 199 */}, { "`E", "\310", /* 200 */}, { "'E", "\311", /* 201 */}, { "^E", "\312", /* 202 */}, { ":E", "\313", /* 203 */}, { "`I", "\314", /* 204 */}, { "'I", "\315", /* 205 */}, { "^I", "\316", /* 206 */}, { ":I", "\317", /* 207 */}, { "-D", "\320", /* 208 */}, { "~N", "\321", /* 209 */}, { "`O", "\322", /* 210 */}, { "'O", "\323", /* 211 */}, { "^O", "\324", /* 212 */}, { "~O", "\325", /* 213 */}, { ":O", "\326", /* 214 */}, { "mu", "\327", /* 215 */}, { "/O", "\330", /* 216 */}, { "`U", "\331", /* 217 */}, { "'U", "\332", /* 218 */}, { "^U", "\333", /* 219 */}, { ":U", "\334", /* 220 */}, { "'Y", "\335", /* 221 */}, { "TP", "\336", /* 222 */}, { "ss", "\337", /* 223 */}, { "`a", "\340", /* 224 */}, { "'a", "\341", /* 225 */}, { "^a", "\342", /* 226 */}, { "~a", "\343", /* 227 */}, { ":a", "\344", /* 228 */}, { "oa", "\345", /* 229 */}, { "ae", "\346", /* 230 */}, { ",c", "\347", /* 231 */}, { "`e", "\350", /* 232 */}, { "'e", "\351", /* 233 */}, { "^e", "\352", /* 234 */}, { ":e", "\353", /* 235 */}, { "`i", "\354", /* 236 */}, { "'i", "\355", /* 237 */}, { "^i", "\356", /* 238 */}, { ":i", "\357", /* 239 */}, { "Sd", "\360", /* 240 */}, { "~n", "\361", /* 241 */}, { "`o", "\362", /* 242 */}, { "'o", "\363", /* 243 */}, { "^o", "\364", /* 244 */}, { "~o", "\365", /* 245 */}, { ":o", "\366", /* 246 */}, { "di", "\367", /* 247 */}, { "/o", "\370", /* 248 */}, { "`u", "\371", /* 249 */}, { "'u", "\372", /* 250 */}, { "^u", "\373", /* 251 */}, { ":u", "\374", /* 252 */}, { "'y", "\375", /* 253 */}, { "Tp", "\376", /* 254 */}, { ":y", "\377", /* 255 */}, }}; 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 */}, { "#", "sh", /* 35 */}, { "te", /* 36 */}, { "%", /* 37 */}, { "&", /* 38 */}, { "st", /* 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 */}, { "*X", /* 67 */}, { "*D", /* 68 */}, { "*E", /* 69 */}, { "*F", /* 70 */}, { "*G", /* 71 */}, { "*Y", /* 72 */}, { "*I", /* 73 */}, { "+h", /* 74 */}, { "*K", /* 75 */}, { "*L", /* 76 */}, { "*M", /* 77 */}, { "*N", /* 78 */}, { "*O", /* 79 */}, { "*P", /* 80 */}, { "*H", /* 81 */}, { "*R", /* 82 */}, { "*S", /* 83 */}, { "*T", /* 84 */}, { 0, /* 85 */}, { "ts", /* 86 */}, { "*W", /* 87 */}, { "*C", /* 88 */}, { "*Q", /* 89 */}, { "*Z", /* 90 */}, { "[", "lB", /* 91 */}, { "tf", "3d", /* 92 */}, { "]", "rB", /* 93 */}, { "pp", /* 94 */}, { "_", /* 95 */}, { "radicalex", /* 96 */}, { "*a", /* 97 */}, { "*b", /* 98 */}, { "*x", /* 99 */}, { "*d", /* 100 */}, { "*e", /* 101 */}, { "*f", /* 102 */}, { "*g", /* 103 */}, { "*y", /* 104 */}, { "*i", /* 105 */}, { "+f", /* 106 */}, { "*k", /* 107 */}, { "*l", /* 108 */}, { "*m", "\265", /* 109 */}, { "*n", /* 110 */}, { "*o", /* 111 */}, { "*p", /* 112 */}, { "*h", /* 113 */}, { "*r", /* 114 */}, { "*s", /* 115 */}, { "*t", /* 116 */}, { "*u", /* 117 */}, { "+p", /* 118 */}, { "*w", /* 119 */}, { "*c", /* 120 */}, { "*q", /* 121 */}, { "*z", /* 122 */}, { "lC", "{", /* 123 */}, { "ba", "or", "|", /* 124 */}, { "rC", "}", /* 125 */}, { "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 */}, { "*U", /* 161 */}, { "fm", /* 162 */}, { "<=", /* 163 */}, { "f/", /* 164 */}, { "if", /* 165 */}, { "Fn", /* 166 */}, { "CL", /* 167 */}, { "DI", /* 168 */}, { "HE", /* 169 */}, { "SP", /* 170 */}, { "<>", /* 171 */}, { "<-", /* 172 */}, { "ua", "arrowverttp" /* 173 */}, { "->", /* 174 */}, { "da", "arrowvertbt" /* 175 */}, { "de", "\260", /* 176 */}, { "+-", "\261", /* 177 */}, { "sd", /* 178 */}, { ">=", /* 179 */}, { "mu", "\327", /* 180 */}, { "pt", /* 181 */}, { "pd", /* 182 */}, { "bu", /* 183 */}, { "di", "\367", /* 184 */}, { "!=", /* 185 */}, { "==", /* 186 */}, { "~=", "~~", /* 187 */}, { 0, /* 188 */}, { "arrowvertex", /* 189 */}, { "an", /* 190 */}, { "CR", /* 191 */}, { "Ah", /* 192 */}, { "Im", /* 193 */}, { "Re", /* 194 */}, { "wp", /* 195 */}, { "c*", /* 196 */}, { "c+", /* 197 */}, { "es", /* 198 */}, { "ca", /* 199 */}, { "cu", /* 200 */}, { "sp", /* 201 */}, { "ip", /* 202 */}, { "nb", /* 203 */}, { "sb", /* 204 */}, { "ib", /* 205 */}, { "mo", /* 206 */}, { "nm", /* 207 */}, { "/_", /* 208 */}, { "gr", /* 209 */}, { "rg", /* 210 */}, { "co", /* 211 */}, { "tm", /* 212 */}, { 0, /* 213 */}, { "sr", /* 214 */}, { "md", /* 215 */}, { "no", "\254", /* 216 */}, { "AN", /* 217 */}, { "OR", /* 218 */}, { "hA", /* 219 */}, { "lA", /* 220 */}, { "uA", /* 221 */}, { "rA", /* 222 */}, { "dA", /* 223 */}, { "lz", /* 224 */}, { "la", /* 225 */}, { 0, /* 226 */}, { 0, /* 227 */}, { 0, /* 228 */}, { 0, /* 229 */}, { "parenlefttp", /* 230 */}, { "parenleftex", /* 231 */}, { "parenleftbt", /* 232 */}, { "bracketlefttp", "lc", /* 233 */}, { "bracketleftex", /* 234 */}, { "bracketleftbt", "lf", /* 235 */}, { "bracelefttp", "lt", /* 236 */}, { "braceleftmid", "lk", /* 237 */}, { "braceleftbt", "lb", /* 238 */}, { "bracerightex", "braceleftex", "bv", /* 239 */}, { 0, /* 240 */}, { "ra", /* 241 */}, { "is", /* 242 */}, { 0, /* 243 */}, { 0, /* 244 */}, { 0, /* 245 */}, { "parenrighttp", /* 246 */}, { "parenrightex", /* 247 */}, { "parenrightbt", /* 248 */}, { "bracketrighttp", "rc", /* 249 */}, { "bracketrightex", /* 250 */}, { "bracketrightbt", "rf", /* 251 */}, { "bracerighttp", "rt" /* 252 */}, { "bracerightmid", "rk" /* 253 */}, { "bracerightbt", "rb" /* 254 */}, { 0, /* 255 */}, }}; static void load_standard_maps () { standard_maps_loaded = 1; DviRegisterMap (&ISO8859_1_map); DviRegisterMap (&Adobe_Symbol_map); }