1 /* $NetBSD: DviChar.c,v 1.1.1.1 2016/01/13 18:41:48 christos Exp $ */ 2 3 /* 4 * DviChar.c 5 * 6 * Map DVI (ditroff output) character names to 7 * font indexes and back 8 */ 9 10 #include <stdlib.h> 11 #include <string.h> 12 #include "DviChar.h" 13 14 extern char *xmalloc(int); 15 16 #define allocHash() ((DviCharNameHash *) xmalloc (sizeof (DviCharNameHash))) 17 18 struct map_list { 19 struct map_list *next; 20 DviCharNameMap *map; 21 }; 22 23 static struct map_list *world; 24 25 static int standard_maps_loaded = 0; 26 static void load_standard_maps (void); 27 static int hash_name (const char *); 28 static void dispose_hash(DviCharNameMap *); 29 static void compute_hash(DviCharNameMap *); 30 31 DviCharNameMap * 32 DviFindMap (char *encoding) 33 { 34 struct map_list *m; 35 36 if (!standard_maps_loaded) 37 load_standard_maps (); 38 for (m = world; m; m=m->next) 39 if (!strcmp (m->map->encoding, encoding)) 40 return m->map; 41 return 0; 42 } 43 44 void 45 DviRegisterMap (DviCharNameMap *map) 46 { 47 struct map_list *m; 48 49 if (!standard_maps_loaded) 50 load_standard_maps (); 51 for (m = world; m; m = m->next) 52 if (!strcmp (m->map->encoding, map->encoding)) 53 break; 54 if (!m) { 55 m = (struct map_list *) xmalloc (sizeof *m); 56 m->next = world; 57 world = m; 58 } 59 dispose_hash (map); 60 m->map = map; 61 compute_hash (map); 62 } 63 64 static void 65 dispose_hash (DviCharNameMap *map) 66 { 67 DviCharNameHash **buckets; 68 DviCharNameHash *h, *next; 69 int i; 70 71 buckets = map->buckets; 72 for (i = 0; i < DVI_HASH_SIZE; i++) { 73 for (h = buckets[i]; h; h=next) { 74 next = h->next; 75 free (h); 76 } 77 } 78 } 79 80 static int 81 hash_name (const char *name) 82 { 83 int i = 0; 84 85 while (*name) 86 i = (i << 1) ^ *name++; 87 if (i < 0) 88 i = -i; 89 return i; 90 } 91 92 static void 93 compute_hash (DviCharNameMap *map) 94 { 95 DviCharNameHash **buckets; 96 int c, s, i; 97 DviCharNameHash *h; 98 99 buckets = map->buckets; 100 for (i = 0; i < DVI_HASH_SIZE; i++) 101 buckets[i] = 0; 102 for (c = 0; c < DVI_MAP_SIZE; c++) 103 for (s = 0; s < DVI_MAX_SYNONYMS; s++) { 104 if (!map->dvi_names[c][s]) 105 break; 106 i = hash_name (map->dvi_names[c][s]) % DVI_HASH_SIZE; 107 h = allocHash (); 108 h->next = buckets[i]; 109 buckets[i] = h; 110 h->name = map->dvi_names[c][s]; 111 h->position = c; 112 } 113 114 } 115 116 int 117 DviCharIndex (DviCharNameMap *map, const char *name) 118 { 119 int i; 120 DviCharNameHash *h; 121 122 i = hash_name (name) % DVI_HASH_SIZE; 123 for (h = map->buckets[i]; h; h=h->next) 124 if (!strcmp (h->name, name)) 125 return h->position; 126 return -1; 127 } 128 129 static DviCharNameMap ISO8859_1_map = { 130 "iso8859-1", 131 0, 132 { 133 { 0, /* 0 */}, 134 { 0, /* 1 */}, 135 { 0, /* 2 */}, 136 { 0, /* 3 */}, 137 { 0, /* 4 */}, 138 { 0, /* 5 */}, 139 { 0, /* 6 */}, 140 { 0, /* 7 */}, 141 { 0, /* 8 */}, 142 { 0, /* 9 */}, 143 { 0, /* 10 */}, 144 { 0, /* 11 */}, 145 { 0, /* 12 */}, 146 { 0, /* 13 */}, 147 { 0, /* 14 */}, 148 { 0, /* 15 */}, 149 { 0, /* 16 */}, 150 { 0, /* 17 */}, 151 { 0, /* 18 */}, 152 { 0, /* 19 */}, 153 { 0, /* 20 */}, 154 { 0, /* 21 */}, 155 { 0, /* 22 */}, 156 { 0, /* 23 */}, 157 { 0, /* 24 */}, 158 { 0, /* 25 */}, 159 { 0, /* 26 */}, 160 { 0, /* 27 */}, 161 { 0, /* 28 */}, 162 { 0, /* 29 */}, 163 { 0, /* 30 */}, 164 { 0, /* 31 */}, 165 { 0, /* 32 */}, 166 { "!", /* 33 */}, 167 { "\"", "dq", /* 34 */}, 168 { "#", "sh", /* 35 */}, 169 { "$", "Do", /* 36 */}, 170 { "%", /* 37 */}, 171 { "&", /* 38 */}, 172 { "'", "cq", /* 39 */}, 173 { "(", /* 40 */}, 174 { ")", /* 41 */}, 175 { "*", /* 42 */}, 176 { "+", /* 43 */}, 177 { ",", /* 44 */}, 178 { "\\-", /* 45 */}, 179 { ".", /* 46 */}, 180 { "/", "sl", /* 47 */}, 181 { "0", /* 48 */}, 182 { "1", /* 49 */}, 183 { "2", /* 50 */}, 184 { "3", /* 51 */}, 185 { "4", /* 52 */}, 186 { "5", /* 53 */}, 187 { "6", /* 54 */}, 188 { "7", /* 55 */}, 189 { "8", /* 56 */}, 190 { "9", /* 57 */}, 191 { ":", /* 58 */}, 192 { ";", /* 59 */}, 193 { "<", /* 60 */}, 194 { "=", /* 61 */}, 195 { ">", /* 62 */}, 196 { "?", /* 63 */}, 197 { "@", "at", /* 64 */}, 198 { "A", /* 65 */}, 199 { "B", /* 66 */}, 200 { "C", /* 67 */}, 201 { "D", /* 68 */}, 202 { "E", /* 69 */}, 203 { "F", /* 70 */}, 204 { "G", /* 71 */}, 205 { "H", /* 72 */}, 206 { "I", /* 73 */}, 207 { "J", /* 74 */}, 208 { "K", /* 75 */}, 209 { "L", /* 76 */}, 210 { "M", /* 77 */}, 211 { "N", /* 78 */}, 212 { "O", /* 79 */}, 213 { "P", /* 80 */}, 214 { "Q", /* 81 */}, 215 { "R", /* 82 */}, 216 { "S", /* 83 */}, 217 { "T", /* 84 */}, 218 { "U", /* 85 */}, 219 { "V", /* 86 */}, 220 { "W", /* 87 */}, 221 { "X", /* 88 */}, 222 { "Y", /* 89 */}, 223 { "Z", /* 90 */}, 224 { "[", "lB", /* 91 */}, 225 { "\\", "rs", /* 92 */}, 226 { "]", "rB", /* 93 */}, 227 { "^", "a^", "ha", /* 94 */}, 228 { "_", /* 95 */}, 229 { "`", "oq", /* 96 */}, 230 { "a", /* 97 */}, 231 { "b", /* 98 */}, 232 { "c", /* 99 */}, 233 { "d", /* 100 */}, 234 { "e", /* 101 */}, 235 { "f", /* 102 */}, 236 { "g", /* 103 */}, 237 { "h", /* 104 */}, 238 { "i", /* 105 */}, 239 { "j", /* 106 */}, 240 { "k", /* 107 */}, 241 { "l", /* 108 */}, 242 { "m", /* 109 */}, 243 { "n", /* 110 */}, 244 { "o", /* 111 */}, 245 { "p", /* 112 */}, 246 { "q", /* 113 */}, 247 { "r", /* 114 */}, 248 { "s", /* 115 */}, 249 { "t", /* 116 */}, 250 { "u", /* 117 */}, 251 { "v", /* 118 */}, 252 { "w", /* 119 */}, 253 { "x", /* 120 */}, 254 { "y", /* 121 */}, 255 { "z", /* 122 */}, 256 { "{", "lC", /* 123 */}, 257 { "|", "ba", /* 124 */}, 258 { "}", "rC", /* 125 */}, 259 { "~", "a~", "ti", /* 126 */}, 260 { 0, /* 127 */}, 261 { 0, /* 128 */}, 262 { 0, /* 129 */}, 263 { 0, /* 130 */}, 264 { 0, /* 131 */}, 265 { 0, /* 132 */}, 266 { 0, /* 133 */}, 267 { 0, /* 134 */}, 268 { 0, /* 135 */}, 269 { 0, /* 136 */}, 270 { 0, /* 137 */}, 271 { 0, /* 138 */}, 272 { 0, /* 139 */}, 273 { 0, /* 140 */}, 274 { 0, /* 141 */}, 275 { 0, /* 142 */}, 276 { 0, /* 143 */}, 277 { 0, /* 144 */}, 278 { 0, /* 145 */}, 279 { 0, /* 146 */}, 280 { 0, /* 147 */}, 281 { 0, /* 148 */}, 282 { 0, /* 149 */}, 283 { 0, /* 150 */}, 284 { 0, /* 151 */}, 285 { 0, /* 152 */}, 286 { 0, /* 153 */}, 287 { 0, /* 154 */}, 288 { 0, /* 155 */}, 289 { 0, /* 156 */}, 290 { 0, /* 157 */}, 291 { 0, /* 158 */}, 292 { 0, /* 159 */}, 293 { 0, /* 160 */}, 294 { "r!", /* 161 */}, 295 { "ct", /* 162 */}, 296 { "Po", /* 163 */}, 297 { "Cs", /* 164 */}, 298 { "Ye", /* 165 */}, 299 { "bb", /* 166 */}, 300 { "sc", /* 167 */}, 301 { "ad", /* 168 */}, 302 { "co", /* 169 */}, 303 { "Of", /* 170 */}, 304 { "Fo", /* 171 */}, 305 { "tno", /* 172 */}, 306 { "-", "hy", /* 173 */}, 307 { "rg", /* 174 */}, 308 { "a-", /* 175 */}, 309 { "de", /* 176 */}, 310 { "t+-", /* 177 */}, 311 { "S2", /* 178 */}, 312 { "S3", /* 179 */}, 313 { "aa", /* 180 */}, 314 { "mc", /* 181 */}, 315 { "ps", /* 182 */}, 316 { "pc", /* 183 */}, 317 { "ac", /* 184 */}, 318 { "S1", /* 185 */}, 319 { "Om", /* 186 */}, 320 { "Fc", /* 187 */}, 321 { "14", /* 188 */}, 322 { "12", /* 189 */}, 323 { "34", /* 190 */}, 324 { "r?", /* 191 */}, 325 { "`A", /* 192 */}, 326 { "'A", /* 193 */}, 327 { "^A", /* 194 */}, 328 { "~A", /* 195 */}, 329 { ":A", /* 196 */}, 330 { "oA", /* 197 */}, 331 { "AE", /* 198 */}, 332 { ",C", /* 199 */}, 333 { "`E", /* 200 */}, 334 { "'E", /* 201 */}, 335 { "^E", /* 202 */}, 336 { ":E", /* 203 */}, 337 { "`I", /* 204 */}, 338 { "'I", /* 205 */}, 339 { "^I", /* 206 */}, 340 { ":I", /* 207 */}, 341 { "-D", /* 208 */}, 342 { "~N", /* 209 */}, 343 { "`O", /* 210 */}, 344 { "'O", /* 211 */}, 345 { "^O", /* 212 */}, 346 { "~O", /* 213 */}, 347 { ":O", /* 214 */}, 348 { "tmu", /* 215 */}, 349 { "/O", /* 216 */}, 350 { "`U", /* 217 */}, 351 { "'U", /* 218 */}, 352 { "^U", /* 219 */}, 353 { ":U", /* 220 */}, 354 { "'Y", /* 221 */}, 355 { "TP", /* 222 */}, 356 { "ss", /* 223 */}, 357 { "`a", /* 224 */}, 358 { "'a", /* 225 */}, 359 { "^a", /* 226 */}, 360 { "~a", /* 227 */}, 361 { ":a", /* 228 */}, 362 { "oa", /* 229 */}, 363 { "ae", /* 230 */}, 364 { ",c", /* 231 */}, 365 { "`e", /* 232 */}, 366 { "'e", /* 233 */}, 367 { "^e", /* 234 */}, 368 { ":e", /* 235 */}, 369 { "`i", /* 236 */}, 370 { "'i", /* 237 */}, 371 { "^i", /* 238 */}, 372 { ":i", /* 239 */}, 373 { "Sd", /* 240 */}, 374 { "~n", /* 241 */}, 375 { "`o", /* 242 */}, 376 { "'o", /* 243 */}, 377 { "^o", /* 244 */}, 378 { "~o", /* 245 */}, 379 { ":o", /* 246 */}, 380 { "tdi", /* 247 */}, 381 { "/o", /* 248 */}, 382 { "`u", /* 249 */}, 383 { "'u", /* 250 */}, 384 { "^u", /* 251 */}, 385 { ":u", /* 252 */}, 386 { "'y", /* 253 */}, 387 { "Tp", /* 254 */}, 388 { ":y", /* 255 */}, 389 }}; 390 391 static DviCharNameMap Adobe_Symbol_map = { 392 "adobe-fontspecific", 393 1, 394 { 395 { 0, /* 0 */}, 396 { 0, /* 1 */}, 397 { 0, /* 2 */}, 398 { 0, /* 3 */}, 399 { 0, /* 4 */}, 400 { 0, /* 5 */}, 401 { 0, /* 6 */}, 402 { 0, /* 7 */}, 403 { 0, /* 8 */}, 404 { 0, /* 9 */}, 405 { 0, /* 10 */}, 406 { 0, /* 11 */}, 407 { 0, /* 12 */}, 408 { 0, /* 13 */}, 409 { 0, /* 14 */}, 410 { 0, /* 15 */}, 411 { 0, /* 16 */}, 412 { 0, /* 17 */}, 413 { 0, /* 18 */}, 414 { 0, /* 19 */}, 415 { 0, /* 20 */}, 416 { 0, /* 21 */}, 417 { 0, /* 22 */}, 418 { 0, /* 23 */}, 419 { 0, /* 24 */}, 420 { 0, /* 25 */}, 421 { 0, /* 26 */}, 422 { 0, /* 27 */}, 423 { 0, /* 28 */}, 424 { 0, /* 29 */}, 425 { 0, /* 30 */}, 426 { 0, /* 31 */}, 427 { 0, /* 32 */}, 428 { "!", /* 33 */}, 429 { "fa", /* 34 */}, 430 { "#", "sh", /* 35 */}, 431 { "te", /* 36 */}, 432 { "%", /* 37 */}, 433 { "&", /* 38 */}, 434 { "st", /* 39 */}, 435 { "(", /* 40 */}, 436 { ")", /* 41 */}, 437 { "**", /* 42 */}, 438 { "+", "pl", /* 43 */}, 439 { ",", /* 44 */}, 440 { "\\-", "mi", /* 45 */}, 441 { ".", /* 46 */}, 442 { "/", "sl", /* 47 */}, 443 { "0", /* 48 */}, 444 { "1", /* 49 */}, 445 { "2", /* 50 */}, 446 { "3", /* 51 */}, 447 { "4", /* 52 */}, 448 { "5", /* 53 */}, 449 { "6", /* 54 */}, 450 { "7", /* 55 */}, 451 { "8", /* 56 */}, 452 { "9", /* 57 */}, 453 { ":", /* 58 */}, 454 { ";", /* 59 */}, 455 { "<", /* 60 */}, 456 { "=", "eq", /* 61 */}, 457 { ">", /* 62 */}, 458 { "?", /* 63 */}, 459 { "=~", /* 64 */}, 460 { "*A", /* 65 */}, 461 { "*B", /* 66 */}, 462 { "*X", /* 67 */}, 463 { "*D", /* 68 */}, 464 { "*E", /* 69 */}, 465 { "*F", /* 70 */}, 466 { "*G", /* 71 */}, 467 { "*Y", /* 72 */}, 468 { "*I", /* 73 */}, 469 { "+h", /* 74 */}, 470 { "*K", /* 75 */}, 471 { "*L", /* 76 */}, 472 { "*M", /* 77 */}, 473 { "*N", /* 78 */}, 474 { "*O", /* 79 */}, 475 { "*P", /* 80 */}, 476 { "*H", /* 81 */}, 477 { "*R", /* 82 */}, 478 { "*S", /* 83 */}, 479 { "*T", /* 84 */}, 480 { 0, /* 85 */}, 481 { "ts", /* 86 */}, 482 { "*W", /* 87 */}, 483 { "*C", /* 88 */}, 484 { "*Q", /* 89 */}, 485 { "*Z", /* 90 */}, 486 { "[", "lB", /* 91 */}, 487 { "tf", "3d", /* 92 */}, 488 { "]", "rB", /* 93 */}, 489 { "pp", /* 94 */}, 490 { "_", /* 95 */}, 491 { "radicalex", /* 96 */}, 492 { "*a", /* 97 */}, 493 { "*b", /* 98 */}, 494 { "*x", /* 99 */}, 495 { "*d", /* 100 */}, 496 { "*e", /* 101 */}, 497 { "*f", /* 102 */}, 498 { "*g", /* 103 */}, 499 { "*y", /* 104 */}, 500 { "*i", /* 105 */}, 501 { "+f", /* 106 */}, 502 { "*k", /* 107 */}, 503 { "*l", /* 108 */}, 504 { "*m", /* 109 */}, 505 { "*n", /* 110 */}, 506 { "*o", /* 111 */}, 507 { "*p", /* 112 */}, 508 { "*h", /* 113 */}, 509 { "*r", /* 114 */}, 510 { "*s", /* 115 */}, 511 { "*t", /* 116 */}, 512 { "*u", /* 117 */}, 513 { "+p", /* 118 */}, 514 { "*w", /* 119 */}, 515 { "*c", /* 120 */}, 516 { "*q", /* 121 */}, 517 { "*z", /* 122 */}, 518 { "lC", "{", /* 123 */}, 519 { "ba", "|", /* 124 */}, 520 { "rC", "}", /* 125 */}, 521 { "ap", /* 126 */}, 522 { 0, /* 127 */}, 523 { 0, /* 128 */}, 524 { 0, /* 129 */}, 525 { 0, /* 130 */}, 526 { 0, /* 131 */}, 527 { 0, /* 132 */}, 528 { 0, /* 133 */}, 529 { 0, /* 134 */}, 530 { 0, /* 135 */}, 531 { 0, /* 136 */}, 532 { 0, /* 137 */}, 533 { 0, /* 138 */}, 534 { 0, /* 139 */}, 535 { 0, /* 140 */}, 536 { 0, /* 141 */}, 537 { 0, /* 142 */}, 538 { 0, /* 143 */}, 539 { 0, /* 144 */}, 540 { 0, /* 145 */}, 541 { 0, /* 146 */}, 542 { 0, /* 147 */}, 543 { 0, /* 148 */}, 544 { 0, /* 149 */}, 545 { 0, /* 150 */}, 546 { 0, /* 151 */}, 547 { 0, /* 152 */}, 548 { 0, /* 153 */}, 549 { 0, /* 154 */}, 550 { 0, /* 155 */}, 551 { 0, /* 156 */}, 552 { 0, /* 157 */}, 553 { 0, /* 158 */}, 554 { 0, /* 159 */}, 555 { 0, /* 160 */}, 556 { "*U", /* 161 */}, 557 { "fm", /* 162 */}, 558 { "<=", /* 163 */}, 559 { "f/", /* 164 */}, 560 { "if", /* 165 */}, 561 { "Fn", /* 166 */}, 562 { "CL", /* 167 */}, 563 { "DI", /* 168 */}, 564 { "HE", /* 169 */}, 565 { "SP", /* 170 */}, 566 { "<>", /* 171 */}, 567 { "<-", /* 172 */}, 568 { "ua", "arrowverttp", /* 173 */}, 569 { "->", /* 174 */}, 570 { "da", "arrowvertbt", /* 175 */}, 571 { "de", /* 176 */}, 572 { "+-", /* 177 */}, 573 { "sd", /* 178 */}, 574 { ">=", /* 179 */}, 575 { "mu", /* 180 */}, 576 { "pt", /* 181 */}, 577 { "pd", /* 182 */}, 578 { "bu", /* 183 */}, 579 { "di", /* 184 */}, 580 { "!=", /* 185 */}, 581 { "==", /* 186 */}, 582 { "~=", "~~", /* 187 */}, 583 { 0, /* 188 */}, 584 { "arrowvertex", /* 189 */}, 585 { "an", /* 190 */}, 586 { "CR", /* 191 */}, 587 { "Ah", /* 192 */}, 588 { "Im", /* 193 */}, 589 { "Re", /* 194 */}, 590 { "wp", /* 195 */}, 591 { "c*", /* 196 */}, 592 { "c+", /* 197 */}, 593 { "es", /* 198 */}, 594 { "ca", /* 199 */}, 595 { "cu", /* 200 */}, 596 { "sp", /* 201 */}, 597 { "ip", /* 202 */}, 598 { "nb", /* 203 */}, 599 { "sb", /* 204 */}, 600 { "ib", /* 205 */}, 601 { "mo", /* 206 */}, 602 { "nm", /* 207 */}, 603 { "/_", /* 208 */}, 604 { "gr", /* 209 */}, 605 { "rg", /* 210 */}, 606 { "co", /* 211 */}, 607 { "tm", /* 212 */}, 608 { 0, /* 213 */}, 609 { "sr", "sqrt", /* 214 */}, 610 { "md", /* 215 */}, 611 { "no", /* 216 */}, 612 { "AN", /* 217 */}, 613 { "OR", /* 218 */}, 614 { "hA", /* 219 */}, 615 { "lA", /* 220 */}, 616 { "uA", /* 221 */}, 617 { "rA", /* 222 */}, 618 { "dA", /* 223 */}, 619 { "lz", /* 224 */}, 620 { "la", /* 225 */}, 621 { 0, /* 226 */}, 622 { 0, /* 227 */}, 623 { 0, /* 228 */}, 624 { 0, /* 229 */}, 625 { "parenlefttp", /* 230 */}, 626 { "parenleftex", /* 231 */}, 627 { "parenleftbt", /* 232 */}, 628 { "bracketlefttp", "lc", /* 233 */}, 629 { "bracketleftex", /* 234 */}, 630 { "bracketleftbt", "lf", /* 235 */}, 631 { "bracelefttp", "lt", /* 236 */}, 632 { "braceleftmid", "lk", /* 237 */}, 633 { "braceleftbt", "lb", /* 238 */}, 634 { "bracerightex", "braceleftex", "braceex", "bv", /* 239 */}, 635 { 0, /* 240 */}, 636 { "ra", /* 241 */}, 637 { "is", "integral", /* 242 */}, 638 { 0, /* 243 */}, 639 { 0, /* 244 */}, 640 { 0, /* 245 */}, 641 { "parenrighttp", /* 246 */}, 642 { "parenrightex", /* 247 */}, 643 { "parenrightbt", /* 248 */}, 644 { "bracketrighttp", "rc", /* 249 */}, 645 { "bracketrightex", /* 250 */}, 646 { "bracketrightbt", "rf", /* 251 */}, 647 { "bracerighttp", "rt", /* 252 */}, 648 { "bracerightmid", "rk", /* 253 */}, 649 { "bracerightbt", "rb", /* 254 */}, 650 { 0, /* 255 */}, 651 }}; 652 653 654 static void 655 load_standard_maps (void) 656 { 657 standard_maps_loaded = 1; 658 DviRegisterMap (&ISO8859_1_map); 659 DviRegisterMap (&Adobe_Symbol_map); 660 } 661