xref: /openbsd-src/usr.bin/mandoc/mdoc.h (revision 43003dfe3ad45d1698bed8a37f2b0f5b14f20d4f)
1 /*	$Id: mdoc.h,v 1.13 2009/08/22 22:11:24 schwarze Exp $ */
2 /*
3  * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
4  *
5  * Permission to use, copy, modify, and distribute this software for any
6  * purpose with or without fee is hereby granted, provided that the above
7  * copyright notice and this permission notice appear in all copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16  */
17 #ifndef MDOC_H
18 #define MDOC_H
19 
20 #include <time.h>
21 
22 /*
23  * This library implements a validating scanner/parser for ``mdoc'' roff
24  * macro documents, a.k.a. BSD manual page documents.  The mdoc.c file
25  * drives the parser, while macro.c describes the macro ontologies.
26  * validate.c pre- and post-validates parsed macros, and action.c
27  * performs actions on parsed and validated macros.
28  */
29 
30 /* What follows is a list of ALL possible macros. */
31 
32 #define	MDOC_Ap		 0
33 #define	MDOC_Dd		 1
34 #define	MDOC_Dt		 2
35 #define	MDOC_Os		 3
36 #define	MDOC_Sh		 4
37 #define	MDOC_Ss		 5
38 #define	MDOC_Pp		 6
39 #define	MDOC_D1		 7
40 #define	MDOC_Dl		 8
41 #define	MDOC_Bd		 9
42 #define	MDOC_Ed		 10
43 #define	MDOC_Bl		 11
44 #define	MDOC_El		 12
45 #define	MDOC_It		 13
46 #define	MDOC_Ad		 14
47 #define	MDOC_An		 15
48 #define	MDOC_Ar		 16
49 #define	MDOC_Cd		 17
50 #define	MDOC_Cm		 18
51 #define	MDOC_Dv		 19
52 #define	MDOC_Er		 20
53 #define	MDOC_Ev		 21
54 #define	MDOC_Ex		 22
55 #define	MDOC_Fa		 23
56 #define	MDOC_Fd		 24
57 #define	MDOC_Fl		 25
58 #define	MDOC_Fn		 26
59 #define	MDOC_Ft		 27
60 #define	MDOC_Ic		 28
61 #define	MDOC_In		 29
62 #define	MDOC_Li		 30
63 #define	MDOC_Nd		 31
64 #define	MDOC_Nm		 32
65 #define	MDOC_Op		 33
66 #define	MDOC_Ot		 34
67 #define	MDOC_Pa		 35
68 #define	MDOC_Rv		 36
69 #define	MDOC_St		 37
70 #define	MDOC_Va		 38
71 #define	MDOC_Vt		 39
72 #define	MDOC_Xr		 40
73 #define	MDOC__A		 41
74 #define	MDOC__B		 42
75 #define	MDOC__D		 43
76 #define	MDOC__I		 44
77 #define	MDOC__J		 45
78 #define	MDOC__N		 46
79 #define	MDOC__O		 47
80 #define	MDOC__P		 48
81 #define	MDOC__R		 49
82 #define	MDOC__T		 50
83 #define	MDOC__V		 51
84 #define MDOC_Ac		 52
85 #define MDOC_Ao		 53
86 #define MDOC_Aq		 54
87 #define MDOC_At		 55
88 #define MDOC_Bc		 56
89 #define MDOC_Bf		 57
90 #define MDOC_Bo		 58
91 #define MDOC_Bq		 59
92 #define MDOC_Bsx	 60
93 #define MDOC_Bx		 61
94 #define MDOC_Db		 62
95 #define MDOC_Dc		 63
96 #define MDOC_Do		 64
97 #define MDOC_Dq		 65
98 #define MDOC_Ec		 66
99 #define MDOC_Ef		 67
100 #define MDOC_Em		 68
101 #define MDOC_Eo		 69
102 #define MDOC_Fx		 70
103 #define MDOC_Ms		 71
104 #define MDOC_No		 72
105 #define MDOC_Ns		 73
106 #define MDOC_Nx		 74
107 #define MDOC_Ox		 75
108 #define MDOC_Pc		 76
109 #define MDOC_Pf		 77
110 #define MDOC_Po		 78
111 #define MDOC_Pq		 79
112 #define MDOC_Qc		 80
113 #define MDOC_Ql		 81
114 #define MDOC_Qo		 82
115 #define MDOC_Qq		 83
116 #define MDOC_Re		 84
117 #define MDOC_Rs		 85
118 #define MDOC_Sc		 86
119 #define MDOC_So		 87
120 #define MDOC_Sq		 88
121 #define MDOC_Sm		 89
122 #define MDOC_Sx		 90
123 #define MDOC_Sy		 91
124 #define MDOC_Tn		 92
125 #define MDOC_Ux		 93
126 #define MDOC_Xc		 94
127 #define MDOC_Xo		 95
128 #define	MDOC_Fo		 96
129 #define	MDOC_Fc		 97
130 #define	MDOC_Oo		 98
131 #define	MDOC_Oc		 99
132 #define	MDOC_Bk		 100
133 #define	MDOC_Ek		 101
134 #define	MDOC_Bt		 102
135 #define	MDOC_Hf		 103
136 #define	MDOC_Fr		 104
137 #define	MDOC_Ud		 105
138 #define	MDOC_Lb		 106
139 #define	MDOC_Lp		 107
140 #define	MDOC_Lk		 108
141 #define	MDOC_Mt		 109
142 #define	MDOC_Brq	 110
143 #define	MDOC_Bro	 111
144 #define	MDOC_Brc	 112
145 #define	MDOC__C	 	 113
146 #define	MDOC_Es	 	 114
147 #define	MDOC_En	 	 115
148 #define	MDOC_Dx	 	 116
149 #define	MDOC__Q	 	 117
150 #define MDOC_br		 118
151 #define MDOC_sp		 119
152 #define	MDOC_MAX	 120
153 
154 /* What follows is a list of ALL possible macro arguments. */
155 
156 #define	MDOC_Split	 0
157 #define	MDOC_Nosplit	 1
158 #define	MDOC_Ragged	 2
159 #define	MDOC_Unfilled	 3
160 #define	MDOC_Literal	 4
161 #define	MDOC_File	 5
162 #define	MDOC_Offset	 6
163 #define	MDOC_Bullet	 7
164 #define	MDOC_Dash	 8
165 #define	MDOC_Hyphen	 9
166 #define	MDOC_Item	 10
167 #define	MDOC_Enum	 11
168 #define	MDOC_Tag	 12
169 #define	MDOC_Diag	 13
170 #define	MDOC_Hang	 14
171 #define	MDOC_Ohang	 15
172 #define	MDOC_Inset	 16
173 #define	MDOC_Column	 17
174 #define	MDOC_Width	 18
175 #define	MDOC_Compact	 19
176 #define	MDOC_Std	 20
177 #define	MDOC_Filled	 21
178 #define	MDOC_Words	 22
179 #define	MDOC_Emphasis	 23
180 #define	MDOC_Symbolic	 24
181 #define	MDOC_Nested	 25
182 #define	MDOC_ARG_MAX	 26
183 
184 /* Type of a syntax node. */
185 enum	mdoc_type {
186 	MDOC_TEXT,
187 	MDOC_ELEM,
188 	MDOC_HEAD,
189 	MDOC_TAIL,
190 	MDOC_BODY,
191 	MDOC_BLOCK,
192 	MDOC_ROOT
193 };
194 
195 /* Section (named/unnamed) of `Sh'. */
196 enum	mdoc_sec {
197 	SEC_NONE,		/* No section, yet. */
198 	SEC_NAME,
199 	SEC_LIBRARY,
200 	SEC_SYNOPSIS,
201 	SEC_DESCRIPTION,
202 	SEC_IMPLEMENTATION,
203 	SEC_EXIT_STATUS,
204 	SEC_RETURN_VALUES,
205 	SEC_ENVIRONMENT,
206 	SEC_FILES,
207 	SEC_EXAMPLES,
208 	SEC_DIAGNOSTICS,
209 	SEC_COMPATIBILITY,
210 	SEC_ERRORS,
211 	SEC_SEE_ALSO,
212 	SEC_STANDARDS,
213 	SEC_HISTORY,
214 	SEC_AUTHORS,
215 	SEC_CAVEATS,
216 	SEC_BUGS,
217 	SEC_SECURITY,
218 	SEC_CUSTOM		/* User-defined. */
219 };
220 
221 /* Information from prologue. */
222 struct	mdoc_meta {
223 	int		  msec;
224 	char		 *vol;
225 	char		 *arch;
226 	time_t		  date;
227 	char		 *title;
228 	char		 *os;
229 	char		 *name;
230 };
231 
232 /* An argument to a macro (multiple values = `It -column'). */
233 struct	mdoc_argv {
234 	int	  	  arg;
235 	int		  line;
236 	int		  pos;
237 	size_t		  sz;
238 	char		**value;
239 };
240 
241 struct 	mdoc_arg {
242 	size_t		  argc;
243 	struct mdoc_argv *argv;
244 	unsigned int	  refcnt;
245 };
246 
247 /* Node in AST. */
248 struct	mdoc_node {
249 	struct mdoc_node *parent;
250 	struct mdoc_node *child;
251 	struct mdoc_node *next;
252 	struct mdoc_node *prev;
253 	int		  nchild;
254 	int		  line;
255 	int		  pos;
256 	int		  tok;
257 	int		  flags;
258 #define	MDOC_VALID	 (1 << 0)
259 #define	MDOC_ACTED	 (1 << 1)
260 	enum mdoc_type	  type;
261 	enum mdoc_sec	  sec;
262 
263 	struct mdoc_arg	 *args; 	/* BLOCK/ELEM */
264 	struct mdoc_node *head;		/* BLOCK */
265 	struct mdoc_node *body;		/* BLOCK */
266 	struct mdoc_node *tail;		/* BLOCK */
267 	char		 *string;	/* TEXT */
268 };
269 
270 #define	MDOC_IGN_SCOPE	 (1 << 0) /* Ignore scope violations. */
271 #define	MDOC_IGN_ESCAPE	 (1 << 1) /* Ignore bad escape sequences. */
272 #define	MDOC_IGN_MACRO	 (1 << 2) /* Ignore unknown macros. */
273 #define	MDOC_IGN_CHARS	 (1 << 3) /* Ignore disallowed chars. */
274 
275 /* Call-backs for parse messages. */
276 
277 struct	mdoc_cb {
278 	int	(*mdoc_err)(void *, int, int, const char *);
279 	int	(*mdoc_warn)(void *, int, int, const char *);
280 };
281 
282 /* See mdoc.3 for documentation. */
283 
284 extern	const char *const *mdoc_macronames;
285 extern	const char *const *mdoc_argnames;
286 
287 __BEGIN_DECLS
288 
289 struct	mdoc;
290 
291 /* See mdoc.3 for documentation. */
292 
293 void	 	  mdoc_free(struct mdoc *);
294 struct	mdoc	 *mdoc_alloc(void *, int, const struct mdoc_cb *);
295 int		  mdoc_reset(struct mdoc *);
296 int	 	  mdoc_parseln(struct mdoc *, int, char *buf);
297 const struct mdoc_node *mdoc_node(const struct mdoc *);
298 const struct mdoc_meta *mdoc_meta(const struct mdoc *);
299 int		  mdoc_endparse(struct mdoc *);
300 
301 __END_DECLS
302 
303 #endif /*!MDOC_H*/
304