xref: /openbsd-src/usr.bin/mandoc/mdoc.h (revision 6b86842e6cdb3960f6b08bd377e1a60a2f8ba124)
1*6b86842eSschwarze /*	$OpenBSD: mdoc.h,v 1.71 2018/12/30 00:48:47 schwarze Exp $ */
2f73abda9Skristaps /*
32791bd1cSschwarze  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
4ae2efdd8Sschwarze  * Copyright (c) 2014, 2015 Ingo Schwarze <schwarze@openbsd.org>
5f73abda9Skristaps  *
6f73abda9Skristaps  * Permission to use, copy, modify, and distribute this software for any
7a6464425Sschwarze  * purpose with or without fee is hereby granted, provided that the above
8a6464425Sschwarze  * copyright notice and this permission notice appear in all copies.
9f73abda9Skristaps  *
10d1982c71Sschwarze  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES
11a6464425Sschwarze  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12d1982c71Sschwarze  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR
13a6464425Sschwarze  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14a6464425Sschwarze  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15a6464425Sschwarze  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16a6464425Sschwarze  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17f73abda9Skristaps  */
18f73abda9Skristaps 
19*6b86842eSschwarze struct	roff_node;
20*6b86842eSschwarze struct	roff_man;
21*6b86842eSschwarze 
22ddce0b0cSschwarze enum	mdocargt {
23a35fc07aSschwarze 	MDOC_Split, /* -split */
24a35fc07aSschwarze 	MDOC_Nosplit, /* -nospli */
25a35fc07aSschwarze 	MDOC_Ragged, /* -ragged */
26a35fc07aSschwarze 	MDOC_Unfilled, /* -unfilled */
27a35fc07aSschwarze 	MDOC_Literal, /* -literal */
28a35fc07aSschwarze 	MDOC_File, /* -file */
29a35fc07aSschwarze 	MDOC_Offset, /* -offset */
30a35fc07aSschwarze 	MDOC_Bullet, /* -bullet */
31a35fc07aSschwarze 	MDOC_Dash, /* -dash */
32a35fc07aSschwarze 	MDOC_Hyphen, /* -hyphen */
33a35fc07aSschwarze 	MDOC_Item, /* -item */
34a35fc07aSschwarze 	MDOC_Enum, /* -enum */
35a35fc07aSschwarze 	MDOC_Tag, /* -tag */
36a35fc07aSschwarze 	MDOC_Diag, /* -diag */
37a35fc07aSschwarze 	MDOC_Hang, /* -hang */
38a35fc07aSschwarze 	MDOC_Ohang, /* -ohang */
39a35fc07aSschwarze 	MDOC_Inset, /* -inset */
40a35fc07aSschwarze 	MDOC_Column, /* -column */
41a35fc07aSschwarze 	MDOC_Width, /* -width */
42a35fc07aSschwarze 	MDOC_Compact, /* -compact */
43a35fc07aSschwarze 	MDOC_Std, /* -std */
44a35fc07aSschwarze 	MDOC_Filled, /* -filled */
45a35fc07aSschwarze 	MDOC_Words, /* -words */
46a35fc07aSschwarze 	MDOC_Emphasis, /* -emphasis */
47a35fc07aSschwarze 	MDOC_Symbolic, /* -symbolic */
48a35fc07aSschwarze 	MDOC_Nested, /* -nested */
49a35fc07aSschwarze 	MDOC_Centred, /* -centered */
50ddce0b0cSschwarze 	MDOC_ARG_MAX
51ddce0b0cSschwarze };
52f73abda9Skristaps 
535a0a1f76Sschwarze /*
545a0a1f76Sschwarze  * An argument to a macro (multiple values = `-column xxx yyy').
555a0a1f76Sschwarze  */
56f73abda9Skristaps struct	mdoc_argv {
575a0a1f76Sschwarze 	enum mdocargt	  arg; /* type of argument */
58f73abda9Skristaps 	int		  line;
59f73abda9Skristaps 	int		  pos;
605a0a1f76Sschwarze 	size_t		  sz; /* elements in "value" */
615a0a1f76Sschwarze 	char		**value; /* argument strings */
62f73abda9Skristaps };
63f73abda9Skristaps 
645a0a1f76Sschwarze /*
655a0a1f76Sschwarze  * Reference-counted macro arguments.  These are refcounted because
665a0a1f76Sschwarze  * blocks have multiple instances of the same arguments spread across
675a0a1f76Sschwarze  * the HEAD, BODY, TAIL, and BLOCK node types.
685a0a1f76Sschwarze  */
69f73abda9Skristaps struct	mdoc_arg {
70f73abda9Skristaps 	size_t		  argc;
71f73abda9Skristaps 	struct mdoc_argv *argv;
72f73abda9Skristaps 	unsigned int	  refcnt;
73f73abda9Skristaps };
74f73abda9Skristaps 
7550e63e03Sschwarze enum	mdoc_list {
7650e63e03Sschwarze 	LIST__NONE = 0,
77a35fc07aSschwarze 	LIST_bullet, /* -bullet */
78a35fc07aSschwarze 	LIST_column, /* -column */
79a35fc07aSschwarze 	LIST_dash, /* -dash */
80a35fc07aSschwarze 	LIST_diag, /* -diag */
81a35fc07aSschwarze 	LIST_enum, /* -enum */
82a35fc07aSschwarze 	LIST_hang, /* -hang */
83a35fc07aSschwarze 	LIST_hyphen, /* -hyphen */
84a35fc07aSschwarze 	LIST_inset, /* -inset */
85a35fc07aSschwarze 	LIST_item, /* -item */
86a35fc07aSschwarze 	LIST_ohang, /* -ohang */
87a35fc07aSschwarze 	LIST_tag, /* -tag */
88467b61c6Sschwarze 	LIST_MAX
8950e63e03Sschwarze };
9050e63e03Sschwarze 
9131e23753Sschwarze enum	mdoc_disp {
9231e23753Sschwarze 	DISP__NONE = 0,
932065e47aSschwarze 	DISP_centered, /* -centered */
94a35fc07aSschwarze 	DISP_ragged, /* -ragged */
95a35fc07aSschwarze 	DISP_unfilled, /* -unfilled */
96a35fc07aSschwarze 	DISP_filled, /* -filled */
97a35fc07aSschwarze 	DISP_literal /* -literal */
9831e23753Sschwarze };
9931e23753Sschwarze 
100769ee804Sschwarze enum	mdoc_auth {
101769ee804Sschwarze 	AUTH__NONE = 0,
102a35fc07aSschwarze 	AUTH_split, /* -split */
103a35fc07aSschwarze 	AUTH_nosplit /* -nosplit */
104769ee804Sschwarze };
105769ee804Sschwarze 
106769ee804Sschwarze enum	mdoc_font {
107769ee804Sschwarze 	FONT__NONE = 0,
108a35fc07aSschwarze 	FONT_Em, /* Em, -emphasis */
109a35fc07aSschwarze 	FONT_Li, /* Li, -literal */
110a35fc07aSschwarze 	FONT_Sy /* Sy, -symbolic */
111769ee804Sschwarze };
112769ee804Sschwarze 
11331e23753Sschwarze struct	mdoc_bd {
11431e23753Sschwarze 	const char	 *offs; /* -offset */
11531e23753Sschwarze 	enum mdoc_disp	  type; /* -ragged, etc. */
11631e23753Sschwarze 	int		  comp; /* -compact */
11731e23753Sschwarze };
11831e23753Sschwarze 
11931e23753Sschwarze struct	mdoc_bl {
12031e23753Sschwarze 	const char	 *width; /* -width */
12131e23753Sschwarze 	const char	 *offs; /* -offset */
12231e23753Sschwarze 	enum mdoc_list	  type; /* -tag, -enum, etc. */
12331e23753Sschwarze 	int		  comp; /* -compact */
124769ee804Sschwarze 	size_t		  ncols; /* -column arg count */
125769ee804Sschwarze 	const char	**cols; /* -column val ptr */
1265eced068Sschwarze 	int		  count; /* -enum counter */
127769ee804Sschwarze };
128769ee804Sschwarze 
129769ee804Sschwarze struct	mdoc_bf {
130769ee804Sschwarze 	enum mdoc_font	  font; /* font */
131769ee804Sschwarze };
132769ee804Sschwarze 
133769ee804Sschwarze struct	mdoc_an {
134769ee804Sschwarze 	enum mdoc_auth	  auth; /* -split, etc. */
13531e23753Sschwarze };
13631e23753Sschwarze 
1376f207799Sschwarze struct	mdoc_rs {
1385d273f35Sschwarze 	int		  quote_T; /* whether to quote %T */
1396f207799Sschwarze };
1406f207799Sschwarze 
1415a0a1f76Sschwarze /*
1425a0a1f76Sschwarze  * Consists of normalised node arguments.  These should be used instead
1435a0a1f76Sschwarze  * of iterating through the mdoc_arg pointers of a node: defaults are
1445a0a1f76Sschwarze  * provided, etc.
1455a0a1f76Sschwarze  */
1465a0a1f76Sschwarze union	mdoc_data {
1478c62fbf5Sschwarze 	struct mdoc_an	  An;
1488c62fbf5Sschwarze 	struct mdoc_bd	  Bd;
1498c62fbf5Sschwarze 	struct mdoc_bf	  Bf;
1508c62fbf5Sschwarze 	struct mdoc_bl	  Bl;
1513a0d07afSschwarze 	struct roff_node *Es;
1528c62fbf5Sschwarze 	struct mdoc_rs	  Rs;
1535a0a1f76Sschwarze };
1545a0a1f76Sschwarze 
155a35fc07aSschwarze /* Names of macro args.  Index is enum mdocargt. */
156f73abda9Skristaps extern	const char *const *mdoc_argnames;
157396853b5Sschwarze 
158396853b5Sschwarze void		 mdoc_validate(struct roff_man *);
159