Bring in OpenBSD's mandoc(1) tool for formatting manual pages.
[games.git] / usr.bin / mandoc / mdoc.h
1 /*      $Id: mdoc.h,v 1.14 2009/10/21 19:13:50 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_Centred     26
183 #define MDOC_ARG_MAX     27
184
185 /* Type of a syntax node. */
186 enum    mdoc_type {
187         MDOC_TEXT,
188         MDOC_ELEM,
189         MDOC_HEAD,
190         MDOC_TAIL,
191         MDOC_BODY,
192         MDOC_BLOCK,
193         MDOC_ROOT
194 };
195
196 /* Section (named/unnamed) of `Sh'. */
197 enum    mdoc_sec {
198         SEC_NONE,               /* No section, yet. */
199         SEC_NAME,
200         SEC_LIBRARY,
201         SEC_SYNOPSIS,
202         SEC_DESCRIPTION,
203         SEC_IMPLEMENTATION,
204         SEC_EXIT_STATUS,
205         SEC_RETURN_VALUES,
206         SEC_ENVIRONMENT,
207         SEC_FILES,
208         SEC_EXAMPLES,
209         SEC_DIAGNOSTICS,
210         SEC_COMPATIBILITY,
211         SEC_ERRORS,
212         SEC_SEE_ALSO,
213         SEC_STANDARDS,
214         SEC_HISTORY,
215         SEC_AUTHORS,
216         SEC_CAVEATS,
217         SEC_BUGS,
218         SEC_SECURITY,
219         SEC_CUSTOM              /* User-defined. */
220 };
221
222 /* Information from prologue. */
223 struct  mdoc_meta {
224         int               msec;
225         char             *vol;
226         char             *arch;
227         time_t            date;
228         char             *title;
229         char             *os;
230         char             *name;
231 };
232
233 /* An argument to a macro (multiple values = `It -column'). */
234 struct  mdoc_argv {
235         int               arg;
236         int               line;
237         int               pos;
238         size_t            sz;
239         char            **value;
240 };
241
242 struct  mdoc_arg {
243         size_t            argc;
244         struct mdoc_argv *argv;
245         unsigned int      refcnt;
246 };
247
248 /* Node in AST. */
249 struct  mdoc_node {
250         struct mdoc_node *parent;
251         struct mdoc_node *child;
252         struct mdoc_node *next;
253         struct mdoc_node *prev;
254         int               nchild;
255         int               line;
256         int               pos;
257         int               tok;
258         int               flags;
259 #define MDOC_VALID       (1 << 0)
260 #define MDOC_ACTED       (1 << 1)
261         enum mdoc_type    type;
262         enum mdoc_sec     sec;
263
264         struct mdoc_arg  *args;         /* BLOCK/ELEM */
265         struct mdoc_node *head;         /* BLOCK */
266         struct mdoc_node *body;         /* BLOCK */
267         struct mdoc_node *tail;         /* BLOCK */
268         char             *string;       /* TEXT */
269 };
270
271 #define MDOC_IGN_SCOPE   (1 << 0) /* Ignore scope violations. */
272 #define MDOC_IGN_ESCAPE  (1 << 1) /* Ignore bad escape sequences. */
273 #define MDOC_IGN_MACRO   (1 << 2) /* Ignore unknown macros. */
274 #define MDOC_IGN_CHARS   (1 << 3) /* Ignore disallowed chars. */
275
276 /* Call-backs for parse messages. */
277
278 struct  mdoc_cb {
279         int     (*mdoc_err)(void *, int, int, const char *);
280         int     (*mdoc_warn)(void *, int, int, const char *);
281 };
282
283 /* See mdoc.3 for documentation. */
284
285 extern  const char *const *mdoc_macronames;
286 extern  const char *const *mdoc_argnames;
287
288 __BEGIN_DECLS
289
290 struct  mdoc;
291
292 /* See mdoc.3 for documentation. */
293
294 void              mdoc_free(struct mdoc *);
295 struct  mdoc     *mdoc_alloc(void *, int, const struct mdoc_cb *);
296 int               mdoc_reset(struct mdoc *);
297 int               mdoc_parseln(struct mdoc *, int, char *buf);
298 const struct mdoc_node *mdoc_node(const struct mdoc *);
299 const struct mdoc_meta *mdoc_meta(const struct mdoc *);
300 int               mdoc_endparse(struct mdoc *);
301
302 __END_DECLS
303
304 #endif /*!MDOC_H*/