/contrib/groff/src/libs/libxutil/DviChar.c

https://bitbucket.org/freebsd/freebsd-head/ · C · 658 lines · 629 code · 23 blank · 6 comment · 17 complexity · 165d23c9812a6a998573f42f6c541eaa MD5 · raw file

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