1 /* $NetBSD: deroff.c,v 1.6 2009/04/11 13:01:27 lukem Exp $ */
3 /* taken from: OpenBSD: deroff.c,v 1.6 2004/06/02 14:58:46 tom Exp */
6 * Copyright (c) 1988, 1993
7 * The Regents of the University of California. All rights reserved.
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in the
16 * documentation and/or other materials provided with the distribution.
17 * 3. Neither the name of the University nor the names of its contributors
18 * may be used to endorse or promote products derived from this software
19 * without specific prior written permission.
21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34 * Copyright (C) Caldera International Inc. 2001-2002.
35 * All rights reserved.
37 * Redistribution and use in source and binary forms, with or without
38 * modification, are permitted provided that the following conditions
40 * 1. Redistributions of source code and documentation must retain the above
41 * copyright notice, this list of conditions and the following disclaimer.
42 * 2. Redistributions in binary form must reproduce the above copyright
43 * notice, this list of conditions and the following disclaimer in the
44 * documentation and/or other materials provided with the distribution.
45 * 3. All advertising materials mentioning features or use of this software
46 * must display the following acknowledgement:
47 * This product includes software developed or owned by Caldera
49 * 4. Neither the name of Caldera International, Inc. nor the names of other
50 * contributors may be used to endorse or promote products derived from
51 * this software without specific prior written permission.
53 * USE OF THE SOFTWARE PROVIDED FOR UNDER THIS LICENSE BY CALDERA
54 * INTERNATIONAL, INC. AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR
55 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
56 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
57 * IN NO EVENT SHALL CALDERA INTERNATIONAL, INC. BE LIABLE FOR ANY DIRECT,
58 * INDIRECT INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
59 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
60 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
61 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
62 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
63 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
64 * POSSIBILITY OF SUCH DAMAGE.
68 static const char copyright
[] =
69 "@(#) Copyright (c) 1988, 1993\n\
70 The Regents of the University of California. All rights reserved.\n";
75 static const char sccsid
[] = "@(#)deroff.c 8.1 (Berkeley) 6/6/93";
77 static const char rcsid
[] = "$NetBSD: deroff.c,v 1.6 2009/04/11 13:01:27 lukem Exp $";
81 #include <sys/cdefs.h>
91 * Deroff command -- strip troff, eqn, and Tbl sequences from
92 * a file. Has two flags argument, -w, to cause output one word per line
93 * rather than in the original format.
94 * -mm (or -ms) causes the corresponding macro's to be interpreted
95 * so that just sentences are output
96 * -ml also gets rid of lists.
97 * Deroff follows .so and .nx commands, removes contents of macro
98 * definitions, equations (both .EQ ... .EN and $...$),
99 * Tbl command sequences, and Troff backslash constructions.
101 * All input is through the Cget macro;
102 * the most recently read character is in c.
104 * Modified by Robert Henry to process -me and -man macros.
107 #define Cget ( (c=getc(infile)) == EOF ? eof() : ((c==ldelim)&&(filesp==files) ? skeqn() : c) )
108 #define C1get ( (c=getc(infile)) == EOF ? eof() : c)
113 #else /* not DEBUG */
116 #endif /* not DEBUG */
118 #define SKIP while (C != '\n')
119 #define SKIP_TO_COM SKIP; SKIP; pc=c; while (C != '.' || pc != '\n' || C > 'Z')pc=c
123 #define MS 0 /* -ms */
124 #define MM 1 /* -mm */
125 #define ME 2 /* -me */
126 #define MA 3 /* -man */
129 char *mactab
[] = { "-ms", "-mm", "-me", "-ma" };
146 static int msflag
; /* processing a source written using a mac package */
147 static int mac
; /* which package */
152 static int keepblock
; /* keep blocks of text; normally false when msflag */
154 static char chars
[128]; /* SPECIAL, PUNCT, APOS, DIGIT, or LETTER */
156 static char line
[LINE_MAX
];
164 static char fname
[PATH_MAX
];
165 static FILE *files
[MAXFILES
];
166 static FILE **filesp
;
175 * Macro table definitions
177 typedef int pacmac
; /* compressed macro name */
178 static int argconcat
= 0; /* concat arguments together (-me only) */
180 #define tomac(c1, c2) ((((c1) & 0xFF) << 8) | ((c2) & 0xFF))
181 #define frommac(src, c1, c2) (((c1)=((src)>>8)&0xFF),((c2) =(src)&0xFF))
189 static const struct mactab troffmactab
[];
190 static const struct mactab ppmactab
[];
191 static const struct mactab msmactab
[];
192 static const struct mactab mmmactab
[];
193 static const struct mactab memactab
[];
194 static const struct mactab manmactab
[];
197 * Macro table initialization
199 #define M(cond, c1, c2, func) {cond, tomac(c1, c2), func}
202 * Flags for matching conditions other than
206 #define FNEST 1 /* no nested files */
207 #define NOMAC 2 /* no macro */
208 #define MAC 3 /* macro */
209 #define PARAG 4 /* in a paragraph */
210 #define MSF 5 /* msflag is on */
211 #define NBLK 6 /* set if no blocks to be kept */
214 * Return codes from macro minions, determine where to jump,
215 * how to repeat/reprocess text
217 #define COMX 1 /* goto comx */
218 #define COM 2 /* goto com */
220 static int skeqn(void);
221 static int eof(void);
223 static int _C1(void);
226 static int EQ(pacmac
);
227 static int domacro(pacmac
);
228 static int PS(pacmac
);
229 static int skip(pacmac
);
230 static int intbl(pacmac
);
231 static int outtbl(pacmac
);
232 static int so(pacmac
);
233 static int nx(pacmac
);
234 static int skiptocom(pacmac
);
235 static int PP(pacmac
);
236 static int AU(pacmac
);
237 static int SH(pacmac
);
238 static int UX(pacmac
);
239 static int MMHU(pacmac
);
240 static int mesnblock(pacmac
);
241 static int mssnblock(pacmac
);
242 static int nf(pacmac
);
243 static int ce(pacmac
);
244 static int meip(pacmac
);
245 static int mepp(pacmac
);
246 static int mesh(pacmac
);
247 static int mefont(pacmac
);
248 static int manfont(pacmac
);
249 static int manpp(pacmac
);
250 static int macsort(const void *, const void *);
251 static int sizetab(const struct mactab
*);
252 static void getfname(void);
253 static void textline(char *, int);
254 static void work(void);
255 static void regline(void (*)(char *, int), int);
256 static void macro(void);
257 static void tbl(void);
258 static void stbl(void);
259 static void eqn(void);
260 static void backsl(void);
261 static void sce(void);
262 static void refer(int);
263 static void inpic(void);
264 static void msputmac(char *, int);
265 static void msputwords(int);
266 static void meputmac(char *, int);
267 static void meputwords(int);
268 static void noblock(char, char);
269 static void defcomline(pacmac
);
270 static void comline(void);
271 static void buildtab(const struct mactab
**, int *);
272 static FILE *opn(char *);
273 static struct mactab
*macfill(struct mactab
*, const struct mactab
*);
274 static void usage(void) __dead
;
277 main(int ac
, char **av
)
295 while ((ch
= getopt(ac
, av
, "ikpwm:")) != -1) {
326 if (errflg
== 0 && optarg
[1] != '\0')
349 printf("msflag = %d, mac = %s, keepblock = %d, disp = %d\n",
350 msflag
, mactab
[mac
], keepblock
, disp
);
355 infile
= opn(argv
[0]);
362 for (i
= 'a'; i
<= 'z' ; ++i
)
364 for (i
= 'A'; i
<= 'Z'; ++i
)
366 for (i
= '0'; i
<= '9'; ++i
)
383 while ((c
= getc(infile
)) != rdelim
) {
387 while ((c
= getc(infile
)) != '"') {
389 (c
== '\\' && (c
= getc(infile
)) == EOF
))
404 if ((fd
= fopen(p
, "r")) == NULL
)
405 err(1, "fopen %s", p
);
419 infile
= opn(argv
[0]);
435 static struct chain
*namechain
= NULL
;
440 for (p
= fname
; p
- fname
< (ptrdiff_t)sizeof(fname
) &&
442 c
!= ' ' && c
!= '\t' && c
!= '\\'; ++p
)
448 /* see if this name has already been used */
449 for (q
= namechain
; q
; q
= q
->nextp
)
450 if (strcmp(fname
, q
->datap
) == 0) {
455 q
= (struct chain
*) malloc(sizeof(struct chain
));
458 q
->nextp
= namechain
;
459 q
->datap
= strdup(fname
);
460 if (q
->datap
== NULL
)
467 textline(char *str
, int constant
)
484 printf("Starting work with `%c'\n", c
);
485 #endif /* FULLDEBUG */
486 if (c
== '.' || c
== '\'')
489 regline(textline
, TWO
);
494 regline(void (*pfunc
)(char *, int), int constant
)
499 while (lp
- line
< (ptrdiff_t)sizeof(line
)) {
506 if (intable
&& c
== 'T') {
508 if (c
== '{' || c
== '}') {
519 (*pfunc
)(line
, constant
);
529 } while (C
!='.' || C
!='.' || C
=='.'); /* look for .. */
555 if (c
!= 'T' || C
!= 'E') {
558 while (C
!= '.' || pc
!= '\n' || C
!= 'T' || C
!= 'E')
575 if (C1
== '.' || c
== '\'') {
576 while (C1
== ' ' || c
== '\t')
578 if (c
== 'E' && C1
== 'N') {
580 if (msflag
&& dflg
) {
590 } else if (c
== 'd') {
592 if (C1
== 'e' && C1
== 'l')
593 if (C1
== 'i' && C1
== 'm') {
597 if ((c1
= c
) == '\n' ||
599 (c1
== 'o' && c2
== 'f' && C1
=='f')) {
612 if (chars
[c
] == PUNCT
)
620 /* skip over a complete backslash construction */
636 while (C
>= '0' && c
<= '9')
667 C
; /* discard argument number */
678 if ((bdelim
= C
) == '\n')
680 while (C
!= '\n' && c
!= bdelim
)
701 for (ap
= a
; C
!= '\n'; ap
++) {
713 for (i
= 0; i
< n
;) {
727 } else if (c
== 'P' || C
== 'P') {
731 } else if (c
!= '\n')
757 if (c2
!= -1 && chars
[c2
] == PUNCT
)
776 if (C
== '.' && c1
== '\n') {
798 else if (c
== '\"') {
810 else if (c
== '\n' && p1
!= line
) {
840 * Put out a macro line, using ms and mm conventions.
843 msputmac(char *s
, int constant
)
856 while (*s
== ' ' || *s
== '\t')
858 for (t
= s
; *t
!= ' ' && *t
!= '\t' && *t
!= '\0' ; ++t
)
862 if (t
> s
+ constant
&& chars
[(unsigned char)s
[0]] == LETTER
&&
863 chars
[(unsigned char)s
[1]] == LETTER
) {
871 } else if (found
&& chars
[(unsigned char)s
[0]] == PUNCT
&&
880 if (msflag
&& chars
[last
] == PUNCT
) {
887 * put out words (for the -w option) with ms and mm conventions
890 msputwords(int macline
)
897 * skip initial specials ampersands and apostrophes
899 while (chars
[(unsigned char)*p1
] < DIGIT
)
903 for (p
= p1
; (i
= chars
[(unsigned char)*p
]) != SPECIAL
; ++p
)
907 if (nlet
> 1 && chars
[(unsigned char)p1
[0]] == LETTER
) {
909 * delete trailing ampersands and apostrophes
911 while ((i
= chars
[(unsigned char)p
[-1]]) == PUNCT
||
924 * put out a macro using the me conventions
926 #define SKIPBLANK(cp) while (*cp == ' ' || *cp == '\t') { cp++; }
927 #define SKIPNONBLANK(cp) while (*cp !=' ' && *cp !='\cp' && *cp !='\0') { cp++; }
930 meputmac(char *cp
, int constant
)
944 for (argno
= 0; *cp
; argno
++) {
946 inquote
= (*cp
== '"');
949 for (np
= cp
; *np
; np
++) {
963 if (inquote
&& np
[1] == '"') {
964 memmove(np
, np
+ 1, strlen(np
));
968 *np
= ' '; /* bye bye " */
978 * cp points at the first char in the arg
979 * np points one beyond the last char in the arg
981 if ((argconcat
== 0) || (argconcat
!= argno
))
986 printf("[%d,%d: ", argno
, np
- cp
);
987 for (p
= cp
; p
< np
; p
++) {
992 #endif /* FULLDEBUG */
994 * Determine if the argument merits being printed
996 * constant is the cut off point below which something
999 if (((np
- cp
) > constant
) &&
1000 (inquote
|| (chars
[(unsigned char)cp
[0]] == LETTER
))) {
1001 for (cp
= cp
; cp
< np
; cp
++)
1005 } else if (found
&& (np
- cp
== 1) &&
1006 chars
[(unsigned char)*cp
] == PUNCT
) {
1013 if (msflag
&& chars
[last
] == PUNCT
)
1019 * put out words (for the -w option) with ms and mm conventions
1022 meputwords(int macline
)
1025 msputwords(macline
);
1030 * Skip over a nested set of macros
1032 * Possible arguments to noblock are:
1034 * fi end of unfilled text
1038 * for ms and mm only:
1041 * NE undocumented match to NS (for mm?)
1042 * LE mm only: matches RL or *L (for lists)
1048 noblock(char a1
, char a2
)
1063 if ((c1
= C
) == '\n')
1065 if ((c2
= C
) == '\n')
1067 if (c1
== a1
&& c2
== a2
) {
1077 } else if (a1
== 'L' && c2
== 'L') {
1082 * equations (EQ) nested within a display
1084 else if (c1
== 'E' && c2
== 'Q') {
1085 if ((mac
== ME
&& a1
== ')')
1086 || (mac
!= ME
&& a1
== 'D')) {
1092 * turning on filling is done by the paragraphing
1095 else if (a1
== 'f') { /* .fi */
1096 if ((mac
== ME
&& (c2
== 'h' || c2
== 'p'))
1097 || (mac
!= ME
&& (c1
== 'P' || c2
== 'P'))) {
1118 domacro(pacmac unused
)
1130 for (C
; c
== ' ' || c
== '\t'; C
)
1133 if (c
== '<') { /* ".PS < file" -- don't expect a .PE */
1155 intbl(pacmac unused
)
1167 outtbl(pacmac unused
)
1182 if (++filesp
- &files
[0] > MAXFILES
)
1183 err(1, "too many nested files (max %d)",
1185 infile
= *filesp
= opn(fname
);
1198 if (fname
[0] == '\0')
1200 if (infile
!= stdin
)
1202 infile
= *filesp
= opn(fname
);
1209 skiptocom(pacmac unused
)
1221 frommac(c12
, c1
, c2
);
1222 printf(".%c%c", c1
, c2
);
1245 frommac(c12
, c1
, c2
);
1248 printf(".%c%c", c1
, c2
);
1286 frommac(c12
, c1
, c2
);
1288 printf(".%c%c", c1
, c2
);
1299 mesnblock(pacmac c12
)
1303 frommac(c12
, c1
, c2
);
1309 mssnblock(pacmac c12
)
1313 frommac(c12
, c1
, c2
);
1342 else if (wordflag
) /* save the tag */
1343 regline(meputmac
, ONE
);
1350 * only called for -me .pp or .sh, when parag is on
1356 PP(c12
); /* eats the line */
1361 * Start of a section heading; output the section name if doing words
1377 * process a font setting
1404 defcomline(pacmac c12
)
1408 frommac(c12
, c1
, c2
);
1409 if (msflag
&& mac
== MM
&& c2
== 'L') {
1410 if (disp
|| c1
== 'R') {
1417 else if (c1
== '.' && c2
== '.') {
1427 * Process the arguments to the macro
1433 if (c1
<= 'Z' && msflag
)
1434 regline(msputmac
, ONE
);
1436 regline(msputmac
, TWO
);
1439 regline(meputmac
, ONE
);
1454 static int tabsize
= 0;
1455 static const struct mactab
*mactab
= NULL
;
1456 const struct mactab
*mp
;
1459 buildtab(&mactab
, &tabsize
);
1461 while (C
== ' ' || c
== '\t')
1464 if ((c1
= c
) == '\n')
1467 if (c1
== '.' && c2
!= '.')
1469 if (msflag
&& c1
== '[') {
1473 if (parag
&& mac
==MM
&& c1
== 'P' && c2
== '\n') {
1480 * Single letter macro
1482 if (mac
== ME
&& (c2
== ' ' || c2
== '\t') )
1484 c12
= tomac(c1
, c2
);
1486 * binary search through the table of macros
1491 mid
= (ub
+ lb
) / 2;
1493 if (mp
->macname
< c12
)
1495 else if (mp
->macname
> c12
)
1500 printf("preliminary hit macro %c%c ", c1
, c2
);
1501 #endif /* FULLDEBUG */
1502 switch (mp
->condition
) {
1507 hit
= (filesp
== files
);
1528 #endif /* FULLDEBUG */
1529 switch ((*(mp
->func
))(c12
)) {
1540 #endif /* FULLDEBUG */
1548 macsort(const void *p1
, const void *p2
)
1550 const struct mactab
*t1
= p1
;
1551 const struct mactab
*t2
= p2
;
1553 return t1
->macname
- t2
->macname
;
1557 sizetab(const struct mactab
*mp
)
1563 for (; mp
->macname
; mp
++, i
++)
1569 static struct mactab
*
1570 macfill(struct mactab
*dst
, const struct mactab
*src
)
1574 while (src
->macname
)
1583 extern char *__progname
;
1585 fprintf(stderr
, "usage: %s [-ikpw ] [ -m a | e | l | m | s] [file ...]\n", __progname
);
1590 buildtab(const struct mactab
**r_back
, int *r_size
)
1593 const struct mactab
*p1
, *p2
;
1594 struct mactab
*back
, *p
;
1596 size
= sizetab(troffmactab
) + sizetab(ppmactab
);
1617 size
+= sizetab(p1
);
1618 size
+= sizetab(p2
);
1619 back
= calloc(size
+ 2, sizeof(struct mactab
));
1623 p
= macfill(back
, troffmactab
);
1624 p
= macfill(p
, ppmactab
);
1628 qsort(back
, size
, sizeof(struct mactab
), macsort
);
1636 static const struct mactab troffmactab
[] = {
1637 M(NONE
, '\\','"', skip
), /* comment */
1638 M(NOMAC
, 'd','e', domacro
), /* define */
1639 M(NOMAC
, 'i','g', domacro
), /* ignore till .. */
1640 M(NOMAC
, 'a','m', domacro
), /* append macro */
1641 M(NBLK
, 'n','f', nf
), /* filled */
1642 M(NBLK
, 'c','e', ce
), /* centered */
1644 M(NONE
, 's','o', so
), /* source a file */
1645 M(NONE
, 'n','x', nx
), /* go to next file */
1647 M(NONE
, 't','m', skip
), /* print string on tty */
1648 M(NONE
, 'h','w', skip
), /* exception hyphen words */
1653 * Preprocessor output
1655 static const struct mactab ppmactab
[] = {
1656 M(FNEST
, 'E','Q', EQ
), /* equation starting */
1657 M(FNEST
, 'T','S', intbl
), /* table starting */
1658 M(FNEST
, 'T','C', intbl
), /* alternative table? */
1659 M(FNEST
, 'T','&', intbl
), /* table reformatting */
1660 M(NONE
, 'T','E', outtbl
),/* table ending */
1661 M(NONE
, 'P','S', PS
), /* picture starting */
1666 * Particular to ms and mm
1668 static const struct mactab msmactab
[] = {
1669 M(NONE
, 'T','L', skiptocom
), /* title follows */
1670 M(NONE
, 'F','S', skiptocom
), /* start footnote */
1671 M(NONE
, 'O','K', skiptocom
), /* Other kws */
1673 M(NONE
, 'N','R', skip
), /* undocumented */
1674 M(NONE
, 'N','D', skip
), /* use supplied date */
1676 M(PARAG
, 'P','P', PP
), /* begin parag */
1677 M(PARAG
, 'I','P', PP
), /* begin indent parag, tag x */
1678 M(PARAG
, 'L','P', PP
), /* left blocked parag */
1680 M(NONE
, 'A','U', AU
), /* author */
1681 M(NONE
, 'A','I', AU
), /* authors institution */
1683 M(NONE
, 'S','H', SH
), /* section heading */
1684 M(NONE
, 'S','N', SH
), /* undocumented */
1685 M(NONE
, 'U','X', UX
), /* unix */
1687 M(NBLK
, 'D','S', mssnblock
), /* start display text */
1688 M(NBLK
, 'K','S', mssnblock
), /* start keep */
1689 M(NBLK
, 'K','F', mssnblock
), /* start float keep */
1693 static const struct mactab mmmactab
[] = {
1694 M(NONE
, 'H',' ', MMHU
), /* -mm ? */
1695 M(NONE
, 'H','U', MMHU
), /* -mm ? */
1696 M(PARAG
, 'P',' ', PP
), /* paragraph for -mm */
1697 M(NBLK
, 'N','S', mssnblock
), /* undocumented */
1701 static const struct mactab memactab
[] = {
1702 M(PARAG
, 'p','p', mepp
),
1703 M(PARAG
, 'l','p', mepp
),
1704 M(PARAG
, 'n','p', mepp
),
1705 M(NONE
, 'i','p', meip
),
1707 M(NONE
, 's','h', mesh
),
1708 M(NONE
, 'u','h', mesh
),
1710 M(NBLK
, '(','l', mesnblock
),
1711 M(NBLK
, '(','q', mesnblock
),
1712 M(NBLK
, '(','b', mesnblock
),
1713 M(NBLK
, '(','z', mesnblock
),
1714 M(NBLK
, '(','c', mesnblock
),
1716 M(NBLK
, '(','d', mesnblock
),
1717 M(NBLK
, '(','f', mesnblock
),
1718 M(NBLK
, '(','x', mesnblock
),
1720 M(NONE
, 'r',' ', mefont
),
1721 M(NONE
, 'i',' ', mefont
),
1722 M(NONE
, 'b',' ', mefont
),
1723 M(NONE
, 'u',' ', mefont
),
1724 M(NONE
, 'q',' ', mefont
),
1725 M(NONE
, 'r','b', mefont
),
1726 M(NONE
, 'b','i', mefont
),
1727 M(NONE
, 'b','x', mefont
),
1731 static const struct mactab manmactab
[] = {
1732 M(PARAG
, 'B','I', manfont
),
1733 M(PARAG
, 'B','R', manfont
),
1734 M(PARAG
, 'I','B', manfont
),
1735 M(PARAG
, 'I','R', manfont
),
1736 M(PARAG
, 'R','B', manfont
),
1737 M(PARAG
, 'R','I', manfont
),
1739 M(PARAG
, 'P','P', manpp
),
1740 M(PARAG
, 'L','P', manpp
),
1741 M(PARAG
, 'H','P', manpp
),