13 A, /* author in quote (small caps) */
15 Ba, /* author inside bib */
16 Bch, /* builtup chem component */
17 Bib, /* surrounds word 'in' for bibliographic ref */
21 Cb, /* ? block of stuff (indent) */
22 Cf, /* cross ref to another entry (italics) */
23 Chem, /* chemistry formula */
24 Co, /* over (preceding sum, integral, etc.) */
25 Col, /* column of table (aux just may be r) */
26 Cu, /* under (preceding sum, integral, etc.) */
28 Db, /* def block? indent */
29 Dn, /* denominator of fraction */
31 Ed, /* editor's comments (in [...]) */
32 Etym, /* etymology (in [...]) */
33 Fq, /* frequency count (superscript) */
35 Fr, /* fraction (contains <nu>, then <dn>) */
36 Gk, /* greek (transliteration) */
37 Gr, /* grammar? (e.g., around 'pa.' in 'pa. pple.') */
38 Hg, /* headword group */
39 Hm, /* homonym (superscript) */
40 Hw, /* headword (bold) */
42 Il, /* italic list? */
43 In, /* inferior (subscript) */
44 L, /* row of col of table */
45 La, /* status or usage label (italic) */
46 Lc, /* chapter/verse sort of thing for works */
47 N, /* note (smaller type) */
48 Nu, /* numerator of fraction */
49 Ov, /* needs overline */
50 P, /* paragraph (indent) */
51 Ph, /* pronunciation (transliteration) */
52 Pi, /* pile (frac without line) */
53 Pqp, /* subblock of quote */
54 Pr, /* pronunciation (in (...)) */
55 Ps, /* position (e.g., adv.) (italic) */
56 Pt, /* part (in lc) */
57 Q, /* quote in quote block */
58 Qd, /* quote date (bold) */
59 Qig, /* quote number (greek) */
60 Qla, /* status or usage label in quote (italic) */
61 Qp, /* quote block (small type, indent) */
62 Qsn, /* quote number */
64 R, /* roman type style */
65 Rx, /* relative cross reference (e.g., next) */
66 S, /* another form? (italic) */
67 S0, /* sense (sometimes surrounds several sx's) */
68 S1, /* sense (aux num: indented bold letter) */
69 S2, /* sense (aux num: indented bold capital rom num) */
70 S3, /* sense (aux num: indented number of asterisks) */
71 S4, /* sense (aux num: indented bold number) */
72 S5, /* sense (aux num: indented number of asterisks) */
73 S6, /* subsense (aux num: bold letter) */
74 S7a, /* subsense (aux num: letter) */
75 S7n, /* subsense (aux num: roman numeral) */
77 Sgk, /* subsense (aux num: transliterated greek) */
78 Sn, /* sense of subdefinition (aux num: roman letter) */
80 Ssb, /* sans serif bold */
81 Ssi, /* sans serif italic */
82 Su, /* superior (superscript) */
83 Sub, /* subdefinition */
84 Table, /* table (aux cols=number of columns) */
85 Tt, /* title? (italics) */
86 Vd, /* numeric label for variant form */
87 Ve, /* variant entry */
88 Vf, /* variant form (light bold) */
89 Vfl, /* list of vf's (starts with Also or Forms) */
90 W, /* work (e.g., Beowulf) (italics) */
91 X, /* cross reference to main word (small caps) */
92 Xd, /* cross reference to quotation by date */
93 Xi, /* internal cross reference ? (italic) */
94 Xid, /* cross reference identifer, in quote ? */
95 Xs, /* cross reference sense (lower number) */
97 Ntag /* end of tags */
100 /* Assoc tables must be sorted on first field */
102 static Assoc tagtab[] = {
191 /* Possible tag auxilliary info */
193 Cols, /* number of columns in a table */
194 Num, /* letter or number, for a sense */
195 St, /* status (e.g., obs) */
199 static Assoc auxtab[] = {
205 static Assoc spectab[] = {
215 {"Asg", 0x1b7}, /* Unicyle. Cf "Sake" */
221 {"Chirho", 0x2627}, /* Chi Rho U+2627 */
240 {"Naira", 0x4e}, /* should have bar through */
241 {"Nplus", 0x4e}, /* should have plus above */
266 {"Wyn", 0x1bf}, /* wynn U+01BF */
268 {"Ygh", 0x1b7}, /* Yogh U+01B7 */
270 {"Zh", 0x1b7}, /* looks like Yogh. Cf "Sake" */
271 {"a", 0x61}, /* ante */
288 {"ankh", 0x2625}, /* ankh U+2625 */
289 {"ante", 0x61}, /* before (year) */
293 {"arDadfull", 0x636}, /* Dad U+0636 */
294 {"arHa", 0x62d}, /* haa U+062D */
295 {"arTa", 0x62a}, /* taa U+062A */
296 {"arain", 0x639}, /* ain U+0639 */
297 {"arainfull", 0x639}, /* ain U+0639 */
298 {"aralif", 0x627}, /* alef U+0627 */
299 {"arba", 0x628}, /* baa U+0628 */
300 {"arha", 0x647}, /* ha U+0647 */
302 {"arnun", 0x646}, /* noon U+0646 */
303 {"arnunfull", 0x646}, /* noon U+0646 */
304 {"arpa", 0x647}, /* ha U+0647 */
305 {"arqoph", 0x642}, /* qaf U+0642 */
306 {"arshinfull", 0x634}, /* sheen U+0634 */
307 {"arta", 0x62a}, /* taa U+062A */
308 {"artafull", 0x62a}, /* taa U+062A */
309 {"artha", 0x62b}, /* thaa U+062B */
310 {"arwaw", 0x648}, /* waw U+0648 */
311 {"arya", 0x64a}, /* ya U+064A */
312 {"aryafull", 0x64a}, /* ya U+064A */
313 {"arzero", 0x660}, /* indic zero U+0660 */
314 {"asg", 0x292}, /* unicycle character. Cf "hallow" */
317 {"astm", 0x2042}, /* asterism: should be upside down */
321 {"ayin", 0x639}, /* arabic ain U+0639 */
322 {"b1", 0x2d}, /* single bond */
323 {"b2", 0x3d}, /* double bond */
324 {"b3", 0x2261}, /* triple bond */
325 {"bbar", 0x180}, /* b with bar U+0180 */
328 {"blC", 0x43}, /* should be black letter */
329 {"blJ", 0x4a}, /* should be black letter */
330 {"blU", 0x55}, /* should be black letter */
331 {"blb", 0x62}, /* should be black letter */
332 {"blozenge", 0x25ca}, /* U+25CA; should be black */
333 {"bly", 0x79}, /* should be black letter */
338 {"bsquare", 0x25a0}, /* black square U+25A0 */
339 {"btril", 0x25c0}, /* U+25C0 */
340 {"btrir", 0x25b6}, /* U+25B6 */
341 {"c", 0x63}, /* circa */
353 {"cdsb", 0x301b}, /* ]] U+301b */
358 {"circa", 0x63}, /* about (year) */
359 {"circbl", 0x325}, /* ring below accent U+0325 */
360 {"circle", 0x25cb}, /* U+25CB */
361 {"circledot", 0x2299},
369 {"cross", 0x2720}, /* maltese cross U+2720 */
370 {"crotchet", 0x2669},
372 {"ctilde", 0x63}, /* +tilde */
389 {"dced", 0x64}, /* +cedilla */
395 {"dele", 0x64}, /* should be dele */
397 {"descnode", 0x260b}, /* descending node U+260B */
402 {"dlessj1", 0x6a}, /* should be dotless */
403 {"dlessj2", 0x6a}, /* should be dotless */
404 {"dlessj3", 0x6a}, /* should be dotless */
436 {"fatpara", 0xb6}, /* should have fatter, filled in bowl */
444 {"frE", 0x45}, /* should be curly */
445 {"frL", L'L'}, /* should be curly */
446 {"frR", 0x52}, /* should be curly */
447 {"frakB", 0x42}, /* should have fraktur style */
460 {"gAacu", 0xc1}, /* should be Α+acute */
461 {"gaacu", 0x3b1}, /* +acute */
462 {"gabreve", 0x3b1}, /* +breve */
463 {"gafrown", 0x3b1}, /* +frown */
464 {"gagrave", 0x3b1}, /* +grave */
465 {"gamac", 0x3b1}, /* +macron */
467 {"gauml", 0x3b1}, /* +umlaut */
469 {"geacu", 0x3b5}, /* +acute */
470 {"gegrave", 0x3b5}, /* +grave */
471 {"ghacu", 0x3b7}, /* +acute */
472 {"ghfrown", 0x3b7}, /* +frown */
473 {"ghgrave", 0x3b7}, /* +grave */
474 {"ghmac", 0x3b7}, /* +macron */
475 {"giacu", 0x3b9}, /* +acute */
476 {"gibreve", 0x3b9}, /* +breve */
477 {"gifrown", 0x3b9}, /* +frown */
478 {"gigrave", 0x3b9}, /* +grave */
479 {"gimac", 0x3b9}, /* +macron */
480 {"giuml", 0x3b9}, /* +umlaut */
483 {"goacu", 0x3bf}, /* +acute */
484 {"gobreve", 0x3bf}, /* +breve */
487 {"guacu", 0x3c5}, /* +acute */
488 {"gufrown", 0x3c5}, /* +frown */
489 {"gugrave", 0x3c5}, /* +grave */
490 {"gumac", 0x3c5}, /* +macron */
491 {"guuml", 0x3c5}, /* +umlaut */
492 {"gwacu", 0x3c9}, /* +acute */
493 {"gwfrown", 0x3c9}, /* +frown */
494 {"gwgrave", 0x3c9}, /* +grave */
499 {"hatpath", 0x5b2}, /* hataf patah U+05B2 */
500 {"hatqam", 0x5b3}, /* hataf qamats U+05B3 */
501 {"hatseg", 0x5b1}, /* hataf segol U+05B1 */
504 {"hebaleph", 0x5d0}, /* aleph U+05D0 */
505 {"hebayin", 0x5e2}, /* ayin U+05E2 */
506 {"hebbet", 0x5d1}, /* bet U+05D1 */
507 {"hebbeth", 0x5d1}, /* bet U+05D1 */
508 {"hebcheth", 0x5d7}, /* bet U+05D7 */
509 {"hebdaleth", 0x5d3}, /* dalet U+05D3 */
510 {"hebgimel", 0x5d2}, /* gimel U+05D2 */
511 {"hebhe", 0x5d4}, /* he U+05D4 */
512 {"hebkaph", 0x5db}, /* kaf U+05DB */
513 {"heblamed", 0x5dc}, /* lamed U+05DC */
514 {"hebmem", 0x5de}, /* mem U+05DE */
515 {"hebnun", 0x5e0}, /* nun U+05E0 */
516 {"hebnunfin", 0x5df}, /* final nun U+05DF */
517 {"hebpe", 0x5e4}, /* pe U+05E4 */
518 {"hebpedag", 0x5e3}, /* final pe? U+05E3 */
519 {"hebqoph", 0x5e7}, /* qof U+05E7 */
520 {"hebresh", 0x5e8}, /* resh U+05E8 */
521 {"hebshin", 0x5e9}, /* shin U+05E9 */
522 {"hebtav", 0x5ea}, /* tav U+05EA */
523 {"hebtsade", 0x5e6}, /* tsadi U+05E6 */
524 {"hebwaw", 0x5d5}, /* vav? U+05D5 */
525 {"hebyod", 0x5d9}, /* yod U+05D9 */
526 {"hebzayin", 0x5d6}, /* zayin U+05D6 */
527 {"hgz", 0x292}, /* ??? Cf "alet" */
528 {"hireq", 0x5b4}, /* U+05B4 */
531 {"horizE", 0x45}, /* should be on side */
532 {"horizP", 0x50}, /* should be on side */
535 {"horizb", 0x7b}, /* should be underbrace */
564 {"isub", 0x3f5}, /* iota below accent */
581 {"logicand", 0x2227},
588 {"lumlbl", 0x6c}, /* +umlaut below */
591 {"mc", 0x63}, /* should be raised */
592 {"merc", 0x263f}, /* mercury U+263F */
594 {"moonfq", 0x263d}, /* first quarter moon U+263D */
595 {"moonlq", 0x263e}, /* last quarter moon U+263E */
596 {"msylab", 0x6d}, /* +sylab (ˌ) */
622 {"obigb", 0x7b}, /* should be big */
624 {"obigsb", 0x5b}, /* should be big */
627 {"odsb", 0x301a}, /* [[ U+301A */
631 {"ohook", 0x6f}, /* +hook */
644 {"ounce", 0x2125}, /* ounce U+2125 */
645 {"ovparen", 0x2322}, /* should be sideways ( */
653 {"pbar", 0x70}, /* +bar */
654 {"per", 0x2118}, /* per U+2118 */
660 {"plantinJ", 0x4a}, /* should be script */
668 {"q", 0x3f}, /* should be raised */
669 {"qamets", 0x5b3}, /* U+05B3 */
674 {"recipe", 0x211e}, /* U+211E */
676 {"revC", 0x186}, /* open O U+0186 */
681 {"revsc", 0x2d2}, /* upside-down semicolon */
683 {"rfa", 0x6f}, /* +hook (Cf "goal") */
689 {"rsylab", 0x72}, /* +sylab */
690 {"runash", 0x46}, /* should be runic 'ash' */
699 {"scrA", 0x41}, /* should be script */
715 {"scruple", 0x2108}, /* U+2108 */
722 {"sheva", 0x5b0}, /* U+05B0 */
729 {"slge", 0x2265}, /* should have slanted line under */
730 {"slle", 0x2264}, /* should have slanted line under */
735 {"square", 0x25a1}, /* U+25A1 */
736 {"ssChi", 0x3a7}, /* should be sans serif */
738 {"ssOmicron", 0x39f},
753 {"thbar", 0xfe}, /* +bar */
755 {"thinqm", 0x3f}, /* should be thinner */
763 {"ubar", 0x75}, /* +bar */
777 {"undl", 0x2cd}, /* underline accent */
781 {"vavpath", 0x5d5}, /* vav U+05D5 (+patah) */
782 {"vavsheva", 0x5d5}, /* vav U+05D5 (+sheva) */
785 {"versicle2", 0x2123}, /* U+2123 */
793 {"wyn", 0x1bf}, /* wynn U+01BF */
798 {"ymac", 0x79}, /* +macron */
800 {"zced", 0x7a}, /* +cedilla */
806 The following special characters don't have close enough
807 equivalents in Unicode, so aren't in the above table.
808 22n 2^(2^n) Cf Fermat
811 Bantuo Bantu O. Cf Otshi-herero
812 Car C with circular arrow on top
813 albrtime cut-time: C with vertical line
815 bantuo Bantu o. Cf Otshi-herero
816 bbc1 single chem bond below
817 bbc2 double chem bond below
818 bbl1 chem bond like /
819 bbl2 chem bond like //
820 bbr1 chem bond like \
822 bcop1 copper symbol. Cf copper
823 bcop2 copper symbol. Cf copper
825 btc1 single chem bond above
826 btc2 double chem bond above
827 btl1 chem bond like \
828 btl2 chem bond like \\
829 btr1 chem bond like /
830 btr2 chem bond line //
832 devph sanskrit letter. Cf ph
833 devrfls sanskrit letter. Cf cerebral
834 duplong[12] musical note
835 egchi early form of chi
836 eggamma[12] early form of gamma
837 egiota early form of iota
838 egkappa early form of kappa
839 eglambda early form of lambda
840 egmu[12] early form of mu
841 egnu[12] early form of nu
842 egpi[123] early form of pi
843 egrho[12] early form of rho
844 egsampi early form of sampi
845 egsan early form of san
846 egsigma[12] early form of sigma
847 egxi[123] early form of xi
848 elatS early form of S
849 elatc[12] early form of C
850 elatg[12] early form of G
851 glagjeri Slavonic Glagolitic jeri
852 glagjeru Slavonic Glagolitic jeru
853 hypolem hypolemisk (line with underdot)
855 longmord long mordent
856 mbwvow backwards scretched C. Cf retract.
857 mord music symbol. Cf mordent
859 ohgcirc old form of circumflex
860 oldbeta old form of β. Cf perturbate
861 oldsemibr[12] old forms of semibreve. Cf prolation
862 ormg old form of g. Cf G
863 para[12345] form of ¶
864 pauseo musical pause sign
865 pauseu musical pause sign
867 ragr Black letter ragged r
868 repetn musical repeat. Cf retort
869 segno musical segno sign
870 semain[12] semitic ain
874 semlamed[12] semitic lamed
878 semqoph[123] semitic qoph
880 semtav[1234] semitic tav
882 semzayin[123] semitic zayin
883 shtlong[12] U with underbar. Cf glyconic
884 sigmatau σ,τ combination
885 squaver sixteenth note
886 sqbreve square musical breve note
888 uhrbr upper half of big }
889 versicle1 Cf versicle
893 static Rune normtab[128] = {
894 /*0*/ /*1*/ /*2*/ /*3*/ /*4*/ /*5*/ /*6*/ /*7*/
895 /*00*/ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
896 NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
897 /*10*/ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
898 NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
899 /*20*/ 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, SPCS, '\'',
900 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
901 /*30*/ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
902 0x38, 0x39, 0x3a, 0x3b, TAGS, 0x3d, TAGE, 0x3f,
903 /*40*/ 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
904 0x48, 0x49, 0x4a, 0x4b, L'L', 0x4d, 0x4e, 0x4f,
905 /*50*/ 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
906 0x58, 0x59, 0x5a, 0x5b, L'\\', 0x5d, 0x5e, 0x5f,
907 /*60*/ 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
908 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
909 /*70*/ 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
910 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, NONE,
912 static Rune phtab[128] = {
913 /*0*/ /*1*/ /*2*/ /*3*/ /*4*/ /*5*/ /*6*/ /*7*/
914 /*00*/ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
915 NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
916 /*10*/ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
917 NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
918 /*20*/ 0x20, 0x21, 0x2c8, 0x23, 0x24, 0x2cc, 0xe6, '\'',
919 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
920 /*30*/ 0x30, 0x31, 0x32, 0x25c, 0x34, 0x35, 0x36, 0x37,
921 0x38, 0xf8, 0x2d0, 0x3b, TAGS, 0x3d, TAGE, 0x3f,
922 /*40*/ 0x259, 0x251, 0x42, 0x43, 0xf0, 0x25b, 0x46, 0x47,
923 0x48, 0x26a, 0x4a, 0x4b, L'L', 0x4d, 0x14b, 0x254,
924 /*50*/ 0x50, 0x252, 0x52, 0x283, 0x3b8, 0x28a, 0x28c, 0x57,
925 0x58, 0x59, 0x292, 0x5b, L'\\', 0x5d, 0x5e, 0x5f,
926 /*60*/ 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
927 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
928 /*70*/ 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
929 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, NONE,
931 static Rune grtab[128] = {
932 /*0*/ /*1*/ /*2*/ /*3*/ /*4*/ /*5*/ /*6*/ /*7*/
933 /*00*/ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
934 NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
935 /*10*/ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
936 NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
937 /*20*/ 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, SPCS, '\'',
938 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
939 /*30*/ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
940 0x38, 0x39, 0x3a, 0x3b, TAGS, 0x3d, TAGE, 0x3f,
941 /*40*/ 0x40, 0x391, 0x392, 0x39e, 0x394, 0x395, 0x3a6, 0x393,
942 0x397, 0x399, 0x3da, 0x39a, 0x39b, 0x39c, 0x39d, 0x39f,
943 /*50*/ 0x3a0, 0x398, 0x3a1, 0x3a3, 0x3a4, 0x3a5, 0x56, 0x3a9,
944 0x3a7, 0x3a8, 0x396, 0x5b, L'\\', 0x5d, 0x5e, 0x5f,
945 /*60*/ 0x60, 0x3b1, 0x3b2, 0x3be, 0x3b4, 0x3b5, 0x3c6, 0x3b3,
946 0x3b7, 0x3b9, 0x3c2, 0x3ba, 0x3bb, 0x3bc, 0x3bd, 0x3bf,
947 /*70*/ 0x3c0, 0x3b8, 0x3c1, 0x3c3, 0x3c4, 0x3c5, 0x76, 0x3c9,
948 0x3c7, 0x3c8, 0x3b6, 0x7b, 0x7c, 0x7d, 0x7e, NONE,
950 static Rune subtab[128] = {
951 /*0*/ /*1*/ /*2*/ /*3*/ /*4*/ /*5*/ /*6*/ /*7*/
952 /*00*/ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
953 NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
954 /*10*/ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
955 NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
956 /*20*/ 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, SPCS, '\'',
957 0x208d, 0x208e, 0x2a, 0x208a, 0x2c, 0x208b, 0x2e, 0x2f,
958 /*30*/ 0x2080, 0x2081, 0x2082, 0x2083, 0x2084, 0x2085, 0x2086, 0x2087,
959 0x2088, 0x2089, 0x3a, 0x3b, TAGS, 0x208c, TAGE, 0x3f,
960 /*40*/ 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
961 0x48, 0x49, 0x4a, 0x4b, L'L', 0x4d, 0x4e, 0x4f,
962 /*50*/ 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
963 0x58, 0x59, 0x5a, 0x5b, L'\\', 0x5d, 0x5e, 0x5f,
964 /*60*/ 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
965 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
966 /*70*/ 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
967 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, NONE,
969 static Rune suptab[128] = {
970 /*0*/ /*1*/ /*2*/ /*3*/ /*4*/ /*5*/ /*6*/ /*7*/
971 /*00*/ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
972 NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
973 /*10*/ NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
974 NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,
975 /*20*/ 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, SPCS, '\'',
976 0x207d, 0x207e, 0x2a, 0x207a, 0x2c, 0x207b, 0x2e, 0x2f,
977 /*30*/ 0x2070, 0x2071, 0x2072, 0x2073, 0x2074, 0x2075, 0x2076, 0x2077,
978 0x2078, 0x2079, 0x3a, 0x3b, TAGS, 0x207c, TAGE, 0x3f,
979 /*40*/ 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
980 0x48, 0x49, 0x4a, 0x4b, L'L', 0x4d, 0x4e, 0x4f,
981 /*50*/ 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
982 0x58, 0x59, 0x5a, 0x5b, L'\\', 0x5d, 0x5e, 0x5f,
983 /*60*/ 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
984 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
985 /*70*/ 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
986 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, NONE,
989 static int tagstarts;
990 static char tag[Buflen];
992 static char auxname[Maxaux][Buflen];
993 static char auxval[Maxaux][Buflen];
994 static char spec[Buflen];
995 static uchar *auxstate[Naux]; /* vals for most recent tag */
996 static Entry curentry;
997 #define cursize (curentry.end-curentry.start)
999 static char *getspec(char *, char *);
1000 static char *gettag(char *, char *);
1001 static void dostatus(void);
1006 * 'h': just print headwords
1010 oedprintentry(Entry e, int cmd)
1014 long r, rprev, rlig;
1030 r = transtab[(*p++)&0x7F];
1032 /* Emit the rune, but buffer in case of ligature */
1036 } else if(r == SPCS) {
1037 /* Start of special character name */
1039 r = lookassoc(spectab, asize(spectab), spec);
1042 err("spec %ld %d %s",
1043 e.doff, cursize, spec);
1046 if(r >= LIGS && r < LIGE) {
1047 /* handle possible ligature */
1048 rlig = liglookup(r, rprev);
1050 rprev = rlig; /* overwrite rprev */
1052 /* could print accent, but let's not */
1053 if(rprev != NONE) outrune(rprev);
1056 } else if(r >= MULTI && r < MULTIE) {
1061 outrunes(multitab[r-MULTI]);
1062 } else if(r == PAR) {
1069 if(rprev != NONE) outrune(rprev);
1072 } else if(r == TAGS) {
1073 /* Start of tag name */
1079 t = lookassoc(tagtab, asize(tagtab), tag);
1082 err("tag %ld %d %s",
1083 e.doff, cursize, tag);
1086 for(i = 0; i < Naux; i++)
1088 for(i = 0; i < naux; i++) {
1089 a = lookassoc(auxtab, asize(auxtab), auxname[i]);
1092 err("aux %ld %d %s",
1093 e.doff, cursize, auxname[i]);
1095 auxstate[a] = auxval[i];
1106 outchar(tagstarts? '[' : ']');
1109 outchar(tagstarts? '(' : ')');
1112 transtab = changett(transtab, subtab, tagstarts);
1117 transtab = changett(transtab, suptab, tagstarts);
1120 transtab = changett(transtab, grtab, tagstarts);
1123 transtab = changett(transtab, phtab, tagstarts);
1129 outinhibit = !tagstarts;
1147 if(t == S3 || t == S5) {
1148 i = atoi(auxstate[Num]);
1152 } else if(t == S7a || t == S7n || t == Sn) {
1154 outchars(auxstate[Num]);
1156 } else if(t == Sgk) {
1157 i = grtab[auxstate[Num][0]];
1162 outchars(auxstate[Num]);
1177 * Todo: gather columns, justify them, etc.
1178 * For now, just let colums come out as rows
1201 * Return offset into bdict where next oed entry after fromoff starts.
1202 * Oed entries start with <e>, <ve>, <e st=...>, or <ve st=...>
1205 oednextoff(long fromoff)
1210 a = Bseek(bdict, fromoff, 0);
1222 if(c == '>' || c == ' ')
1224 } else if(c == 'v' && Bgetc(bdict) == 'e') {
1226 if(c == '>' || c == ' ')
1233 return (Boffset(bdict)-n);
1236 static char *prkey =
1237 "KEY TO THE PRONUNCIATION\n"
1240 "b, d, f, k, l, m, n, p, t, v, z: usual English values\n"
1242 "g as in go (gəʊ)\n"
1244 "r ... run (rʌn), terrier (ˈtɛriə(r))\n"
1245 "(r)... her (hɜː(r))\n"
1246 "s ... see (siː), success (səkˈsɜs)\n"
1247 "w ... wear (wɛə(r))\n"
1248 "hw ... when (hwɛn)\n"
1250 "θ ... thin (θin), bath (bɑːθ)\n"
1251 "ð ... then (ðɛn), bathe (beɪð)\n"
1252 "ʃ ... shop (ʃɒp), dish (dɪʃ)\n"
1253 "tʃ ... chop (tʃɒp), ditch (dɪtʃ)\n"
1254 "ʒ ... vision (ˈvɪʒən), déjeuner (deʒøne)\n"
1255 "dʒ ... judge (dʒʌdʒ)\n"
1256 "ŋ ... singing (ˈsɪŋɪŋ), think (θiŋk)\n"
1257 "ŋg ... finger (ˈfiŋgə(r))\n"
1260 "ʎ as in It. seraglio (serˈraʎo)\n"
1261 "ɲ ... Fr. cognac (kɔɲak)\n"
1262 "x ... Ger. ach (ax), Sc. loch (lɒx)\n"
1263 "ç ... Ger. ich (ɪç), Sc. nicht (nɪçt)\n"
1264 "ɣ ... North Ger. sagen (ˈzaːɣən)\n"
1265 "c ... Afrikaans baardmannetjie (ˈbaːrtmanəci)\n"
1266 "ɥ ... Fr. cuisine (kɥizin)\n"
1268 "II. VOWELS AND DIPTHONGS\n"
1271 "ɪ as in pit (pɪt), -ness (-nɪs)\n"
1272 "ɛ ... pet (pɛt), Fr. sept (sɛt)\n"
1274 "ʌ ... putt (pʌt)\n"
1277 "ə ... another (əˈnʌðə(r))\n"
1278 "(ə)... beaten (ˈbiːt(ə)n)\n"
1279 "i ... Fr. si (si)\n"
1280 "e ... Fr. bébé (bebe)\n"
1281 "a ... Fr. mari (mari)\n"
1282 "ɑ ... Fr. bâtiment (bɑtimã)\n"
1283 "ɔ ... Fr. homme (ɔm)\n"
1284 "o ... Fr. eau (o)\n"
1285 "ø ... Fr. peu (pø)\n"
1286 "œ ... Fr. boeuf (bœf), coeur (kœr)\n"
1287 "u ... Fr. douce (dus)\n"
1288 "ʏ ... Ger. Müller (ˈmʏlər)\n"
1289 "y ... Fr. du (dy)\n"
1292 "iː as in bean (biːn)\n"
1293 "ɑː ... barn (bɑːn)\n"
1294 "ɔː ... born (bɔːn)\n"
1295 "uː ... boon (buːn)\n"
1296 "ɜː ... burn (bɜːn)\n"
1297 "eː ... Ger. Schnee (ʃneː)\n"
1298 "ɛː ... Ger. Fähre (ˈfɛːrə)\n"
1299 "aː ... Ger. Tag (taːk)\n"
1300 "oː ... Ger. Sohn (zoːn)\n"
1301 "øː ... Ger. Goethe (gøːtə)\n"
1302 "yː ... Ger. grün (gryːn)\n"
1305 "ɛ˜, æ˜ as in Fr. fin (fɛ˜, fæ˜)\n"
1306 "ã ... Fr. franc (frã)\n"
1307 "ɔ˜ ... Fr. bon (bɔ˜n)\n"
1308 "œ˜ ... Fr. un (œ˜)\n"
1311 "eɪ as in bay (beɪ)\n"
1312 "aɪ ... buy (baɪ)\n"
1313 "ɔɪ ... boy (bɔɪ)\n"
1315 "aʊ ... now (naʊ)\n"
1316 "ɪə ... peer (pɪə(r))\n"
1317 "ɛə ... pair (pɛə(r))\n"
1318 "ʊə ... tour (tʊə(r))\n"
1319 "ɔə ... boar (bɔə(r))\n"
1323 "Main stress: ˈ preceding stressed syllable\n"
1324 "Secondary stress: ˌ preceding stressed syllable\n"
1326 "E.g.: pronunciation (prəˌnʌnsɪˈeɪʃ(ə)n)\n";
1327 /* TODO: find transcriptions of foreign consonents, œ, ʏ, nasals */
1332 Bprint(bout, "%s", prkey);
1336 * f points just after a '&', fe points at end of entry.
1337 * Accumulate the special name, starting after the &
1338 * and continuing until the next '.', in spec[].
1339 * Return pointer to char after '.'.
1342 getspec(char *f, char *fe)
1351 if(c == '.' || f == fe)
1360 * f points just after '<'; fe points at end of entry.
1361 * Expect next characters from bin to match:
1362 * [/][^ >]+( [^>=]+=[^ >]+)*>
1363 * tag auxname auxval
1364 * Accumulate the tag and its auxilliary information in
1365 * tag[], auxname[][] and auxval[][].
1366 * Set tagstarts=1 if the tag is 'starting' (has no '/'), else 0.
1367 * Set naux to the number of aux pairs found.
1368 * Return pointer to after final '>'.
1371 gettag(char *f, char *fe)
1388 if(c == '>' || f == fe)
1396 } else if(naux && c == '=') {
1414 if(strcmp(s, "obs") == 0)
1416 else if(strcmp(s, "ali") == 0)
1418 else if(strcmp(s, "err") == 0 || strcmp(s, "spu") == 0)
1420 else if(strcmp(s, "xref") == 0)
1423 err("status %ld %d %s", curentry.doff, cursize, s);