xref: /titanic_52/usr/src/cmd/mandoc/mdoc.h (revision 260e9a87725c090ba5835b1f9f0b62fa2f96036f)
1 /*	$Id: mdoc.h,v 1.136 2015/02/12 12:24:33 schwarze Exp $ */
2 /*
3  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
4  * Copyright (c) 2014, 2015 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 AUTHOR DISCLAIMS ALL WARRANTIES
11  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR 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 
19 enum	mdoct {
20 	MDOC_Ap = 0,
21 	MDOC_Dd,
22 	MDOC_Dt,
23 	MDOC_Os,
24 	MDOC_Sh,
25 	MDOC_Ss,
26 	MDOC_Pp,
27 	MDOC_D1,
28 	MDOC_Dl,
29 	MDOC_Bd,
30 	MDOC_Ed,
31 	MDOC_Bl,
32 	MDOC_El,
33 	MDOC_It,
34 	MDOC_Ad,
35 	MDOC_An,
36 	MDOC_Ar,
37 	MDOC_Cd,
38 	MDOC_Cm,
39 	MDOC_Dv,
40 	MDOC_Er,
41 	MDOC_Ev,
42 	MDOC_Ex,
43 	MDOC_Fa,
44 	MDOC_Fd,
45 	MDOC_Fl,
46 	MDOC_Fn,
47 	MDOC_Ft,
48 	MDOC_Ic,
49 	MDOC_In,
50 	MDOC_Li,
51 	MDOC_Nd,
52 	MDOC_Nm,
53 	MDOC_Op,
54 	MDOC_Ot,
55 	MDOC_Pa,
56 	MDOC_Rv,
57 	MDOC_St,
58 	MDOC_Va,
59 	MDOC_Vt,
60 	MDOC_Xr,
61 	MDOC__A,
62 	MDOC__B,
63 	MDOC__D,
64 	MDOC__I,
65 	MDOC__J,
66 	MDOC__N,
67 	MDOC__O,
68 	MDOC__P,
69 	MDOC__R,
70 	MDOC__T,
71 	MDOC__V,
72 	MDOC_Ac,
73 	MDOC_Ao,
74 	MDOC_Aq,
75 	MDOC_At,
76 	MDOC_Bc,
77 	MDOC_Bf,
78 	MDOC_Bo,
79 	MDOC_Bq,
80 	MDOC_Bsx,
81 	MDOC_Bx,
82 	MDOC_Db,
83 	MDOC_Dc,
84 	MDOC_Do,
85 	MDOC_Dq,
86 	MDOC_Ec,
87 	MDOC_Ef,
88 	MDOC_Em,
89 	MDOC_Eo,
90 	MDOC_Fx,
91 	MDOC_Ms,
92 	MDOC_No,
93 	MDOC_Ns,
94 	MDOC_Nx,
95 	MDOC_Ox,
96 	MDOC_Pc,
97 	MDOC_Pf,
98 	MDOC_Po,
99 	MDOC_Pq,
100 	MDOC_Qc,
101 	MDOC_Ql,
102 	MDOC_Qo,
103 	MDOC_Qq,
104 	MDOC_Re,
105 	MDOC_Rs,
106 	MDOC_Sc,
107 	MDOC_So,
108 	MDOC_Sq,
109 	MDOC_Sm,
110 	MDOC_Sx,
111 	MDOC_Sy,
112 	MDOC_Tn,
113 	MDOC_Ux,
114 	MDOC_Xc,
115 	MDOC_Xo,
116 	MDOC_Fo,
117 	MDOC_Fc,
118 	MDOC_Oo,
119 	MDOC_Oc,
120 	MDOC_Bk,
121 	MDOC_Ek,
122 	MDOC_Bt,
123 	MDOC_Hf,
124 	MDOC_Fr,
125 	MDOC_Ud,
126 	MDOC_Lb,
127 	MDOC_Lp,
128 	MDOC_Lk,
129 	MDOC_Mt,
130 	MDOC_Brq,
131 	MDOC_Bro,
132 	MDOC_Brc,
133 	MDOC__C,
134 	MDOC_Es,
135 	MDOC_En,
136 	MDOC_Dx,
137 	MDOC__Q,
138 	MDOC_br,
139 	MDOC_sp,
140 	MDOC__U,
141 	MDOC_Ta,
142 	MDOC_ll,
143 	MDOC_MAX
144 };
145 
146 enum	mdocargt {
147 	MDOC_Split, /* -split */
148 	MDOC_Nosplit, /* -nospli */
149 	MDOC_Ragged, /* -ragged */
150 	MDOC_Unfilled, /* -unfilled */
151 	MDOC_Literal, /* -literal */
152 	MDOC_File, /* -file */
153 	MDOC_Offset, /* -offset */
154 	MDOC_Bullet, /* -bullet */
155 	MDOC_Dash, /* -dash */
156 	MDOC_Hyphen, /* -hyphen */
157 	MDOC_Item, /* -item */
158 	MDOC_Enum, /* -enum */
159 	MDOC_Tag, /* -tag */
160 	MDOC_Diag, /* -diag */
161 	MDOC_Hang, /* -hang */
162 	MDOC_Ohang, /* -ohang */
163 	MDOC_Inset, /* -inset */
164 	MDOC_Column, /* -column */
165 	MDOC_Width, /* -width */
166 	MDOC_Compact, /* -compact */
167 	MDOC_Std, /* -std */
168 	MDOC_Filled, /* -filled */
169 	MDOC_Words, /* -words */
170 	MDOC_Emphasis, /* -emphasis */
171 	MDOC_Symbolic, /* -symbolic */
172 	MDOC_Nested, /* -nested */
173 	MDOC_Centred, /* -centered */
174 	MDOC_ARG_MAX
175 };
176 
177 enum	mdoc_type {
178 	MDOC_TEXT,
179 	MDOC_ELEM,
180 	MDOC_HEAD,
181 	MDOC_TAIL,
182 	MDOC_BODY,
183 	MDOC_BLOCK,
184 	MDOC_TBL,
185 	MDOC_EQN,
186 	MDOC_ROOT
187 };
188 
189 /*
190  * Section (named/unnamed) of `Sh'.   Note that these appear in the
191  * conventional order imposed by mdoc.7.  In the case of SEC_NONE, no
192  * section has been invoked (this shouldn't happen).  SEC_CUSTOM refers
193  * to other sections.
194  */
195 enum	mdoc_sec {
196 	SEC_NONE = 0,
197 	SEC_NAME, /* NAME */
198 	SEC_LIBRARY, /* LIBRARY */
199 	SEC_SYNOPSIS, /* SYNOPSIS */
200 	SEC_DESCRIPTION, /* DESCRIPTION */
201 	SEC_CONTEXT, /* CONTEXT */
202 	SEC_IMPLEMENTATION, /* IMPLEMENTATION NOTES */
203 	SEC_RETURN_VALUES, /* RETURN VALUES */
204 	SEC_ENVIRONMENT,  /* ENVIRONMENT */
205 	SEC_FILES, /* FILES */
206 	SEC_EXIT_STATUS, /* EXIT STATUS */
207 	SEC_EXAMPLES, /* EXAMPLES */
208 	SEC_DIAGNOSTICS, /* DIAGNOSTICS */
209 	SEC_COMPATIBILITY, /* COMPATIBILITY */
210 	SEC_ERRORS, /* ERRORS */
211 	SEC_SEE_ALSO, /* SEE ALSO */
212 	SEC_STANDARDS, /* STANDARDS */
213 	SEC_HISTORY, /* HISTORY */
214 	SEC_AUTHORS, /* AUTHORS */
215 	SEC_CAVEATS, /* CAVEATS */
216 	SEC_BUGS, /* BUGS */
217 	SEC_SECURITY, /* SECURITY */
218 	SEC_CUSTOM,
219 	SEC__MAX
220 };
221 
222 struct	mdoc_meta {
223 	char		 *msec; /* `Dt' section (1, 3p, etc.) */
224 	char		 *vol; /* `Dt' volume (implied) */
225 	char		 *arch; /* `Dt' arch (i386, etc.) */
226 	char		 *date; /* `Dd' normalised date */
227 	char		 *title; /* `Dt' title (FOO, etc.) */
228 	char		 *os; /* `Os' system (OpenBSD, etc.) */
229 	char		 *name; /* leading `Nm' name */
230 };
231 
232 /*
233  * An argument to a macro (multiple values = `-column xxx yyy').
234  */
235 struct	mdoc_argv {
236 	enum mdocargt	  arg; /* type of argument */
237 	int		  line;
238 	int		  pos;
239 	size_t		  sz; /* elements in "value" */
240 	char		**value; /* argument strings */
241 };
242 
243 /*
244  * Reference-counted macro arguments.  These are refcounted because
245  * blocks have multiple instances of the same arguments spread across
246  * the HEAD, BODY, TAIL, and BLOCK node types.
247  */
248 struct	mdoc_arg {
249 	size_t		  argc;
250 	struct mdoc_argv *argv;
251 	unsigned int	  refcnt;
252 };
253 
254 /*
255  * Indicates that a BODY's formatting has ended, but the scope is still
256  * open.  Used for syntax-broken blocks.
257  */
258 enum	mdoc_endbody {
259 	ENDBODY_NOT = 0,
260 	ENDBODY_SPACE, /* is broken: append a space */
261 	ENDBODY_NOSPACE /* is broken: don't append a space */
262 };
263 
264 enum	mdoc_list {
265 	LIST__NONE = 0,
266 	LIST_bullet, /* -bullet */
267 	LIST_column, /* -column */
268 	LIST_dash, /* -dash */
269 	LIST_diag, /* -diag */
270 	LIST_enum, /* -enum */
271 	LIST_hang, /* -hang */
272 	LIST_hyphen, /* -hyphen */
273 	LIST_inset, /* -inset */
274 	LIST_item, /* -item */
275 	LIST_ohang, /* -ohang */
276 	LIST_tag, /* -tag */
277 	LIST_MAX
278 };
279 
280 enum	mdoc_disp {
281 	DISP__NONE = 0,
282 	DISP_centered, /* -centered */
283 	DISP_ragged, /* -ragged */
284 	DISP_unfilled, /* -unfilled */
285 	DISP_filled, /* -filled */
286 	DISP_literal /* -literal */
287 };
288 
289 enum	mdoc_auth {
290 	AUTH__NONE = 0,
291 	AUTH_split, /* -split */
292 	AUTH_nosplit /* -nosplit */
293 };
294 
295 enum	mdoc_font {
296 	FONT__NONE = 0,
297 	FONT_Em, /* Em, -emphasis */
298 	FONT_Li, /* Li, -literal */
299 	FONT_Sy /* Sy, -symbolic */
300 };
301 
302 struct	mdoc_bd {
303 	const char	 *offs; /* -offset */
304 	enum mdoc_disp	  type; /* -ragged, etc. */
305 	int		  comp; /* -compact */
306 };
307 
308 struct	mdoc_bl {
309 	const char	 *width; /* -width */
310 	const char	 *offs; /* -offset */
311 	enum mdoc_list	  type; /* -tag, -enum, etc. */
312 	int		  comp; /* -compact */
313 	size_t		  ncols; /* -column arg count */
314 	const char	**cols; /* -column val ptr */
315 	int		  count; /* -enum counter */
316 };
317 
318 struct	mdoc_bf {
319 	enum mdoc_font	  font; /* font */
320 };
321 
322 struct	mdoc_an {
323 	enum mdoc_auth	  auth; /* -split, etc. */
324 };
325 
326 struct	mdoc_rs {
327 	int		  quote_T; /* whether to quote %T */
328 };
329 
330 /*
331  * Consists of normalised node arguments.  These should be used instead
332  * of iterating through the mdoc_arg pointers of a node: defaults are
333  * provided, etc.
334  */
335 union	mdoc_data {
336 	struct mdoc_an	  An;
337 	struct mdoc_bd	  Bd;
338 	struct mdoc_bf	  Bf;
339 	struct mdoc_bl	  Bl;
340 	struct mdoc_node *Es;
341 	struct mdoc_rs	  Rs;
342 };
343 
344 /*
345  * Single node in tree-linked AST.
346  */
347 struct	mdoc_node {
348 	struct mdoc_node *parent; /* parent AST node */
349 	struct mdoc_node *child; /* first child AST node */
350 	struct mdoc_node *last; /* last child AST node */
351 	struct mdoc_node *next; /* sibling AST node */
352 	struct mdoc_node *prev; /* prior sibling AST node */
353 	int		  nchild; /* number children */
354 	int		  line; /* parse line */
355 	int		  pos; /* parse column */
356 	enum mdoct	  tok; /* tok or MDOC__MAX if none */
357 	int		  flags;
358 #define	MDOC_VALID	 (1 << 0) /* has been validated */
359 #define	MDOC_ENDED	 (1 << 1) /* gone past body end mark */
360 #define	MDOC_EOS	 (1 << 2) /* at sentence boundary */
361 #define	MDOC_LINE	 (1 << 3) /* first macro/text on line */
362 #define	MDOC_SYNPRETTY	 (1 << 4) /* SYNOPSIS-style formatting */
363 #define	MDOC_BROKEN	 (1 << 5) /* must validate parent when ending */
364 #define	MDOC_DELIMO	 (1 << 6)
365 #define	MDOC_DELIMC	 (1 << 7)
366 	enum mdoc_type	  type; /* AST node type */
367 	enum mdoc_sec	  sec; /* current named section */
368 	union mdoc_data	 *norm; /* normalised args */
369 	int		  prev_font; /* before entering this node */
370 	/* FIXME: these can be union'd to shave a few bytes. */
371 	struct mdoc_arg	 *args; /* BLOCK/ELEM */
372 	struct mdoc_node *head; /* BLOCK */
373 	struct mdoc_node *body; /* BLOCK/ENDBODY */
374 	struct mdoc_node *tail; /* BLOCK */
375 	char		 *string; /* TEXT */
376 	const struct tbl_span *span; /* TBL */
377 	const struct eqn *eqn; /* EQN */
378 	enum mdoc_endbody end; /* BODY */
379 };
380 
381 /* Names of macros.  Index is enum mdoct. */
382 extern	const char *const *mdoc_macronames;
383 
384 /* Names of macro args.  Index is enum mdocargt. */
385 extern	const char *const *mdoc_argnames;
386 
387 __BEGIN_DECLS
388 
389 struct	mdoc;
390 
391 const struct mdoc_node *mdoc_node(const struct mdoc *);
392 const struct mdoc_meta *mdoc_meta(const struct mdoc *);
393 void mdoc_deroff(char **, const struct mdoc_node *);
394 
395 __END_DECLS
396