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