xref: /minix3/external/bsd/mdocml/dist/mdoc.h (revision 0a6a1f1d05b60e214de2f05a7310ddd1f0e590e7)
1*0a6a1f1dSLionel Sambuc /*	Id: mdoc.h,v 1.125 2013/12/24 19:11:45 schwarze Exp  */
2d65f6f70SBen Gras /*
392395e9cSLionel Sambuc  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
4d65f6f70SBen Gras  *
5d65f6f70SBen Gras  * Permission to use, copy, modify, and distribute this software for any
6d65f6f70SBen Gras  * purpose with or without fee is hereby granted, provided that the above
7d65f6f70SBen Gras  * copyright notice and this permission notice appear in all copies.
8d65f6f70SBen Gras  *
9d65f6f70SBen Gras  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10d65f6f70SBen Gras  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11d65f6f70SBen Gras  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12d65f6f70SBen Gras  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13d65f6f70SBen Gras  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14d65f6f70SBen Gras  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15d65f6f70SBen Gras  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16d65f6f70SBen Gras  */
17d65f6f70SBen Gras #ifndef MDOC_H
18d65f6f70SBen Gras #define MDOC_H
19d65f6f70SBen Gras 
20d65f6f70SBen Gras enum	mdoct {
21d65f6f70SBen Gras 	MDOC_Ap = 0,
22d65f6f70SBen Gras 	MDOC_Dd,
23d65f6f70SBen Gras 	MDOC_Dt,
24d65f6f70SBen Gras 	MDOC_Os,
25d65f6f70SBen Gras 	MDOC_Sh,
26d65f6f70SBen Gras 	MDOC_Ss,
27d65f6f70SBen Gras 	MDOC_Pp,
28d65f6f70SBen Gras 	MDOC_D1,
29d65f6f70SBen Gras 	MDOC_Dl,
30d65f6f70SBen Gras 	MDOC_Bd,
31d65f6f70SBen Gras 	MDOC_Ed,
32d65f6f70SBen Gras 	MDOC_Bl,
33d65f6f70SBen Gras 	MDOC_El,
34d65f6f70SBen Gras 	MDOC_It,
35d65f6f70SBen Gras 	MDOC_Ad,
36d65f6f70SBen Gras 	MDOC_An,
37d65f6f70SBen Gras 	MDOC_Ar,
38d65f6f70SBen Gras 	MDOC_Cd,
39d65f6f70SBen Gras 	MDOC_Cm,
40d65f6f70SBen Gras 	MDOC_Dv,
41d65f6f70SBen Gras 	MDOC_Er,
42d65f6f70SBen Gras 	MDOC_Ev,
43d65f6f70SBen Gras 	MDOC_Ex,
44d65f6f70SBen Gras 	MDOC_Fa,
45d65f6f70SBen Gras 	MDOC_Fd,
46d65f6f70SBen Gras 	MDOC_Fl,
47d65f6f70SBen Gras 	MDOC_Fn,
48d65f6f70SBen Gras 	MDOC_Ft,
49d65f6f70SBen Gras 	MDOC_Ic,
50d65f6f70SBen Gras 	MDOC_In,
51d65f6f70SBen Gras 	MDOC_Li,
52d65f6f70SBen Gras 	MDOC_Nd,
53d65f6f70SBen Gras 	MDOC_Nm,
54d65f6f70SBen Gras 	MDOC_Op,
55d65f6f70SBen Gras 	MDOC_Ot,
56d65f6f70SBen Gras 	MDOC_Pa,
57d65f6f70SBen Gras 	MDOC_Rv,
58d65f6f70SBen Gras 	MDOC_St,
59d65f6f70SBen Gras 	MDOC_Va,
60d65f6f70SBen Gras 	MDOC_Vt,
61d65f6f70SBen Gras 	MDOC_Xr,
62d65f6f70SBen Gras 	MDOC__A,
63d65f6f70SBen Gras 	MDOC__B,
64d65f6f70SBen Gras 	MDOC__D,
65d65f6f70SBen Gras 	MDOC__I,
66d65f6f70SBen Gras 	MDOC__J,
67d65f6f70SBen Gras 	MDOC__N,
68d65f6f70SBen Gras 	MDOC__O,
69d65f6f70SBen Gras 	MDOC__P,
70d65f6f70SBen Gras 	MDOC__R,
71d65f6f70SBen Gras 	MDOC__T,
72d65f6f70SBen Gras 	MDOC__V,
73d65f6f70SBen Gras 	MDOC_Ac,
74d65f6f70SBen Gras 	MDOC_Ao,
75d65f6f70SBen Gras 	MDOC_Aq,
76d65f6f70SBen Gras 	MDOC_At,
77d65f6f70SBen Gras 	MDOC_Bc,
78d65f6f70SBen Gras 	MDOC_Bf,
79d65f6f70SBen Gras 	MDOC_Bo,
80d65f6f70SBen Gras 	MDOC_Bq,
81d65f6f70SBen Gras 	MDOC_Bsx,
82d65f6f70SBen Gras 	MDOC_Bx,
83d65f6f70SBen Gras 	MDOC_Db,
84d65f6f70SBen Gras 	MDOC_Dc,
85d65f6f70SBen Gras 	MDOC_Do,
86d65f6f70SBen Gras 	MDOC_Dq,
87d65f6f70SBen Gras 	MDOC_Ec,
88d65f6f70SBen Gras 	MDOC_Ef,
89d65f6f70SBen Gras 	MDOC_Em,
90d65f6f70SBen Gras 	MDOC_Eo,
91d65f6f70SBen Gras 	MDOC_Fx,
92d65f6f70SBen Gras 	MDOC_Ms,
93d65f6f70SBen Gras 	MDOC_No,
94d65f6f70SBen Gras 	MDOC_Ns,
95d65f6f70SBen Gras 	MDOC_Nx,
96d65f6f70SBen Gras 	MDOC_Ox,
97d65f6f70SBen Gras 	MDOC_Pc,
98d65f6f70SBen Gras 	MDOC_Pf,
99d65f6f70SBen Gras 	MDOC_Po,
100d65f6f70SBen Gras 	MDOC_Pq,
101d65f6f70SBen Gras 	MDOC_Qc,
102d65f6f70SBen Gras 	MDOC_Ql,
103d65f6f70SBen Gras 	MDOC_Qo,
104d65f6f70SBen Gras 	MDOC_Qq,
105d65f6f70SBen Gras 	MDOC_Re,
106d65f6f70SBen Gras 	MDOC_Rs,
107d65f6f70SBen Gras 	MDOC_Sc,
108d65f6f70SBen Gras 	MDOC_So,
109d65f6f70SBen Gras 	MDOC_Sq,
110d65f6f70SBen Gras 	MDOC_Sm,
111d65f6f70SBen Gras 	MDOC_Sx,
112d65f6f70SBen Gras 	MDOC_Sy,
113d65f6f70SBen Gras 	MDOC_Tn,
114d65f6f70SBen Gras 	MDOC_Ux,
115d65f6f70SBen Gras 	MDOC_Xc,
116d65f6f70SBen Gras 	MDOC_Xo,
117d65f6f70SBen Gras 	MDOC_Fo,
118d65f6f70SBen Gras 	MDOC_Fc,
119d65f6f70SBen Gras 	MDOC_Oo,
120d65f6f70SBen Gras 	MDOC_Oc,
121d65f6f70SBen Gras 	MDOC_Bk,
122d65f6f70SBen Gras 	MDOC_Ek,
123d65f6f70SBen Gras 	MDOC_Bt,
124d65f6f70SBen Gras 	MDOC_Hf,
125d65f6f70SBen Gras 	MDOC_Fr,
126d65f6f70SBen Gras 	MDOC_Ud,
127d65f6f70SBen Gras 	MDOC_Lb,
128d65f6f70SBen Gras 	MDOC_Lp,
129d65f6f70SBen Gras 	MDOC_Lk,
130d65f6f70SBen Gras 	MDOC_Mt,
131d65f6f70SBen Gras 	MDOC_Brq,
132d65f6f70SBen Gras 	MDOC_Bro,
133d65f6f70SBen Gras 	MDOC_Brc,
134d65f6f70SBen Gras 	MDOC__C,
135d65f6f70SBen Gras 	MDOC_Es,
136d65f6f70SBen Gras 	MDOC_En,
137d65f6f70SBen Gras 	MDOC_Dx,
138d65f6f70SBen Gras 	MDOC__Q,
139d65f6f70SBen Gras 	MDOC_br,
140d65f6f70SBen Gras 	MDOC_sp,
141d65f6f70SBen Gras 	MDOC__U,
142d65f6f70SBen Gras 	MDOC_Ta,
143d65f6f70SBen Gras 	MDOC_MAX
144d65f6f70SBen Gras };
145d65f6f70SBen Gras 
146d65f6f70SBen Gras enum	mdocargt {
14792395e9cSLionel Sambuc 	MDOC_Split, /* -split */
14892395e9cSLionel Sambuc 	MDOC_Nosplit, /* -nospli */
14992395e9cSLionel Sambuc 	MDOC_Ragged, /* -ragged */
15092395e9cSLionel Sambuc 	MDOC_Unfilled, /* -unfilled */
15192395e9cSLionel Sambuc 	MDOC_Literal, /* -literal */
15292395e9cSLionel Sambuc 	MDOC_File, /* -file */
15392395e9cSLionel Sambuc 	MDOC_Offset, /* -offset */
15492395e9cSLionel Sambuc 	MDOC_Bullet, /* -bullet */
15592395e9cSLionel Sambuc 	MDOC_Dash, /* -dash */
15692395e9cSLionel Sambuc 	MDOC_Hyphen, /* -hyphen */
15792395e9cSLionel Sambuc 	MDOC_Item, /* -item */
15892395e9cSLionel Sambuc 	MDOC_Enum, /* -enum */
15992395e9cSLionel Sambuc 	MDOC_Tag, /* -tag */
16092395e9cSLionel Sambuc 	MDOC_Diag, /* -diag */
16192395e9cSLionel Sambuc 	MDOC_Hang, /* -hang */
16292395e9cSLionel Sambuc 	MDOC_Ohang, /* -ohang */
16392395e9cSLionel Sambuc 	MDOC_Inset, /* -inset */
16492395e9cSLionel Sambuc 	MDOC_Column, /* -column */
16592395e9cSLionel Sambuc 	MDOC_Width, /* -width */
16692395e9cSLionel Sambuc 	MDOC_Compact, /* -compact */
16792395e9cSLionel Sambuc 	MDOC_Std, /* -std */
16892395e9cSLionel Sambuc 	MDOC_Filled, /* -filled */
16992395e9cSLionel Sambuc 	MDOC_Words, /* -words */
17092395e9cSLionel Sambuc 	MDOC_Emphasis, /* -emphasis */
17192395e9cSLionel Sambuc 	MDOC_Symbolic, /* -symbolic */
17292395e9cSLionel Sambuc 	MDOC_Nested, /* -nested */
17392395e9cSLionel Sambuc 	MDOC_Centred, /* -centered */
174d65f6f70SBen Gras 	MDOC_ARG_MAX
175d65f6f70SBen Gras };
176d65f6f70SBen Gras 
177d65f6f70SBen Gras enum	mdoc_type {
178d65f6f70SBen Gras 	MDOC_TEXT,
179d65f6f70SBen Gras 	MDOC_ELEM,
180d65f6f70SBen Gras 	MDOC_HEAD,
181d65f6f70SBen Gras 	MDOC_TAIL,
182d65f6f70SBen Gras 	MDOC_BODY,
183d65f6f70SBen Gras 	MDOC_BLOCK,
184d65f6f70SBen Gras 	MDOC_TBL,
18592395e9cSLionel Sambuc 	MDOC_EQN,
186d65f6f70SBen Gras 	MDOC_ROOT
187d65f6f70SBen Gras };
188d65f6f70SBen Gras 
189d65f6f70SBen Gras /*
190d65f6f70SBen Gras  * Section (named/unnamed) of `Sh'.   Note that these appear in the
19192395e9cSLionel Sambuc  * conventional order imposed by mdoc.7.  In the case of SEC_NONE, no
19292395e9cSLionel Sambuc  * section has been invoked (this shouldn't happen).  SEC_CUSTOM refers
19392395e9cSLionel Sambuc  * to other sections.
194d65f6f70SBen Gras  */
195d65f6f70SBen Gras enum	mdoc_sec {
19692395e9cSLionel Sambuc 	SEC_NONE = 0,
19792395e9cSLionel Sambuc 	SEC_NAME, /* NAME */
19892395e9cSLionel Sambuc 	SEC_LIBRARY, /* LIBRARY */
19992395e9cSLionel Sambuc 	SEC_SYNOPSIS, /* SYNOPSIS */
20092395e9cSLionel Sambuc 	SEC_DESCRIPTION, /* DESCRIPTION */
20192395e9cSLionel Sambuc 	SEC_IMPLEMENTATION, /* IMPLEMENTATION NOTES */
20292395e9cSLionel Sambuc 	SEC_RETURN_VALUES, /* RETURN VALUES */
20392395e9cSLionel Sambuc 	SEC_ENVIRONMENT,  /* ENVIRONMENT */
20492395e9cSLionel Sambuc 	SEC_FILES, /* FILES */
20592395e9cSLionel Sambuc 	SEC_EXIT_STATUS, /* EXIT STATUS */
20692395e9cSLionel Sambuc 	SEC_EXAMPLES, /* EXAMPLES */
20792395e9cSLionel Sambuc 	SEC_DIAGNOSTICS, /* DIAGNOSTICS */
20892395e9cSLionel Sambuc 	SEC_COMPATIBILITY, /* COMPATIBILITY */
20992395e9cSLionel Sambuc 	SEC_ERRORS, /* ERRORS */
21092395e9cSLionel Sambuc 	SEC_SEE_ALSO, /* SEE ALSO */
21192395e9cSLionel Sambuc 	SEC_STANDARDS, /* STANDARDS */
21292395e9cSLionel Sambuc 	SEC_HISTORY, /* HISTORY */
21392395e9cSLionel Sambuc 	SEC_AUTHORS, /* AUTHORS */
21492395e9cSLionel Sambuc 	SEC_CAVEATS, /* CAVEATS */
21592395e9cSLionel Sambuc 	SEC_BUGS, /* BUGS */
21692395e9cSLionel Sambuc 	SEC_SECURITY, /* SECURITY */
21792395e9cSLionel Sambuc 	SEC_CUSTOM,
218d65f6f70SBen Gras 	SEC__MAX
219d65f6f70SBen Gras };
220d65f6f70SBen Gras 
221d65f6f70SBen Gras struct	mdoc_meta {
222d65f6f70SBen Gras 	char		 *msec; /* `Dt' section (1, 3p, etc.) */
223d65f6f70SBen Gras 	char		 *vol; /* `Dt' volume (implied) */
224d65f6f70SBen Gras 	char		 *arch; /* `Dt' arch (i386, etc.) */
22592395e9cSLionel Sambuc 	char		 *date; /* `Dd' normalised date */
226d65f6f70SBen Gras 	char		 *title; /* `Dt' title (FOO, etc.) */
227d65f6f70SBen Gras 	char		 *os; /* `Os' system (OpenBSD, etc.) */
228d65f6f70SBen Gras 	char		 *name; /* leading `Nm' name */
229d65f6f70SBen Gras };
230d65f6f70SBen Gras 
231d65f6f70SBen Gras /*
232d65f6f70SBen Gras  * An argument to a macro (multiple values = `-column xxx yyy').
233d65f6f70SBen Gras  */
234d65f6f70SBen Gras struct	mdoc_argv {
235d65f6f70SBen Gras 	enum mdocargt  	  arg; /* type of argument */
236d65f6f70SBen Gras 	int		  line;
237d65f6f70SBen Gras 	int		  pos;
238d65f6f70SBen Gras 	size_t		  sz; /* elements in "value" */
239d65f6f70SBen Gras 	char		**value; /* argument strings */
240d65f6f70SBen Gras };
241d65f6f70SBen Gras 
242d65f6f70SBen Gras /*
243d65f6f70SBen Gras  * Reference-counted macro arguments.  These are refcounted because
244d65f6f70SBen Gras  * blocks have multiple instances of the same arguments spread across
245d65f6f70SBen Gras  * the HEAD, BODY, TAIL, and BLOCK node types.
246d65f6f70SBen Gras  */
247d65f6f70SBen Gras struct 	mdoc_arg {
248d65f6f70SBen Gras 	size_t		  argc;
249d65f6f70SBen Gras 	struct mdoc_argv *argv;
250d65f6f70SBen Gras 	unsigned int	  refcnt;
251d65f6f70SBen Gras };
252d65f6f70SBen Gras 
253d65f6f70SBen Gras /*
254d65f6f70SBen Gras  * Indicates that a BODY's formatting has ended, but the scope is still
255d65f6f70SBen Gras  * open.  Used for syntax-broken blocks.
256d65f6f70SBen Gras  */
257d65f6f70SBen Gras enum	mdoc_endbody {
258d65f6f70SBen Gras 	ENDBODY_NOT = 0,
259d65f6f70SBen Gras 	ENDBODY_SPACE, /* is broken: append a space */
260d65f6f70SBen Gras 	ENDBODY_NOSPACE /* is broken: don't append a space */
261d65f6f70SBen Gras };
262d65f6f70SBen Gras 
263d65f6f70SBen Gras enum	mdoc_list {
264d65f6f70SBen Gras 	LIST__NONE = 0,
26592395e9cSLionel Sambuc 	LIST_bullet, /* -bullet */
26692395e9cSLionel Sambuc 	LIST_column, /* -column */
26792395e9cSLionel Sambuc 	LIST_dash, /* -dash */
26892395e9cSLionel Sambuc 	LIST_diag, /* -diag */
26992395e9cSLionel Sambuc 	LIST_enum, /* -enum */
27092395e9cSLionel Sambuc 	LIST_hang, /* -hang */
27192395e9cSLionel Sambuc 	LIST_hyphen, /* -hyphen */
27292395e9cSLionel Sambuc 	LIST_inset, /* -inset */
27392395e9cSLionel Sambuc 	LIST_item, /* -item */
27492395e9cSLionel Sambuc 	LIST_ohang, /* -ohang */
27592395e9cSLionel Sambuc 	LIST_tag, /* -tag */
276d65f6f70SBen Gras 	LIST_MAX
277d65f6f70SBen Gras };
278d65f6f70SBen Gras 
279d65f6f70SBen Gras enum	mdoc_disp {
280d65f6f70SBen Gras 	DISP__NONE = 0,
28192395e9cSLionel Sambuc 	DISP_centred, /* -centered */
28292395e9cSLionel Sambuc 	DISP_ragged, /* -ragged */
28392395e9cSLionel Sambuc 	DISP_unfilled, /* -unfilled */
28492395e9cSLionel Sambuc 	DISP_filled, /* -filled */
28592395e9cSLionel Sambuc 	DISP_literal /* -literal */
286d65f6f70SBen Gras };
287d65f6f70SBen Gras 
288d65f6f70SBen Gras enum	mdoc_auth {
289d65f6f70SBen Gras 	AUTH__NONE = 0,
29092395e9cSLionel Sambuc 	AUTH_split, /* -split */
29192395e9cSLionel Sambuc 	AUTH_nosplit /* -nosplit */
292d65f6f70SBen Gras };
293d65f6f70SBen Gras 
294d65f6f70SBen Gras enum	mdoc_font {
295d65f6f70SBen Gras 	FONT__NONE = 0,
29692395e9cSLionel Sambuc 	FONT_Em, /* Em, -emphasis */
29792395e9cSLionel Sambuc 	FONT_Li, /* Li, -literal */
29892395e9cSLionel Sambuc 	FONT_Sy /* Sy, -symbolic */
299d65f6f70SBen Gras };
300d65f6f70SBen Gras 
301d65f6f70SBen Gras struct	mdoc_bd {
302d65f6f70SBen Gras 	const char	 *offs; /* -offset */
303d65f6f70SBen Gras 	enum mdoc_disp	  type; /* -ragged, etc. */
304d65f6f70SBen Gras 	int		  comp; /* -compact */
305d65f6f70SBen Gras };
306d65f6f70SBen Gras 
307d65f6f70SBen Gras struct	mdoc_bl {
308d65f6f70SBen Gras 	const char	 *width; /* -width */
309d65f6f70SBen Gras 	const char	 *offs; /* -offset */
310d65f6f70SBen Gras 	enum mdoc_list	  type; /* -tag, -enum, etc. */
311d65f6f70SBen Gras 	int		  comp; /* -compact */
312d65f6f70SBen Gras 	size_t		  ncols; /* -column arg count */
313d65f6f70SBen Gras 	const char	**cols; /* -column val ptr */
314*0a6a1f1dSLionel Sambuc 	int		  count; /* -enum counter */
315d65f6f70SBen Gras };
316d65f6f70SBen Gras 
317d65f6f70SBen Gras struct	mdoc_bf {
318d65f6f70SBen Gras 	enum mdoc_font	  font; /* font */
319d65f6f70SBen Gras };
320d65f6f70SBen Gras 
321d65f6f70SBen Gras struct	mdoc_an {
322d65f6f70SBen Gras 	enum mdoc_auth	  auth; /* -split, etc. */
323d65f6f70SBen Gras };
324d65f6f70SBen Gras 
325d65f6f70SBen Gras struct	mdoc_rs {
32692395e9cSLionel Sambuc 	int		  quote_T; /* whether to quote %T */
327d65f6f70SBen Gras };
328d65f6f70SBen Gras 
329d65f6f70SBen Gras /*
330d65f6f70SBen Gras  * Consists of normalised node arguments.  These should be used instead
331d65f6f70SBen Gras  * of iterating through the mdoc_arg pointers of a node: defaults are
332d65f6f70SBen Gras  * provided, etc.
333d65f6f70SBen Gras  */
334d65f6f70SBen Gras union	mdoc_data {
335d65f6f70SBen Gras 	struct mdoc_an 	  An;
336d65f6f70SBen Gras 	struct mdoc_bd	  Bd;
337d65f6f70SBen Gras 	struct mdoc_bf	  Bf;
338d65f6f70SBen Gras 	struct mdoc_bl	  Bl;
339d65f6f70SBen Gras 	struct mdoc_rs	  Rs;
340d65f6f70SBen Gras };
341d65f6f70SBen Gras 
342d65f6f70SBen Gras /*
343d65f6f70SBen Gras  * Single node in tree-linked AST.
344d65f6f70SBen Gras  */
345d65f6f70SBen Gras struct	mdoc_node {
346d65f6f70SBen Gras 	struct mdoc_node *parent; /* parent AST node */
347d65f6f70SBen Gras 	struct mdoc_node *child; /* first child AST node */
348d65f6f70SBen Gras 	struct mdoc_node *last; /* last child AST node */
349d65f6f70SBen Gras 	struct mdoc_node *next; /* sibling AST node */
350d65f6f70SBen Gras 	struct mdoc_node *prev; /* prior sibling AST node */
351d65f6f70SBen Gras 	int		  nchild; /* number children */
352d65f6f70SBen Gras 	int		  line; /* parse line */
353d65f6f70SBen Gras 	int		  pos; /* parse column */
354*0a6a1f1dSLionel Sambuc 	int		  lastline; /* the node ends on this line */
355d65f6f70SBen Gras 	enum mdoct	  tok; /* tok or MDOC__MAX if none */
356d65f6f70SBen Gras 	int		  flags;
357d65f6f70SBen Gras #define	MDOC_VALID	 (1 << 0) /* has been validated */
358d65f6f70SBen Gras #define	MDOC_EOS	 (1 << 2) /* at sentence boundary */
359d65f6f70SBen Gras #define	MDOC_LINE	 (1 << 3) /* first macro/text on line */
360d65f6f70SBen Gras #define	MDOC_SYNPRETTY	 (1 << 4) /* SYNOPSIS-style formatting */
361d65f6f70SBen Gras #define	MDOC_ENDED	 (1 << 5) /* rendering has been ended */
36292395e9cSLionel Sambuc #define	MDOC_DELIMO	 (1 << 6)
36392395e9cSLionel Sambuc #define	MDOC_DELIMC	 (1 << 7)
364d65f6f70SBen Gras 	enum mdoc_type	  type; /* AST node type */
365d65f6f70SBen Gras 	enum mdoc_sec	  sec; /* current named section */
366d65f6f70SBen Gras 	union mdoc_data	 *norm; /* normalised args */
367*0a6a1f1dSLionel Sambuc 	const void	 *prev_font; /* before entering this node */
368d65f6f70SBen Gras 	/* FIXME: these can be union'd to shave a few bytes. */
369d65f6f70SBen Gras 	struct mdoc_arg	 *args; /* BLOCK/ELEM */
370d65f6f70SBen Gras 	struct mdoc_node *pending; /* BLOCK */
371d65f6f70SBen Gras 	struct mdoc_node *head; /* BLOCK */
372d65f6f70SBen Gras 	struct mdoc_node *body; /* BLOCK */
373d65f6f70SBen Gras 	struct mdoc_node *tail; /* BLOCK */
374d65f6f70SBen Gras 	char		 *string; /* TEXT */
375d65f6f70SBen Gras 	const struct tbl_span *span; /* TBL */
37692395e9cSLionel Sambuc 	const struct eqn *eqn; /* EQN */
377d65f6f70SBen Gras 	enum mdoc_endbody end; /* BODY */
378d65f6f70SBen Gras };
379d65f6f70SBen Gras 
38092395e9cSLionel Sambuc /* Names of macros.  Index is enum mdoct. */
381d65f6f70SBen Gras extern	const char *const *mdoc_macronames;
382d65f6f70SBen Gras 
38392395e9cSLionel Sambuc /* Names of macro args.  Index is enum mdocargt. */
384d65f6f70SBen Gras extern	const char *const *mdoc_argnames;
385d65f6f70SBen Gras 
386d65f6f70SBen Gras __BEGIN_DECLS
387d65f6f70SBen Gras 
388d65f6f70SBen Gras struct	mdoc;
389d65f6f70SBen Gras 
390d65f6f70SBen Gras const struct mdoc_node *mdoc_node(const struct mdoc *);
391d65f6f70SBen Gras const struct mdoc_meta *mdoc_meta(const struct mdoc *);
392d65f6f70SBen Gras 
393d65f6f70SBen Gras __END_DECLS
394d65f6f70SBen Gras 
395d65f6f70SBen Gras #endif /*!MDOC_H*/
396