1/*	$Id: roff.h,v 1.69 2019/03/04 13:01:57 schwarze Exp $	*/
2/*
3 * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
4 * Copyright (c) 2013-2015, 2017-2019 Ingo Schwarze <schwarze@openbsd.org>
5 *
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 *
18 * Common data types for all syntax trees and related functions.
19 */
20
21struct	ohash;
22struct	mdoc_arg;
23union	mdoc_data;
24struct	tbl_span;
25struct	eqn_box;
26
27enum	roff_macroset {
28	MACROSET_NONE = 0,
29	MACROSET_MDOC,
30	MACROSET_MAN
31};
32
33enum	roff_sec {
34	SEC_NONE = 0,
35	SEC_NAME,
36	SEC_LIBRARY,
37	SEC_SYNOPSIS,
38	SEC_DESCRIPTION,
39	SEC_CONTEXT,
40	SEC_IMPLEMENTATION,	/* IMPLEMENTATION NOTES */
41	SEC_RETURN_VALUES,
42	SEC_ENVIRONMENT,
43	SEC_FILES,
44	SEC_EXIT_STATUS,
45	SEC_EXAMPLES,
46	SEC_DIAGNOSTICS,
47	SEC_COMPATIBILITY,
48	SEC_ERRORS,
49	SEC_SEE_ALSO,
50	SEC_STANDARDS,
51	SEC_HISTORY,
52	SEC_AUTHORS,
53	SEC_CAVEATS,
54	SEC_BUGS,
55	SEC_SECURITY,
56	SEC_CUSTOM,
57	SEC__MAX
58};
59
60enum	roff_type {
61	ROFFT_ROOT,
62	ROFFT_BLOCK,
63	ROFFT_HEAD,
64	ROFFT_BODY,
65	ROFFT_TAIL,
66	ROFFT_ELEM,
67	ROFFT_TEXT,
68	ROFFT_COMMENT,
69	ROFFT_TBL,
70	ROFFT_EQN
71};
72
73enum	roff_tok {
74	ROFF_br = 0,
75	ROFF_ce,
76	ROFF_fi,
77	ROFF_ft,
78	ROFF_ll,
79	ROFF_mc,
80	ROFF_nf,
81	ROFF_po,
82	ROFF_rj,
83	ROFF_sp,
84	ROFF_ta,
85	ROFF_ti,
86	ROFF_MAX,
87	ROFF_ab,
88	ROFF_ad,
89	ROFF_af,
90	ROFF_aln,
91	ROFF_als,
92	ROFF_am,
93	ROFF_am1,
94	ROFF_ami,
95	ROFF_ami1,
96	ROFF_as,
97	ROFF_as1,
98	ROFF_asciify,
99	ROFF_backtrace,
100	ROFF_bd,
101	ROFF_bleedat,
102	ROFF_blm,
103	ROFF_box,
104	ROFF_boxa,
105	ROFF_bp,
106	ROFF_BP,
107	ROFF_break,
108	ROFF_breakchar,
109	ROFF_brnl,
110	ROFF_brp,
111	ROFF_brpnl,
112	ROFF_c2,
113	ROFF_cc,
114	ROFF_cf,
115	ROFF_cflags,
116	ROFF_ch,
117	ROFF_char,
118	ROFF_chop,
119	ROFF_class,
120	ROFF_close,
121	ROFF_CL,
122	ROFF_color,
123	ROFF_composite,
124	ROFF_continue,
125	ROFF_cp,
126	ROFF_cropat,
127	ROFF_cs,
128	ROFF_cu,
129	ROFF_da,
130	ROFF_dch,
131	ROFF_Dd,
132	ROFF_de,
133	ROFF_de1,
134	ROFF_defcolor,
135	ROFF_dei,
136	ROFF_dei1,
137	ROFF_device,
138	ROFF_devicem,
139	ROFF_di,
140	ROFF_do,
141	ROFF_ds,
142	ROFF_ds1,
143	ROFF_dwh,
144	ROFF_dt,
145	ROFF_ec,
146	ROFF_ecr,
147	ROFF_ecs,
148	ROFF_el,
149	ROFF_em,
150	ROFF_EN,
151	ROFF_eo,
152	ROFF_EP,
153	ROFF_EQ,
154	ROFF_errprint,
155	ROFF_ev,
156	ROFF_evc,
157	ROFF_ex,
158	ROFF_fallback,
159	ROFF_fam,
160	ROFF_fc,
161	ROFF_fchar,
162	ROFF_fcolor,
163	ROFF_fdeferlig,
164	ROFF_feature,
165	ROFF_fkern,
166	ROFF_fl,
167	ROFF_flig,
168	ROFF_fp,
169	ROFF_fps,
170	ROFF_fschar,
171	ROFF_fspacewidth,
172	ROFF_fspecial,
173	ROFF_ftr,
174	ROFF_fzoom,
175	ROFF_gcolor,
176	ROFF_hc,
177	ROFF_hcode,
178	ROFF_hidechar,
179	ROFF_hla,
180	ROFF_hlm,
181	ROFF_hpf,
182	ROFF_hpfa,
183	ROFF_hpfcode,
184	ROFF_hw,
185	ROFF_hy,
186	ROFF_hylang,
187	ROFF_hylen,
188	ROFF_hym,
189	ROFF_hypp,
190	ROFF_hys,
191	ROFF_ie,
192	ROFF_if,
193	ROFF_ig,
194	/* MAN_in; ignored in mdoc(7) */
195	ROFF_index,
196	ROFF_it,
197	ROFF_itc,
198	ROFF_IX,
199	ROFF_kern,
200	ROFF_kernafter,
201	ROFF_kernbefore,
202	ROFF_kernpair,
203	ROFF_lc,
204	ROFF_lc_ctype,
205	ROFF_lds,
206	ROFF_length,
207	ROFF_letadj,
208	ROFF_lf,
209	ROFF_lg,
210	ROFF_lhang,
211	ROFF_linetabs,
212	ROFF_lnr,
213	ROFF_lnrf,
214	ROFF_lpfx,
215	ROFF_ls,
216	ROFF_lsm,
217	ROFF_lt,
218	ROFF_mediasize,
219	ROFF_minss,
220	ROFF_mk,
221	ROFF_mso,
222	ROFF_na,
223	ROFF_ne,
224	ROFF_nh,
225	ROFF_nhychar,
226	ROFF_nm,
227	ROFF_nn,
228	ROFF_nop,
229	ROFF_nr,
230	ROFF_nrf,
231	ROFF_nroff,
232	ROFF_ns,
233	ROFF_nx,
234	ROFF_open,
235	ROFF_opena,
236	ROFF_os,
237	ROFF_output,
238	ROFF_padj,
239	ROFF_papersize,
240	ROFF_pc,
241	ROFF_pev,
242	ROFF_pi,
243	ROFF_PI,
244	ROFF_pl,
245	ROFF_pm,
246	ROFF_pn,
247	ROFF_pnr,
248	ROFF_ps,
249	ROFF_psbb,
250	ROFF_pshape,
251	ROFF_pso,
252	ROFF_ptr,
253	ROFF_pvs,
254	ROFF_rchar,
255	ROFF_rd,
256	ROFF_recursionlimit,
257	ROFF_return,
258	ROFF_rfschar,
259	ROFF_rhang,
260	ROFF_rm,
261	ROFF_rn,
262	ROFF_rnn,
263	ROFF_rr,
264	ROFF_rs,
265	ROFF_rt,
266	ROFF_schar,
267	ROFF_sentchar,
268	ROFF_shc,
269	ROFF_shift,
270	ROFF_sizes,
271	ROFF_so,
272	ROFF_spacewidth,
273	ROFF_special,
274	ROFF_spreadwarn,
275	ROFF_ss,
276	ROFF_sty,
277	ROFF_substring,
278	ROFF_sv,
279	ROFF_sy,
280	ROFF_T_,
281	ROFF_tc,
282	ROFF_TE,
283	ROFF_TH,
284	ROFF_tkf,
285	ROFF_tl,
286	ROFF_tm,
287	ROFF_tm1,
288	ROFF_tmc,
289	ROFF_tr,
290	ROFF_track,
291	ROFF_transchar,
292	ROFF_trf,
293	ROFF_trimat,
294	ROFF_trin,
295	ROFF_trnt,
296	ROFF_troff,
297	ROFF_TS,
298	ROFF_uf,
299	ROFF_ul,
300	ROFF_unformat,
301	ROFF_unwatch,
302	ROFF_unwatchn,
303	ROFF_vpt,
304	ROFF_vs,
305	ROFF_warn,
306	ROFF_warnscale,
307	ROFF_watch,
308	ROFF_watchlength,
309	ROFF_watchn,
310	ROFF_wh,
311	ROFF_while,
312	ROFF_write,
313	ROFF_writec,
314	ROFF_writem,
315	ROFF_xflag,
316	ROFF_cblock,
317	ROFF_RENAMED,
318	ROFF_USERDEF,
319	TOKEN_NONE,
320	MDOC_Dd,
321	MDOC_Dt,
322	MDOC_Os,
323	MDOC_Sh,
324	MDOC_Ss,
325	MDOC_Pp,
326	MDOC_D1,
327	MDOC_Dl,
328	MDOC_Bd,
329	MDOC_Ed,
330	MDOC_Bl,
331	MDOC_El,
332	MDOC_It,
333	MDOC_Ad,
334	MDOC_An,
335	MDOC_Ap,
336	MDOC_Ar,
337	MDOC_Cd,
338	MDOC_Cm,
339	MDOC_Dv,
340	MDOC_Er,
341	MDOC_Ev,
342	MDOC_Ex,
343	MDOC_Fa,
344	MDOC_Fd,
345	MDOC_Fl,
346	MDOC_Fn,
347	MDOC_Ft,
348	MDOC_Ic,
349	MDOC_In,
350	MDOC_Li,
351	MDOC_Nd,
352	MDOC_Nm,
353	MDOC_Op,
354	MDOC_Ot,
355	MDOC_Pa,
356	MDOC_Rv,
357	MDOC_St,
358	MDOC_Va,
359	MDOC_Vt,
360	MDOC_Xr,
361	MDOC__A,
362	MDOC__B,
363	MDOC__D,
364	MDOC__I,
365	MDOC__J,
366	MDOC__N,
367	MDOC__O,
368	MDOC__P,
369	MDOC__R,
370	MDOC__T,
371	MDOC__V,
372	MDOC_Ac,
373	MDOC_Ao,
374	MDOC_Aq,
375	MDOC_At,
376	MDOC_Bc,
377	MDOC_Bf,
378	MDOC_Bo,
379	MDOC_Bq,
380	MDOC_Bsx,
381	MDOC_Bx,
382	MDOC_Db,
383	MDOC_Dc,
384	MDOC_Do,
385	MDOC_Dq,
386	MDOC_Ec,
387	MDOC_Ef,
388	MDOC_Em,
389	MDOC_Eo,
390	MDOC_Fx,
391	MDOC_Ms,
392	MDOC_No,
393	MDOC_Ns,
394	MDOC_Nx,
395	MDOC_Ox,
396	MDOC_Pc,
397	MDOC_Pf,
398	MDOC_Po,
399	MDOC_Pq,
400	MDOC_Qc,
401	MDOC_Ql,
402	MDOC_Qo,
403	MDOC_Qq,
404	MDOC_Re,
405	MDOC_Rs,
406	MDOC_Sc,
407	MDOC_So,
408	MDOC_Sq,
409	MDOC_Sm,
410	MDOC_Sx,
411	MDOC_Sy,
412	MDOC_Tn,
413	MDOC_Ux,
414	MDOC_Xc,
415	MDOC_Xo,
416	MDOC_Fo,
417	MDOC_Fc,
418	MDOC_Oo,
419	MDOC_Oc,
420	MDOC_Bk,
421	MDOC_Ek,
422	MDOC_Bt,
423	MDOC_Hf,
424	MDOC_Fr,
425	MDOC_Ud,
426	MDOC_Lb,
427	MDOC_Lp,
428	MDOC_Lk,
429	MDOC_Mt,
430	MDOC_Brq,
431	MDOC_Bro,
432	MDOC_Brc,
433	MDOC__C,
434	MDOC_Es,
435	MDOC_En,
436	MDOC_Dx,
437	MDOC__Q,
438	MDOC__U,
439	MDOC_Ta,
440	MDOC_MAX,
441	MAN_TH,
442	MAN_SH,
443	MAN_SS,
444	MAN_TP,
445	MAN_TQ,
446	MAN_LP,
447	MAN_PP,
448	MAN_P,
449	MAN_IP,
450	MAN_HP,
451	MAN_SM,
452	MAN_SB,
453	MAN_BI,
454	MAN_IB,
455	MAN_BR,
456	MAN_RB,
457	MAN_R,
458	MAN_B,
459	MAN_I,
460	MAN_IR,
461	MAN_RI,
462	MAN_RE,
463	MAN_RS,
464	MAN_DT,
465	MAN_UC,
466	MAN_PD,
467	MAN_AT,
468	MAN_in,
469	MAN_SY,
470	MAN_YS,
471	MAN_OP,
472	MAN_EX,
473	MAN_EE,
474	MAN_UR,
475	MAN_UE,
476	MAN_MT,
477	MAN_ME,
478	MAN_MAX
479};
480
481/*
482 * Indicates that a BODY's formatting has ended, but
483 * the scope is still open.  Used for badly nested blocks.
484 */
485enum	mdoc_endbody {
486	ENDBODY_NOT = 0,
487	ENDBODY_SPACE	/* Is broken: append a space. */
488};
489
490enum	mandoc_os {
491	MANDOC_OS_OTHER = 0,
492	MANDOC_OS_NETBSD,
493	MANDOC_OS_OPENBSD
494};
495
496struct	roff_node {
497	struct roff_node *parent;  /* Parent AST node. */
498	struct roff_node *child;   /* First child AST node. */
499	struct roff_node *last;    /* Last child AST node. */
500	struct roff_node *next;    /* Sibling AST node. */
501	struct roff_node *prev;    /* Prior sibling AST node. */
502	struct roff_node *head;    /* BLOCK */
503	struct roff_node *body;    /* BLOCK/ENDBODY */
504	struct roff_node *tail;    /* BLOCK */
505	struct mdoc_arg	 *args;    /* BLOCK/ELEM */
506	union mdoc_data	 *norm;    /* Normalized arguments. */
507	char		 *string;  /* TEXT */
508	struct tbl_span	 *span;    /* TBL */
509	struct eqn_box	 *eqn;     /* EQN */
510	int		  line;    /* Input file line number. */
511	int		  pos;     /* Input file column number. */
512	int		  flags;
513#define	NODE_VALID	 (1 << 0)  /* Has been validated. */
514#define	NODE_ENDED	 (1 << 1)  /* Gone past body end mark. */
515#define	NODE_BROKEN	 (1 << 2)  /* Must validate parent when ending. */
516#define	NODE_LINE	 (1 << 3)  /* First macro/text on line. */
517#define	NODE_DELIMO	 (1 << 4)
518#define	NODE_DELIMC	 (1 << 5)
519#define	NODE_EOS	 (1 << 6)  /* At sentence boundary. */
520#define	NODE_SYNPRETTY	 (1 << 7)  /* SYNOPSIS-style formatting. */
521#define	NODE_NOFILL	 (1 << 8)  /* Fill mode switched off. */
522#define	NODE_NOSRC	 (1 << 9)  /* Generated node, not in input file. */
523#define	NODE_NOPRT	 (1 << 10) /* Shall not print anything. */
524	int		  prev_font; /* Before entering this node. */
525	int		  aux;     /* Decoded node data, type-dependent. */
526	enum roff_tok	  tok;     /* Request or macro ID. */
527	enum roff_type	  type;    /* AST node type. */
528	enum roff_sec	  sec;     /* Current named section. */
529	enum mdoc_endbody end;     /* BODY */
530};
531
532struct	roff_meta {
533	struct roff_node *first;   /* The first node parsed. */
534	char		 *msec;    /* Manual section, usually a digit. */
535	char		 *vol;     /* Manual volume title. */
536	char		 *os;      /* Operating system. */
537	char		 *arch;    /* Machine architecture. */
538	char		 *title;   /* Manual title, usually CAPS. */
539	char		 *name;    /* Leading manual name. */
540	char		 *date;    /* Normalized date. */
541	char		 *sodest;  /* .so target file name or NULL. */
542	int		  hasbody; /* Document is not empty. */
543	int		  rcsids;  /* Bits indexed by enum mandoc_os. */
544	enum mandoc_os	  os_e;    /* Operating system. */
545	enum roff_macroset macroset; /* Kind of high-level macros used. */
546};
547
548extern	const char *const *roff_name;
549
550
551int		 arch_valid(const char *, enum mandoc_os);
552void		 deroff(char **, const struct roff_node *);
553