/contrib/groff/src/utils/addftinfo/guess.cpp

https://bitbucket.org/freebsd/freebsd-head/ · C++ · 490 lines · 467 code · 3 blank · 20 comment · 10 complexity · 1034d0b0220a0111113f283be5311a35 MD5 · raw file

  1. // -*- C++ -*-
  2. /* Copyright (C) 1989, 1990, 1991, 1992 Free Software Foundation, Inc.
  3. Written by James Clark (jjc@jclark.com)
  4. This file is part of groff.
  5. groff is free software; you can redistribute it and/or modify it under
  6. the terms of the GNU General Public License as published by the Free
  7. Software Foundation; either version 2, or (at your option) any later
  8. version.
  9. groff is distributed in the hope that it will be useful, but WITHOUT ANY
  10. WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11. FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
  12. for more details.
  13. You should have received a copy of the GNU General Public License along
  14. with groff; see the file COPYING. If not, write to the Free Software
  15. Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */
  16. #include "guess.h"
  17. void guess(const char *s, const font_params &param, char_metric *metric)
  18. {
  19. int &height = metric->height;
  20. int &depth = metric->depth;
  21. metric->ic = 0;
  22. metric->left_ic = 0;
  23. metric->sk = 0;
  24. height = 0;
  25. depth = 0;
  26. if (s[0] == '\0' || (s[1] != '\0' && s[2] != '\0'))
  27. goto do_default;
  28. #define HASH(c1, c2) (((unsigned char)(c1) << 8) | (unsigned char)(c2))
  29. switch (HASH(s[0], s[1])) {
  30. default:
  31. do_default:
  32. if (metric->type & 01)
  33. depth = param.desc_depth;
  34. if (metric->type & 02)
  35. height = param.asc_height;
  36. else
  37. height = param.x_height;
  38. break;
  39. case HASH('\\', '|'):
  40. case HASH('\\', '^'):
  41. case HASH('\\', '&'):
  42. // these have zero height and depth
  43. break;
  44. case HASH('f', 0):
  45. height = param.asc_height;
  46. if (param.italic)
  47. depth = param.desc_depth;
  48. break;
  49. case HASH('a', 0):
  50. case HASH('c', 0):
  51. case HASH('e', 0):
  52. case HASH('m', 0):
  53. case HASH('n', 0):
  54. case HASH('o', 0):
  55. case HASH('r', 0):
  56. case HASH('s', 0):
  57. case HASH('u', 0):
  58. case HASH('v', 0):
  59. case HASH('w', 0):
  60. case HASH('x', 0):
  61. case HASH('z', 0):
  62. height = param.x_height;
  63. break;
  64. case HASH('i', 0):
  65. height = param.x_height;
  66. break;
  67. case HASH('b', 0):
  68. case HASH('d', 0):
  69. case HASH('h', 0):
  70. case HASH('k', 0):
  71. case HASH('l', 0):
  72. case HASH('F', 'i'):
  73. case HASH('F', 'l'):
  74. case HASH('f', 'f'):
  75. case HASH('f', 'i'):
  76. case HASH('f', 'l'):
  77. height = param.asc_height;
  78. break;
  79. case HASH('t', 0):
  80. height = param.asc_height;
  81. break;
  82. case HASH('g', 0):
  83. case HASH('p', 0):
  84. case HASH('q', 0):
  85. case HASH('y', 0):
  86. height = param.x_height;
  87. depth = param.desc_depth;
  88. break;
  89. case HASH('j', 0):
  90. height = param.x_height;
  91. depth = param.desc_depth;
  92. break;
  93. case HASH('A', 0):
  94. case HASH('B', 0):
  95. case HASH('C', 0):
  96. case HASH('D', 0):
  97. case HASH('E', 0):
  98. case HASH('F', 0):
  99. case HASH('G', 0):
  100. case HASH('H', 0):
  101. case HASH('I', 0):
  102. case HASH('J', 0):
  103. case HASH('K', 0):
  104. case HASH('L', 0):
  105. case HASH('M', 0):
  106. case HASH('N', 0):
  107. case HASH('O', 0):
  108. case HASH('P', 0):
  109. case HASH('Q', 0):
  110. case HASH('R', 0):
  111. case HASH('S', 0):
  112. case HASH('T', 0):
  113. case HASH('U', 0):
  114. case HASH('V', 0):
  115. case HASH('W', 0):
  116. case HASH('X', 0):
  117. case HASH('Y', 0):
  118. case HASH('Z', 0):
  119. height = param.cap_height;
  120. break;
  121. case HASH('*', 'A'):
  122. case HASH('*', 'B'):
  123. case HASH('*', 'C'):
  124. case HASH('*', 'D'):
  125. case HASH('*', 'E'):
  126. case HASH('*', 'F'):
  127. case HASH('*', 'G'):
  128. case HASH('*', 'H'):
  129. case HASH('*', 'I'):
  130. case HASH('*', 'K'):
  131. case HASH('*', 'L'):
  132. case HASH('*', 'M'):
  133. case HASH('*', 'N'):
  134. case HASH('*', 'O'):
  135. case HASH('*', 'P'):
  136. case HASH('*', 'Q'):
  137. case HASH('*', 'R'):
  138. case HASH('*', 'S'):
  139. case HASH('*', 'T'):
  140. case HASH('*', 'U'):
  141. case HASH('*', 'W'):
  142. case HASH('*', 'X'):
  143. case HASH('*', 'Y'):
  144. case HASH('*', 'Z'):
  145. height = param.cap_height;
  146. break;
  147. case HASH('0', 0):
  148. case HASH('1', 0):
  149. case HASH('2', 0):
  150. case HASH('3', 0):
  151. case HASH('4', 0):
  152. case HASH('5', 0):
  153. case HASH('6', 0):
  154. case HASH('7', 0):
  155. case HASH('8', 0):
  156. case HASH('9', 0):
  157. case HASH('1', '2'):
  158. case HASH('1', '4'):
  159. case HASH('3', '4'):
  160. height = param.fig_height;
  161. break;
  162. case HASH('(', 0):
  163. case HASH(')', 0):
  164. case HASH('[', 0):
  165. case HASH(']', 0):
  166. case HASH('{', 0):
  167. case HASH('}', 0):
  168. height = param.body_height;
  169. depth = param.body_depth;
  170. break;
  171. case HASH('i', 's'):
  172. height = (param.em*3)/4;
  173. depth = param.em/4;
  174. break;
  175. case HASH('*', 'a'):
  176. case HASH('*', 'e'):
  177. case HASH('*', 'i'):
  178. case HASH('*', 'k'):
  179. case HASH('*', 'n'):
  180. case HASH('*', 'o'):
  181. case HASH('*', 'p'):
  182. case HASH('*', 's'):
  183. case HASH('*', 't'):
  184. case HASH('*', 'u'):
  185. case HASH('*', 'w'):
  186. height = param.x_height;
  187. break;
  188. case HASH('*', 'd'):
  189. case HASH('*', 'l'):
  190. height = param.asc_height;
  191. break;
  192. case HASH('*', 'g'):
  193. case HASH('*', 'h'):
  194. case HASH('*', 'm'):
  195. case HASH('*', 'r'):
  196. case HASH('*', 'x'):
  197. case HASH('*', 'y'):
  198. height = param.x_height;
  199. depth = param.desc_depth;
  200. break;
  201. case HASH('*', 'b'):
  202. case HASH('*', 'c'):
  203. case HASH('*', 'f'):
  204. case HASH('*', 'q'):
  205. case HASH('*', 'z'):
  206. height = param.asc_height;
  207. depth = param.desc_depth;
  208. break;
  209. case HASH('t', 's'):
  210. height = param.x_height;
  211. depth = param.desc_depth;
  212. break;
  213. case HASH('!', 0):
  214. case HASH('?', 0):
  215. case HASH('"', 0):
  216. case HASH('#', 0):
  217. case HASH('$', 0):
  218. case HASH('%', 0):
  219. case HASH('&', 0):
  220. case HASH('*', 0):
  221. case HASH('+', 0):
  222. height = param.asc_height;
  223. break;
  224. case HASH('`', 0):
  225. case HASH('\'', 0):
  226. height = param.asc_height;
  227. break;
  228. case HASH('~', 0):
  229. case HASH('^', 0):
  230. case HASH('a', 'a'):
  231. case HASH('g', 'a'):
  232. height = param.asc_height;
  233. break;
  234. case HASH('r', 'u'):
  235. case HASH('.', 0):
  236. break;
  237. case HASH(',', 0):
  238. depth = param.comma_depth;
  239. break;
  240. case HASH('m', 'i'):
  241. case HASH('-', 0):
  242. case HASH('h', 'y'):
  243. case HASH('e', 'm'):
  244. height = param.x_height;
  245. break;
  246. case HASH(':', 0):
  247. height = param.x_height;
  248. break;
  249. case HASH(';', 0):
  250. height = param.x_height;
  251. depth = param.comma_depth;
  252. break;
  253. case HASH('=', 0):
  254. case HASH('e', 'q'):
  255. height = param.x_height;
  256. break;
  257. case HASH('<', 0):
  258. case HASH('>', 0):
  259. case HASH('>', '='):
  260. case HASH('<', '='):
  261. case HASH('@', 0):
  262. case HASH('/', 0):
  263. case HASH('|', 0):
  264. case HASH('\\', 0):
  265. height = param.asc_height;
  266. break;
  267. case HASH('_', 0):
  268. case HASH('u', 'l'):
  269. case HASH('\\', '_'):
  270. depth = param.em/4;
  271. break;
  272. case HASH('r', 'n'):
  273. height = (param.em*3)/4;
  274. break;
  275. case HASH('s', 'r'):
  276. height = (param.em*3)/4;
  277. depth = param.em/4;
  278. break;
  279. case HASH('b', 'u'):
  280. case HASH('s', 'q'):
  281. case HASH('d', 'e'):
  282. case HASH('d', 'g'):
  283. case HASH('f', 'm'):
  284. case HASH('c', 't'):
  285. case HASH('r', 'g'):
  286. case HASH('c', 'o'):
  287. case HASH('p', 'l'):
  288. case HASH('*', '*'):
  289. case HASH('s', 'c'):
  290. case HASH('s', 'l'):
  291. case HASH('=', '='):
  292. case HASH('~', '='):
  293. case HASH('a', 'p'):
  294. case HASH('!', '='):
  295. case HASH('-', '>'):
  296. case HASH('<', '-'):
  297. case HASH('u', 'a'):
  298. case HASH('d', 'a'):
  299. case HASH('m', 'u'):
  300. case HASH('d', 'i'):
  301. case HASH('+', '-'):
  302. case HASH('c', 'u'):
  303. case HASH('c', 'a'):
  304. case HASH('s', 'b'):
  305. case HASH('s', 'p'):
  306. case HASH('i', 'b'):
  307. case HASH('i', 'p'):
  308. case HASH('i', 'f'):
  309. case HASH('p', 'd'):
  310. case HASH('g', 'r'):
  311. case HASH('n', 'o'):
  312. case HASH('p', 't'):
  313. case HASH('e', 's'):
  314. case HASH('m', 'o'):
  315. case HASH('b', 'r'):
  316. case HASH('d', 'd'):
  317. case HASH('r', 'h'):
  318. case HASH('l', 'h'):
  319. case HASH('o', 'r'):
  320. case HASH('c', 'i'):
  321. height = param.asc_height;
  322. break;
  323. case HASH('l', 't'):
  324. case HASH('l', 'b'):
  325. case HASH('r', 't'):
  326. case HASH('r', 'b'):
  327. case HASH('l', 'k'):
  328. case HASH('r', 'k'):
  329. case HASH('b', 'v'):
  330. case HASH('l', 'f'):
  331. case HASH('r', 'f'):
  332. case HASH('l', 'c'):
  333. case HASH('r', 'c'):
  334. height = (param.em*3)/4;
  335. depth = param.em/4;
  336. break;
  337. #if 0
  338. case HASH('%', '0'):
  339. case HASH('-', '+'):
  340. case HASH('-', 'D'):
  341. case HASH('-', 'd'):
  342. case HASH('-', 'd'):
  343. case HASH('-', 'h'):
  344. case HASH('.', 'i'):
  345. case HASH('.', 'j'):
  346. case HASH('/', 'L'):
  347. case HASH('/', 'O'):
  348. case HASH('/', 'l'):
  349. case HASH('/', 'o'):
  350. case HASH('=', '~'):
  351. case HASH('A', 'E'):
  352. case HASH('A', 'h'):
  353. case HASH('A', 'N'):
  354. case HASH('C', 's'):
  355. case HASH('D', 'o'):
  356. case HASH('F', 'c'):
  357. case HASH('F', 'o'):
  358. case HASH('I', 'J'):
  359. case HASH('I', 'm'):
  360. case HASH('O', 'E'):
  361. case HASH('O', 'f'):
  362. case HASH('O', 'K'):
  363. case HASH('O', 'm'):
  364. case HASH('O', 'R'):
  365. case HASH('P', 'o'):
  366. case HASH('R', 'e'):
  367. case HASH('S', '1'):
  368. case HASH('S', '2'):
  369. case HASH('S', '3'):
  370. case HASH('T', 'P'):
  371. case HASH('T', 'p'):
  372. case HASH('Y', 'e'):
  373. case HASH('\\', '-'):
  374. case HASH('a', '"'):
  375. case HASH('a', '-'):
  376. case HASH('a', '.'):
  377. case HASH('a', '^'):
  378. case HASH('a', 'b'):
  379. case HASH('a', 'c'):
  380. case HASH('a', 'd'):
  381. case HASH('a', 'e'):
  382. case HASH('a', 'h'):
  383. case HASH('a', 'o'):
  384. case HASH('a', 't'):
  385. case HASH('a', '~'):
  386. case HASH('b', 'a'):
  387. case HASH('b', 'b'):
  388. case HASH('b', 's'):
  389. case HASH('c', '*'):
  390. case HASH('c', '+'):
  391. case HASH('f', '/'):
  392. case HASH('f', 'a'):
  393. case HASH('f', 'c'):
  394. case HASH('f', 'o'):
  395. case HASH('h', 'a'):
  396. case HASH('h', 'o'):
  397. case HASH('i', 'j'):
  398. case HASH('l', 'A'):
  399. case HASH('l', 'B'):
  400. case HASH('l', 'C'):
  401. case HASH('m', 'd'):
  402. case HASH('n', 'c'):
  403. case HASH('n', 'e'):
  404. case HASH('n', 'm'):
  405. case HASH('o', 'A'):
  406. case HASH('o', 'a'):
  407. case HASH('o', 'e'):
  408. case HASH('o', 'q'):
  409. case HASH('p', 'l'):
  410. case HASH('p', 'p'):
  411. case HASH('p', 's'):
  412. case HASH('r', '!'):
  413. case HASH('r', '?'):
  414. case HASH('r', 'A'):
  415. case HASH('r', 'B'):
  416. case HASH('r', 'C'):
  417. case HASH('r', 's'):
  418. case HASH('s', 'h'):
  419. case HASH('s', 's'):
  420. case HASH('t', 'e'):
  421. case HASH('t', 'f'):
  422. case HASH('t', 'i'):
  423. case HASH('t', 'm'):
  424. case HASH('~', '~'):
  425. case HASH('v', 'S'):
  426. case HASH('v', 'Z'):
  427. case HASH('v', 's'):
  428. case HASH('v', 'z'):
  429. case HASH('^', 'A'):
  430. case HASH('^', 'E'):
  431. case HASH('^', 'I'):
  432. case HASH('^', 'O'):
  433. case HASH('^', 'U'):
  434. case HASH('^', 'a'):
  435. case HASH('^', 'e'):
  436. case HASH('^', 'i'):
  437. case HASH('^', 'o'):
  438. case HASH('^', 'u'):
  439. case HASH('`', 'A'):
  440. case HASH('`', 'E'):
  441. case HASH('`', 'I'):
  442. case HASH('`', 'O'):
  443. case HASH('`', 'U'):
  444. case HASH('`', 'a'):
  445. case HASH('`', 'e'):
  446. case HASH('`', 'i'):
  447. case HASH('`', 'o'):
  448. case HASH('`', 'u'):
  449. case HASH('~', 'A'):
  450. case HASH('~', 'N'):
  451. case HASH('~', 'O'):
  452. case HASH('~', 'a'):
  453. case HASH('~', 'n'):
  454. case HASH('~', 'o'):
  455. case HASH('\'', 'A'):
  456. case HASH('\'', 'C'):
  457. case HASH('\'', 'E'):
  458. case HASH('\'', 'I'):
  459. case HASH('\'', 'O'):
  460. case HASH('\'', 'U'):
  461. case HASH('\'', 'a'):
  462. case HASH('\'', 'c'):
  463. case HASH('\'', 'e'):
  464. case HASH('\'', 'i'):
  465. case HASH('\'', 'o'):
  466. case HASH('\'', 'u')
  467. case HASH(':', 'A'):
  468. case HASH(':', 'E'):
  469. case HASH(':', 'I'):
  470. case HASH(':', 'O'):
  471. case HASH(':', 'U'):
  472. case HASH(':', 'Y'):
  473. case HASH(':', 'a'):
  474. case HASH(':', 'e'):
  475. case HASH(':', 'i'):
  476. case HASH(':', 'o'):
  477. case HASH(':', 'u'):
  478. case HASH(':', 'y'):
  479. case HASH(',', 'C'):
  480. case HASH(',', 'c'):
  481. #endif
  482. }
  483. }