DviChar.c revision 8c7c3c7e
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 if (!standard_maps_loaded) 30 load_standard_maps (); 31 for (struct map_list *m = world; m; m=m->next) 32 if (!strcmp (m->map->encoding, encoding)) 33 return m->map; 34 return NULL; 35} 36 37void 38DviRegisterMap (DviCharNameMap *map) 39{ 40 struct map_list *m; 41 42 if (!standard_maps_loaded) 43 load_standard_maps (); 44 for (m = world; m; m = m->next) 45 if (!strcmp (m->map->encoding, map->encoding)) 46 break; 47 if (!m) { 48 m = (struct map_list *) XtMalloc (sizeof *m); 49 m->next = world; 50 world = m; 51 } 52 dispose_hash (map); 53 m->map = map; 54 compute_hash (map); 55} 56 57static void 58dispose_hash (DviCharNameMap *map) 59{ 60 DviCharNameHash **buckets; 61 62 buckets = map->buckets; 63 for (int i = 0; i < DVI_HASH_SIZE; i++) { 64 DviCharNameHash *next; 65 66 for (DviCharNameHash *h = buckets[i]; h; h = next) { 67 next = h->next; 68 XtFree ((char *) h); 69 } 70 } 71} 72 73static int 74hash_name (const char *name) 75{ 76 int i = 0; 77 78 while (*name) 79 i = (i << 1) ^ *name++; 80 if (i < 0) 81 i = -i; 82 return i; 83} 84 85static void 86compute_hash (DviCharNameMap *map) 87{ 88 DviCharNameHash **buckets; 89 90 buckets = map->buckets; 91 for (int i = 0; i < DVI_HASH_SIZE; i++) 92 buckets[i] = NULL; 93 for (int c = 0; c < DVI_MAP_SIZE; c++) { 94 for (int s = 0; s < DVI_MAX_SYNONYMS; s++) { 95 DviCharNameHash *h; 96 int i; 97 98 if (!map->dvi_names[c][s]) 99 break; 100 i = hash_name (map->dvi_names[c][s]) % DVI_HASH_SIZE; 101 h = allocHash (); 102 h->next = buckets[i]; 103 buckets[i] = h; 104 h->name = map->dvi_names[c][s]; 105 h->position = c; 106 } 107 } 108} 109 110int 111DviCharIndex (DviCharNameMap *map, const char *name) 112{ 113 int i; 114 DviCharNameHash *h; 115 116 i = hash_name (name) % DVI_HASH_SIZE; 117 for (h = map->buckets[i]; h; h=h->next) 118 if (!strcmp (h->name, name)) 119 return h->position; 120 return -1; 121} 122 123static DviCharNameMap ISO8859_1_map = { 124 "iso8859-1", 125 0, 126{ 127{ NULL, /* 0 */}, 128{ NULL, /* 1 */}, 129{ NULL, /* 2 */}, 130{ NULL, /* 3 */}, 131{ NULL, /* 4 */}, 132{ NULL, /* 5 */}, 133{ NULL, /* 6 */}, 134{ NULL, /* 7 */}, 135{ NULL, /* 8 */}, 136{ NULL, /* 9 */}, 137{ NULL, /* 10 */}, 138{ NULL, /* 11 */}, 139{ NULL, /* 12 */}, 140{ NULL, /* 13 */}, 141{ NULL, /* 14 */}, 142{ NULL, /* 15 */}, 143{ NULL, /* 16 */}, 144{ NULL, /* 17 */}, 145{ NULL, /* 18 */}, 146{ NULL, /* 19 */}, 147{ NULL, /* 20 */}, 148{ NULL, /* 21 */}, 149{ NULL, /* 22 */}, 150{ NULL, /* 23 */}, 151{ NULL, /* 24 */}, 152{ NULL, /* 25 */}, 153{ NULL, /* 26 */}, 154{ NULL, /* 27 */}, 155{ NULL, /* 28 */}, 156{ NULL, /* 29 */}, 157{ NULL, /* 30 */}, 158{ NULL, /* 31 */}, 159{ NULL, /* 32 */}, 160{ "!", /* 33 */}, 161{ "\"", /* 34 */}, 162{ "#", /* 35 */}, 163{ "$", /* 36 */}, 164{ "%", /* 37 */}, 165{ "&", /* 38 */}, 166{ "'", /* 39 */}, 167{ "(", /* 40 */}, 168{ ")", /* 41 */}, 169{ "*", /* 42 */}, 170{ "+", /* 43 */}, 171{ ",", /* 44 */}, 172{ "-","\\-", /* 45 */}, 173{ ".", /* 46 */}, 174{ "/","sl", /* 47 */}, 175{ "0", /* 48 */}, 176{ "1", /* 49 */}, 177{ "2", /* 50 */}, 178{ "3", /* 51 */}, 179{ "4", /* 52 */}, 180{ "5", /* 53 */}, 181{ "6", /* 54 */}, 182{ "7", /* 55 */}, 183{ "8", /* 56 */}, 184{ "9", /* 57 */}, 185{ ":", /* 58 */}, 186{ ";", /* 59 */}, 187{ "<", /* 60 */}, 188{ "=","eq", /* 61 */}, 189{ ">", /* 62 */}, 190{ "?", /* 63 */}, 191{ "@", /* 64 */}, 192{ "A", /* 65 */}, 193{ "B", /* 66 */}, 194{ "C", /* 67 */}, 195{ "D", /* 68 */}, 196{ "E", /* 69 */}, 197{ "F", /* 70 */}, 198{ "G", /* 71 */}, 199{ "H", /* 72 */}, 200{ "I", /* 73 */}, 201{ "J", /* 74 */}, 202{ "K", /* 75 */}, 203{ "L", /* 76 */}, 204{ "M", /* 77 */}, 205{ "N", /* 78 */}, 206{ "O", /* 79 */}, 207{ "P", /* 80 */}, 208{ "Q", /* 81 */}, 209{ "R", /* 82 */}, 210{ "S", /* 83 */}, 211{ "T", /* 84 */}, 212{ "U", /* 85 */}, 213{ "V", /* 86 */}, 214{ "W", /* 87 */}, 215{ "X", /* 88 */}, 216{ "Y", /* 89 */}, 217{ "Z", /* 90 */}, 218{ "[", /* 91 */}, 219{ "\\", /* 92 */}, 220{ "]", /* 93 */}, 221{ "a^", /* 94 */}, 222{ "_","ru","ul", /* 95 */}, 223{ "`", /* 96 */}, 224{ "a", /* 97 */}, 225{ "b", /* 98 */}, 226{ "c", /* 99 */}, 227{ "d", /* 100 */}, 228{ "e", /* 101 */}, 229{ "f", /* 102 */}, 230{ "g", /* 103 */}, 231{ "h", /* 104 */}, 232{ "i", /* 105 */}, 233{ "j", /* 106 */}, 234{ "k", /* 107 */}, 235{ "l", /* 108 */}, 236{ "m", /* 109 */}, 237{ "n", /* 110 */}, 238{ "o", /* 111 */}, 239{ "p", /* 112 */}, 240{ "q", /* 113 */}, 241{ "r", /* 114 */}, 242{ "s", /* 115 */}, 243{ "t", /* 116 */}, 244{ "u", /* 117 */}, 245{ "v", /* 118 */}, 246{ "w", /* 119 */}, 247{ "x", /* 120 */}, 248{ "y", /* 121 */}, 249{ "z", /* 122 */}, 250{ "{", /* 123 */}, 251{ "|","or" /* 124 */}, 252{ "}", /* 125 */}, 253{ "a~","ap" /* 126 */}, 254{ NULL, /* 127 */}, 255{ NULL, /* 128 */}, 256{ NULL, /* 129 */}, 257{ NULL, /* 130 */}, 258{ NULL, /* 131 */}, 259{ NULL, /* 132 */}, 260{ NULL, /* 133 */}, 261{ NULL, /* 134 */}, 262{ NULL, /* 135 */}, 263{ NULL, /* 136 */}, 264{ NULL, /* 137 */}, 265{ NULL, /* 138 */}, 266{ NULL, /* 139 */}, 267{ NULL, /* 140 */}, 268{ NULL, /* 141 */}, 269{ NULL, /* 142 */}, 270{ NULL, /* 143 */}, 271{ NULL, /* 144 */}, 272{ NULL, /* 145 */}, 273{ NULL, /* 146 */}, 274{ NULL, /* 147 */}, 275{ NULL, /* 148 */}, 276{ NULL, /* 149 */}, 277{ NULL, /* 150 */}, 278{ NULL, /* 151 */}, 279{ NULL, /* 152 */}, 280{ NULL, /* 153 */}, 281{ NULL, /* 154 */}, 282{ NULL, /* 155 */}, 283{ NULL, /* 156 */}, 284{ NULL, /* 157 */}, 285{ NULL, /* 158 */}, 286{ NULL, /* 159 */}, 287{ NULL, /* 160 */}, 288{ "I!", /* 161 */}, 289{ "ct", /* 162 */}, 290{ "po", /* 163 */}, 291{ "cu", /* 164 */}, 292{ "$J", /* 165 */}, 293{ NULL, /* 166 */}, 294{ "sc", /* 167 */}, 295{ NULL, /* 168 */}, 296{ "co", /* 169 */}, 297{ NULL, /* 170 */}, 298{ "d<", /* 171 */}, 299{ "no", /* 172 */}, 300{ "hy", /* 173 */}, 301{ "rg", /* 174 */}, 302{ "ma", /* 175 */}, 303{ "de", /* 176 */}, 304{ "+-", /* 177 */}, 305{ NULL, /* 178 */}, 306{ NULL, /* 179 */}, 307{ "aa", /* 180 */}, 308{ "*m", /* 181 */}, 309{ "pp", /* 182 */}, 310{ NULL, /* 183 */}, 311{ "cd", /* 184 */}, 312{ NULL, /* 185 */}, 313{ NULL, /* 186 */}, 314{ "d>", /* 187 */}, 315{ "14", /* 188 */}, 316{ "12", /* 189 */}, 317{ "34", /* 190 */}, 318{ "I?", /* 191 */}, 319{ NULL, /* 192 */}, 320{ NULL, /* 193 */}, 321{ NULL, /* 194 */}, 322{ NULL, /* 195 */}, 323{ NULL, /* 196 */}, 324{ NULL, /* 197 */}, 325{ "AE", /* 198 */}, 326{ NULL, /* 199 */}, 327{ NULL, /* 200 */}, 328{ NULL, /* 201 */}, 329{ NULL, /* 202 */}, 330{ NULL, /* 203 */}, 331{ NULL, /* 204 */}, 332{ NULL, /* 205 */}, 333{ NULL, /* 206 */}, 334{ NULL, /* 207 */}, 335{ NULL, /* 208 */}, 336{ NULL, /* 209 */}, 337{ NULL, /* 210 */}, 338{ NULL, /* 211 */}, 339{ NULL, /* 212 */}, 340{ NULL, /* 213 */}, 341{ NULL, /* 214 */}, 342{ "mu", /* 215 */}, 343{ "O/", /* 216 */}, 344{ NULL, /* 217 */}, 345{ NULL, /* 218 */}, 346{ NULL, /* 219 */}, 347{ NULL, /* 220 */}, 348{ NULL, /* 221 */}, 349{ NULL, /* 222 */}, 350{ "ss", /* 223 */}, 351{ NULL, /* 224 */}, 352{ NULL, /* 225 */}, 353{ NULL, /* 226 */}, 354{ NULL, /* 227 */}, 355{ NULL, /* 228 */}, 356{ NULL, /* 229 */}, 357{ "ae", /* 230 */}, 358{ NULL, /* 231 */}, 359{ NULL, /* 232 */}, 360{ NULL, /* 233 */}, 361{ NULL, /* 234 */}, 362{ NULL, /* 235 */}, 363{ NULL, /* 236 */}, 364{ NULL, /* 237 */}, 365{ NULL, /* 238 */}, 366{ NULL, /* 239 */}, 367{ NULL, /* 240 */}, 368{ NULL, /* 241 */}, 369{ NULL, /* 242 */}, 370{ NULL, /* 243 */}, 371{ NULL, /* 244 */}, 372{ NULL, /* 245 */}, 373{ NULL, /* 246 */}, 374{ NULL, /* 247 */}, 375{ NULL, /* 248 */}, 376{ NULL, /* 249 */}, 377{ NULL, /* 250 */}, 378{ NULL, /* 251 */}, 379{ NULL, /* 252 */}, 380{ NULL, /* 253 */}, 381{ NULL, /* 254 */}, 382{ NULL, /* 255 */}, 383}, 384{ 385{ "fi", "fi", }, 386{ "fl", "fl", }, 387{ "ff", "ff", }, 388{ "Fi", "ffi", }, 389{ "Fl", "ffl", }, 390{ NULL, NULL, }, 391}, 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}; 661 662static void 663load_standard_maps (void) 664{ 665 standard_maps_loaded = 1; 666 DviRegisterMap (&ISO8859_1_map); 667 DviRegisterMap (&Adobe_Symbol_map); 668} 669 670