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