1241675Suqs/*	$Id: mdoc.h,v 1.122 2011/03/22 14:05:45 kristaps Exp $ */
2241675Suqs/*
3241675Suqs * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
4241675Suqs *
5241675Suqs * Permission to use, copy, modify, and distribute this software for any
6241675Suqs * purpose with or without fee is hereby granted, provided that the above
7241675Suqs * copyright notice and this permission notice appear in all copies.
8241675Suqs *
9241675Suqs * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10241675Suqs * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11241675Suqs * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12241675Suqs * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13241675Suqs * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14241675Suqs * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15241675Suqs * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16241675Suqs */
17241675Suqs#ifndef MDOC_H
18241675Suqs#define MDOC_H
19241675Suqs
20241675Suqsenum	mdoct {
21241675Suqs	MDOC_Ap = 0,
22241675Suqs	MDOC_Dd,
23241675Suqs	MDOC_Dt,
24241675Suqs	MDOC_Os,
25241675Suqs	MDOC_Sh,
26241675Suqs	MDOC_Ss,
27241675Suqs	MDOC_Pp,
28241675Suqs	MDOC_D1,
29241675Suqs	MDOC_Dl,
30241675Suqs	MDOC_Bd,
31241675Suqs	MDOC_Ed,
32241675Suqs	MDOC_Bl,
33241675Suqs	MDOC_El,
34241675Suqs	MDOC_It,
35241675Suqs	MDOC_Ad,
36241675Suqs	MDOC_An,
37241675Suqs	MDOC_Ar,
38241675Suqs	MDOC_Cd,
39241675Suqs	MDOC_Cm,
40241675Suqs	MDOC_Dv,
41241675Suqs	MDOC_Er,
42241675Suqs	MDOC_Ev,
43241675Suqs	MDOC_Ex,
44241675Suqs	MDOC_Fa,
45241675Suqs	MDOC_Fd,
46241675Suqs	MDOC_Fl,
47241675Suqs	MDOC_Fn,
48241675Suqs	MDOC_Ft,
49241675Suqs	MDOC_Ic,
50241675Suqs	MDOC_In,
51241675Suqs	MDOC_Li,
52241675Suqs	MDOC_Nd,
53241675Suqs	MDOC_Nm,
54241675Suqs	MDOC_Op,
55241675Suqs	MDOC_Ot,
56241675Suqs	MDOC_Pa,
57241675Suqs	MDOC_Rv,
58241675Suqs	MDOC_St,
59241675Suqs	MDOC_Va,
60241675Suqs	MDOC_Vt,
61241675Suqs	MDOC_Xr,
62241675Suqs	MDOC__A,
63241675Suqs	MDOC__B,
64241675Suqs	MDOC__D,
65241675Suqs	MDOC__I,
66241675Suqs	MDOC__J,
67241675Suqs	MDOC__N,
68241675Suqs	MDOC__O,
69241675Suqs	MDOC__P,
70241675Suqs	MDOC__R,
71241675Suqs	MDOC__T,
72241675Suqs	MDOC__V,
73241675Suqs	MDOC_Ac,
74241675Suqs	MDOC_Ao,
75241675Suqs	MDOC_Aq,
76241675Suqs	MDOC_At,
77241675Suqs	MDOC_Bc,
78241675Suqs	MDOC_Bf,
79241675Suqs	MDOC_Bo,
80241675Suqs	MDOC_Bq,
81241675Suqs	MDOC_Bsx,
82241675Suqs	MDOC_Bx,
83241675Suqs	MDOC_Db,
84241675Suqs	MDOC_Dc,
85241675Suqs	MDOC_Do,
86241675Suqs	MDOC_Dq,
87241675Suqs	MDOC_Ec,
88241675Suqs	MDOC_Ef,
89241675Suqs	MDOC_Em,
90241675Suqs	MDOC_Eo,
91241675Suqs	MDOC_Fx,
92241675Suqs	MDOC_Ms,
93241675Suqs	MDOC_No,
94241675Suqs	MDOC_Ns,
95241675Suqs	MDOC_Nx,
96241675Suqs	MDOC_Ox,
97241675Suqs	MDOC_Pc,
98241675Suqs	MDOC_Pf,
99241675Suqs	MDOC_Po,
100241675Suqs	MDOC_Pq,
101241675Suqs	MDOC_Qc,
102241675Suqs	MDOC_Ql,
103241675Suqs	MDOC_Qo,
104241675Suqs	MDOC_Qq,
105241675Suqs	MDOC_Re,
106241675Suqs	MDOC_Rs,
107241675Suqs	MDOC_Sc,
108241675Suqs	MDOC_So,
109241675Suqs	MDOC_Sq,
110241675Suqs	MDOC_Sm,
111241675Suqs	MDOC_Sx,
112241675Suqs	MDOC_Sy,
113241675Suqs	MDOC_Tn,
114241675Suqs	MDOC_Ux,
115241675Suqs	MDOC_Xc,
116241675Suqs	MDOC_Xo,
117241675Suqs	MDOC_Fo,
118241675Suqs	MDOC_Fc,
119241675Suqs	MDOC_Oo,
120241675Suqs	MDOC_Oc,
121241675Suqs	MDOC_Bk,
122241675Suqs	MDOC_Ek,
123241675Suqs	MDOC_Bt,
124241675Suqs	MDOC_Hf,
125241675Suqs	MDOC_Fr,
126241675Suqs	MDOC_Ud,
127241675Suqs	MDOC_Lb,
128241675Suqs	MDOC_Lp,
129241675Suqs	MDOC_Lk,
130241675Suqs	MDOC_Mt,
131241675Suqs	MDOC_Brq,
132241675Suqs	MDOC_Bro,
133241675Suqs	MDOC_Brc,
134241675Suqs	MDOC__C,
135241675Suqs	MDOC_Es,
136241675Suqs	MDOC_En,
137241675Suqs	MDOC_Dx,
138241675Suqs	MDOC__Q,
139241675Suqs	MDOC_br,
140241675Suqs	MDOC_sp,
141241675Suqs	MDOC__U,
142241675Suqs	MDOC_Ta,
143241675Suqs	MDOC_MAX
144241675Suqs};
145241675Suqs
146241675Suqsenum	mdocargt {
147241675Suqs	MDOC_Split, /* -split */
148241675Suqs	MDOC_Nosplit, /* -nospli */
149241675Suqs	MDOC_Ragged, /* -ragged */
150241675Suqs	MDOC_Unfilled, /* -unfilled */
151241675Suqs	MDOC_Literal, /* -literal */
152241675Suqs	MDOC_File, /* -file */
153241675Suqs	MDOC_Offset, /* -offset */
154241675Suqs	MDOC_Bullet, /* -bullet */
155241675Suqs	MDOC_Dash, /* -dash */
156241675Suqs	MDOC_Hyphen, /* -hyphen */
157241675Suqs	MDOC_Item, /* -item */
158241675Suqs	MDOC_Enum, /* -enum */
159241675Suqs	MDOC_Tag, /* -tag */
160241675Suqs	MDOC_Diag, /* -diag */
161241675Suqs	MDOC_Hang, /* -hang */
162241675Suqs	MDOC_Ohang, /* -ohang */
163241675Suqs	MDOC_Inset, /* -inset */
164241675Suqs	MDOC_Column, /* -column */
165241675Suqs	MDOC_Width, /* -width */
166241675Suqs	MDOC_Compact, /* -compact */
167241675Suqs	MDOC_Std, /* -std */
168241675Suqs	MDOC_Filled, /* -filled */
169241675Suqs	MDOC_Words, /* -words */
170241675Suqs	MDOC_Emphasis, /* -emphasis */
171241675Suqs	MDOC_Symbolic, /* -symbolic */
172241675Suqs	MDOC_Nested, /* -nested */
173241675Suqs	MDOC_Centred, /* -centered */
174241675Suqs	MDOC_ARG_MAX
175241675Suqs};
176241675Suqs
177241675Suqsenum	mdoc_type {
178241675Suqs	MDOC_TEXT,
179241675Suqs	MDOC_ELEM,
180241675Suqs	MDOC_HEAD,
181241675Suqs	MDOC_TAIL,
182241675Suqs	MDOC_BODY,
183241675Suqs	MDOC_BLOCK,
184241675Suqs	MDOC_TBL,
185241675Suqs	MDOC_EQN,
186241675Suqs	MDOC_ROOT
187241675Suqs};
188241675Suqs
189241675Suqs/*
190241675Suqs * Section (named/unnamed) of `Sh'.   Note that these appear in the
191241675Suqs * conventional order imposed by mdoc.7.  In the case of SEC_NONE, no
192241675Suqs * section has been invoked (this shouldn't happen).  SEC_CUSTOM refers
193241675Suqs * to other sections.
194241675Suqs */
195241675Suqsenum	mdoc_sec {
196241675Suqs	SEC_NONE = 0,
197241675Suqs	SEC_NAME, /* NAME */
198241675Suqs	SEC_LIBRARY, /* LIBRARY */
199241675Suqs	SEC_SYNOPSIS, /* SYNOPSIS */
200241675Suqs	SEC_DESCRIPTION, /* DESCRIPTION */
201241675Suqs	SEC_IMPLEMENTATION, /* IMPLEMENTATION NOTES */
202241675Suqs	SEC_RETURN_VALUES, /* RETURN VALUES */
203241675Suqs	SEC_ENVIRONMENT,  /* ENVIRONMENT */
204241675Suqs	SEC_FILES, /* FILES */
205241675Suqs	SEC_EXIT_STATUS, /* EXIT STATUS */
206241675Suqs	SEC_EXAMPLES, /* EXAMPLES */
207241675Suqs	SEC_DIAGNOSTICS, /* DIAGNOSTICS */
208241675Suqs	SEC_COMPATIBILITY, /* COMPATIBILITY */
209241675Suqs	SEC_ERRORS, /* ERRORS */
210241675Suqs	SEC_SEE_ALSO, /* SEE ALSO */
211241675Suqs	SEC_STANDARDS, /* STANDARDS */
212241675Suqs	SEC_HISTORY, /* HISTORY */
213241675Suqs	SEC_AUTHORS, /* AUTHORS */
214241675Suqs	SEC_CAVEATS, /* CAVEATS */
215241675Suqs	SEC_BUGS, /* BUGS */
216241675Suqs	SEC_SECURITY, /* SECURITY */
217241675Suqs	SEC_CUSTOM,
218241675Suqs	SEC__MAX
219241675Suqs};
220241675Suqs
221241675Suqsstruct	mdoc_meta {
222241675Suqs	char		 *msec; /* `Dt' section (1, 3p, etc.) */
223241675Suqs	char		 *vol; /* `Dt' volume (implied) */
224241675Suqs	char		 *arch; /* `Dt' arch (i386, etc.) */
225241675Suqs	char		 *date; /* `Dd' normalised date */
226241675Suqs	char		 *title; /* `Dt' title (FOO, etc.) */
227241675Suqs	char		 *os; /* `Os' system (OpenBSD, etc.) */
228241675Suqs	char		 *name; /* leading `Nm' name */
229241675Suqs};
230241675Suqs
231241675Suqs/*
232241675Suqs * An argument to a macro (multiple values = `-column xxx yyy').
233241675Suqs */
234241675Suqsstruct	mdoc_argv {
235241675Suqs	enum mdocargt  	  arg; /* type of argument */
236241675Suqs	int		  line;
237241675Suqs	int		  pos;
238241675Suqs	size_t		  sz; /* elements in "value" */
239241675Suqs	char		**value; /* argument strings */
240241675Suqs};
241241675Suqs
242241675Suqs/*
243241675Suqs * Reference-counted macro arguments.  These are refcounted because
244241675Suqs * blocks have multiple instances of the same arguments spread across
245241675Suqs * the HEAD, BODY, TAIL, and BLOCK node types.
246241675Suqs */
247241675Suqsstruct 	mdoc_arg {
248241675Suqs	size_t		  argc;
249241675Suqs	struct mdoc_argv *argv;
250241675Suqs	unsigned int	  refcnt;
251241675Suqs};
252241675Suqs
253241675Suqs/*
254241675Suqs * Indicates that a BODY's formatting has ended, but the scope is still
255241675Suqs * open.  Used for syntax-broken blocks.
256241675Suqs */
257241675Suqsenum	mdoc_endbody {
258241675Suqs	ENDBODY_NOT = 0,
259241675Suqs	ENDBODY_SPACE, /* is broken: append a space */
260241675Suqs	ENDBODY_NOSPACE /* is broken: don't append a space */
261241675Suqs};
262241675Suqs
263241675Suqsenum	mdoc_list {
264241675Suqs	LIST__NONE = 0,
265241675Suqs	LIST_bullet, /* -bullet */
266241675Suqs	LIST_column, /* -column */
267241675Suqs	LIST_dash, /* -dash */
268241675Suqs	LIST_diag, /* -diag */
269241675Suqs	LIST_enum, /* -enum */
270241675Suqs	LIST_hang, /* -hang */
271241675Suqs	LIST_hyphen, /* -hyphen */
272241675Suqs	LIST_inset, /* -inset */
273241675Suqs	LIST_item, /* -item */
274241675Suqs	LIST_ohang, /* -ohang */
275241675Suqs	LIST_tag, /* -tag */
276241675Suqs	LIST_MAX
277241675Suqs};
278241675Suqs
279241675Suqsenum	mdoc_disp {
280241675Suqs	DISP__NONE = 0,
281241675Suqs	DISP_centred, /* -centered */
282241675Suqs	DISP_ragged, /* -ragged */
283241675Suqs	DISP_unfilled, /* -unfilled */
284241675Suqs	DISP_filled, /* -filled */
285241675Suqs	DISP_literal /* -literal */
286241675Suqs};
287241675Suqs
288241675Suqsenum	mdoc_auth {
289241675Suqs	AUTH__NONE = 0,
290241675Suqs	AUTH_split, /* -split */
291241675Suqs	AUTH_nosplit /* -nosplit */
292241675Suqs};
293241675Suqs
294241675Suqsenum	mdoc_font {
295241675Suqs	FONT__NONE = 0,
296241675Suqs	FONT_Em, /* Em, -emphasis */
297241675Suqs	FONT_Li, /* Li, -literal */
298241675Suqs	FONT_Sy /* Sy, -symbolic */
299241675Suqs};
300241675Suqs
301241675Suqsstruct	mdoc_bd {
302241675Suqs	const char	 *offs; /* -offset */
303241675Suqs	enum mdoc_disp	  type; /* -ragged, etc. */
304241675Suqs	int		  comp; /* -compact */
305241675Suqs};
306241675Suqs
307241675Suqsstruct	mdoc_bl {
308241675Suqs	const char	 *width; /* -width */
309241675Suqs	const char	 *offs; /* -offset */
310241675Suqs	enum mdoc_list	  type; /* -tag, -enum, etc. */
311241675Suqs	int		  comp; /* -compact */
312241675Suqs	size_t		  ncols; /* -column arg count */
313241675Suqs	const char	**cols; /* -column val ptr */
314241675Suqs};
315241675Suqs
316241675Suqsstruct	mdoc_bf {
317241675Suqs	enum mdoc_font	  font; /* font */
318241675Suqs};
319241675Suqs
320241675Suqsstruct	mdoc_an {
321241675Suqs	enum mdoc_auth	  auth; /* -split, etc. */
322241675Suqs};
323241675Suqs
324241675Suqsstruct	mdoc_rs {
325241675Suqs	int		  quote_T; /* whether to quote %T */
326241675Suqs};
327241675Suqs
328241675Suqs/*
329241675Suqs * Consists of normalised node arguments.  These should be used instead
330241675Suqs * of iterating through the mdoc_arg pointers of a node: defaults are
331241675Suqs * provided, etc.
332241675Suqs */
333241675Suqsunion	mdoc_data {
334241675Suqs	struct mdoc_an 	  An;
335241675Suqs	struct mdoc_bd	  Bd;
336241675Suqs	struct mdoc_bf	  Bf;
337241675Suqs	struct mdoc_bl	  Bl;
338241675Suqs	struct mdoc_rs	  Rs;
339241675Suqs};
340241675Suqs
341241675Suqs/*
342241675Suqs * Single node in tree-linked AST.
343241675Suqs */
344241675Suqsstruct	mdoc_node {
345241675Suqs	struct mdoc_node *parent; /* parent AST node */
346241675Suqs	struct mdoc_node *child; /* first child AST node */
347241675Suqs	struct mdoc_node *last; /* last child AST node */
348241675Suqs	struct mdoc_node *next; /* sibling AST node */
349241675Suqs	struct mdoc_node *prev; /* prior sibling AST node */
350241675Suqs	int		  nchild; /* number children */
351241675Suqs	int		  line; /* parse line */
352241675Suqs	int		  pos; /* parse column */
353241675Suqs	enum mdoct	  tok; /* tok or MDOC__MAX if none */
354241675Suqs	int		  flags;
355241675Suqs#define	MDOC_VALID	 (1 << 0) /* has been validated */
356241675Suqs#define	MDOC_EOS	 (1 << 2) /* at sentence boundary */
357241675Suqs#define	MDOC_LINE	 (1 << 3) /* first macro/text on line */
358241675Suqs#define	MDOC_SYNPRETTY	 (1 << 4) /* SYNOPSIS-style formatting */
359241675Suqs#define	MDOC_ENDED	 (1 << 5) /* rendering has been ended */
360241675Suqs#define	MDOC_DELIMO	 (1 << 6)
361241675Suqs#define	MDOC_DELIMC	 (1 << 7)
362241675Suqs	enum mdoc_type	  type; /* AST node type */
363241675Suqs	enum mdoc_sec	  sec; /* current named section */
364241675Suqs	union mdoc_data	 *norm; /* normalised args */
365241675Suqs	/* FIXME: these can be union'd to shave a few bytes. */
366241675Suqs	struct mdoc_arg	 *args; /* BLOCK/ELEM */
367241675Suqs	struct mdoc_node *pending; /* BLOCK */
368241675Suqs	struct mdoc_node *head; /* BLOCK */
369241675Suqs	struct mdoc_node *body; /* BLOCK */
370241675Suqs	struct mdoc_node *tail; /* BLOCK */
371241675Suqs	char		 *string; /* TEXT */
372241675Suqs	const struct tbl_span *span; /* TBL */
373241675Suqs	const struct eqn *eqn; /* EQN */
374241675Suqs	enum mdoc_endbody end; /* BODY */
375241675Suqs};
376241675Suqs
377241675Suqs/* Names of macros.  Index is enum mdoct. */
378241675Suqsextern	const char *const *mdoc_macronames;
379241675Suqs
380241675Suqs/* Names of macro args.  Index is enum mdocargt. */
381241675Suqsextern	const char *const *mdoc_argnames;
382241675Suqs
383241675Suqs__BEGIN_DECLS
384241675Suqs
385241675Suqsstruct	mdoc;
386241675Suqs
387241675Suqsconst struct mdoc_node *mdoc_node(const struct mdoc *);
388241675Suqsconst struct mdoc_meta *mdoc_meta(const struct mdoc *);
389241675Suqs
390241675Suqs__END_DECLS
391241675Suqs
392241675Suqs#endif /*!MDOC_H*/
393