]> git.cameronkatri.com Git - mandoc.git/blob - mdoc.h
*** empty log message ***
[mandoc.git] / mdoc.h
1 /* $Id: mdoc.h,v 1.20 2009/01/12 12:52:21 kristaps Exp $ */
2 /*
3 * Copyright (c) 2008 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
7 * above copyright notice and this permission notice appear in all
8 * copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17 * PERFORMANCE OF THIS SOFTWARE.
18 */
19 #ifndef MDOC_H
20 #define MDOC_H
21
22 #define MDOC_LINEARG_MAX 12
23
24 #define MDOC___ 0
25 #define MDOC_Dd 1
26 #define MDOC_Dt 2
27 #define MDOC_Os 3
28 #define MDOC_Sh 4
29 #define MDOC_Ss 5
30 #define MDOC_Pp 6
31 #define MDOC_D1 7
32 #define MDOC_Dl 8
33 #define MDOC_Bd 9
34 #define MDOC_Ed 10
35 #define MDOC_Bl 11
36 #define MDOC_El 12
37 #define MDOC_It 13
38 #define MDOC_Ad 14
39 #define MDOC_An 15
40 #define MDOC_Ar 16
41 #define MDOC_Cd 17
42 #define MDOC_Cm 18
43 #define MDOC_Dv 19
44 #define MDOC_Er 20
45 #define MDOC_Ev 21
46 #define MDOC_Ex 22
47 #define MDOC_Fa 23
48 #define MDOC_Fd 24
49 #define MDOC_Fl 25
50 #define MDOC_Fn 26
51 #define MDOC_Ft 27
52 #define MDOC_Ic 28
53 #define MDOC_In 29
54 #define MDOC_Li 30
55 #define MDOC_Nd 31
56 #define MDOC_Nm 32
57 #define MDOC_Op 33
58 #define MDOC_Ot 34
59 #define MDOC_Pa 35
60 #define MDOC_Rv 36
61 #define MDOC_St 37
62 #define MDOC_Va 38
63 #define MDOC_Vt 39
64 #define MDOC_Xr 40
65 #define MDOC__A 41
66 #define MDOC__B 42
67 #define MDOC__D 43
68 #define MDOC__I 44
69 #define MDOC__J 45
70 #define MDOC__N 46
71 #define MDOC__O 47
72 #define MDOC__P 48
73 #define MDOC__R 49
74 #define MDOC__T 50
75 #define MDOC__V 51
76 #define MDOC_Ac 52
77 #define MDOC_Ao 53
78 #define MDOC_Aq 54
79 #define MDOC_At 55
80 #define MDOC_Bc 56
81 #define MDOC_Bf 57
82 #define MDOC_Bo 58
83 #define MDOC_Bq 59
84 #define MDOC_Bsx 60
85 #define MDOC_Bx 61
86 #define MDOC_Db 62
87 #define MDOC_Dc 63
88 #define MDOC_Do 64
89 #define MDOC_Dq 65
90 #define MDOC_Ec 66
91 #define MDOC_Ef 67
92 #define MDOC_Em 68
93 #define MDOC_Eo 69
94 #define MDOC_Fx 70
95 #define MDOC_Ms 71
96 #define MDOC_No 72
97 #define MDOC_Ns 73
98 #define MDOC_Nx 74
99 #define MDOC_Ox 75
100 #define MDOC_Pc 76
101 #define MDOC_Pf 77
102 #define MDOC_Po 78
103 #define MDOC_Pq 79
104 #define MDOC_Qc 80
105 #define MDOC_Ql 81
106 #define MDOC_Qo 82
107 #define MDOC_Qq 83
108 #define MDOC_Re 84
109 #define MDOC_Rs 85
110 #define MDOC_Sc 86
111 #define MDOC_So 87
112 #define MDOC_Sq 88
113 #define MDOC_Sm 89
114 #define MDOC_Sx 90
115 #define MDOC_Sy 91
116 #define MDOC_Tn 92
117 #define MDOC_Ux 93
118 #define MDOC_Xc 94
119 #define MDOC_Xo 95
120 #define MDOC_Fo 96
121 #define MDOC_Fc 97
122 #define MDOC_Oo 98
123 #define MDOC_Oc 99
124 #define MDOC_Bk 100
125 #define MDOC_Ek 101
126 #define MDOC_Bt 102
127 #define MDOC_Hf 103
128 #define MDOC_Fr 104
129 #define MDOC_Ud 105
130 #define MDOC_MAX 106
131
132 #define MDOC_Split 0
133 #define MDOC_Nosplit 1
134 #define MDOC_Ragged 2
135 #define MDOC_Unfilled 3
136 #define MDOC_Literal 4
137 #define MDOC_File 5
138 #define MDOC_Offset 6
139 #define MDOC_Bullet 7
140 #define MDOC_Dash 8
141 #define MDOC_Hyphen 9
142 #define MDOC_Item 10
143 #define MDOC_Enum 11
144 #define MDOC_Tag 12
145 #define MDOC_Diag 13
146 #define MDOC_Hang 14
147 #define MDOC_Ohang 15
148 #define MDOC_Inset 16
149 #define MDOC_Column 17
150 #define MDOC_Width 18
151 #define MDOC_Compact 19
152 #define MDOC_Std 20
153 #define MDOC_p1003_1_88 21
154 #define MDOC_p1003_1_90 22
155 #define MDOC_p1003_1_96 23
156 #define MDOC_p1003_1_2001 24
157 #define MDOC_p1003_1_2004 25
158 #define MDOC_p1003_1 26
159 #define MDOC_p1003_1b 27
160 #define MDOC_p1003_1b_93 28
161 #define MDOC_p1003_1c_95 29
162 #define MDOC_p1003_1g_2000 30
163 #define MDOC_p1003_2_92 31
164 #define MDOC_p1387_2_95 32
165 #define MDOC_p1003_2 33
166 #define MDOC_p1387_2 34
167 #define MDOC_isoC_90 35
168 #define MDOC_isoC_amd1 36
169 #define MDOC_isoC_tcor1 37
170 #define MDOC_isoC_tcor2 38
171 #define MDOC_isoC_99 39
172 #define MDOC_ansiC 40
173 #define MDOC_ansiC_89 41
174 #define MDOC_ansiC_99 42
175 #define MDOC_ieee754 43
176 #define MDOC_iso8802_3 44
177 #define MDOC_xpg3 45
178 #define MDOC_xpg4 46
179 #define MDOC_xpg4_2 47
180 #define MDOC_xpg4_3 48
181 #define MDOC_xbd5 49
182 #define MDOC_xcu5 50
183 #define MDOC_xsh5 51
184 #define MDOC_xns5 52
185 #define MDOC_xns5_2d2_0 53
186 #define MDOC_xcurses4_2 54
187 #define MDOC_susv2 55
188 #define MDOC_susv3 56
189 #define MDOC_svid4 57
190 #define MDOC_Filled 58
191 #define MDOC_Words 59
192 #define MDOC_Emphasis 60
193 #define MDOC_Symbolic 61
194 #define MDOC_ARG_MAX 62
195
196 enum mdoc_err {
197 ERR_SYNTAX_QUOTE, /* NOTUSED */
198 ERR_SYNTAX_UNQUOTE,
199 ERR_SYNTAX_NOPUNCT,
200 ERR_SYNTAX_WS,
201 ERR_SYNTAX_ARG,
202 ERR_SYNTAX_ARGFORM,
203 ERR_SYNTAX_ARGVAL,
204 ERR_SYNTAX_ARGBAD,
205 ERR_SYNTAX_ARGMISS,
206 ERR_SYNTAX_ARGMANY,
207 ERR_MACRO_NOTSUP,
208 ERR_MACRO_NOTCALL,
209 ERR_SCOPE_BREAK,
210 ERR_SCOPE_NOCTX,
211 ERR_SCOPE_NONEST,
212 ERR_SEC_PROLOGUE,
213 ERR_SEC_NPROLOGUE,
214 ERR_SEC_PROLOGUE_OO,
215 ERR_SEC_PROLOGUE_REP,
216 ERR_SEC_NAME,
217 ERR_ARGS_EQ0,
218 ERR_ARGS_EQ1,
219 ERR_ARGS_GE1,
220 ERR_ARGS_LE2,
221 ERR_ARGS_LE8,
222 ERR_ARGS_MANY,
223 ERR_SYNTAX_CHILDBAD,
224 ERR_SYNTAX_PARENTBAD,
225 ERR_SYNTAX_CHILDHEAD,
226 ERR_SYNTAX_CHILDBODY,
227 ERR_SYNTAX_EMPTYBODY,
228 ERR_SYNTAX_EMPTYHEAD,
229 ERR_SYNTAX_NOTEXT
230 };
231
232 enum mdoc_att {
233 ATT_DEFAULT = 0,
234 ATT_v1,
235 ATT_v2,
236 ATT_v3,
237 ATT_v4,
238 ATT_v5,
239 ATT_v6,
240 ATT_v7,
241 ATT_32v,
242 ATT_V1,
243 ATT_V2,
244 ATT_V3,
245 ATT_V4
246 };
247
248 enum mdoc_warn {
249 WARN_SYNTAX_WS_EOLN,
250 WARN_SYNTAX_MACLIKE,
251 WARN_SYNTAX_ARGLIKE,
252 WARN_SYNTAX_QUOTED,
253 WARN_SYNTAX_EMPTYHEAD,
254 WARN_SYNTAX_EMPTYBODY,
255 WARN_SYNTAX_NOBODY,
256 WARN_IGN_AFTER_BLK,
257 WARN_IGN_BEFORE_BLK,
258 WARN_IGN_OBSOLETE,
259 WARN_SEC_OO,
260 WARN_SEC_REP,
261 WARN_ARGS_GE1,
262 WARN_ARGS_EQ0,
263 WARN_COMPAT_TROFF
264 };
265
266 struct mdoc_arg {
267 int arg;
268 int line;
269 int pos;
270 size_t sz;
271 char **value;
272 };
273
274 enum mdoc_type {
275 MDOC_TEXT,
276 MDOC_ELEM,
277 MDOC_HEAD,
278 MDOC_TAIL,
279 MDOC_BODY,
280 MDOC_BLOCK,
281 MDOC_ROOT
282 };
283
284 enum mdoc_msec {
285 MSEC_DEFAULT = 0,
286 MSEC_1,
287 MSEC_2,
288 MSEC_3,
289 MSEC_3f,
290 MSEC_3p,
291 MSEC_4,
292 MSEC_5,
293 MSEC_6,
294 MSEC_7,
295 MSEC_8,
296 MSEC_9,
297 MSEC_X11,
298 MSEC_X11R6,
299 MSEC_local,
300 MSEC_n,
301 MSEC_unass,
302 MSEC_draft,
303 MSEC_paper
304 };
305
306 enum mdoc_sec {
307 SEC_PROLOGUE = 0,
308 SEC_BODY,
309 SEC_NAME,
310 SEC_SYNOPSIS,
311 SEC_DESCRIPTION,
312 SEC_RETURN_VALUES,
313 SEC_ENVIRONMENT,
314 SEC_FILES,
315 SEC_EXAMPLES,
316 SEC_DIAGNOSTICS,
317 SEC_ERRORS,
318 SEC_SEE_ALSO,
319 SEC_STANDARDS,
320 SEC_HISTORY,
321 SEC_AUTHORS,
322 SEC_CAVEATS,
323 SEC_BUGS,
324 SEC_CUSTOM
325 };
326
327 enum mdoc_vol {
328 VOL_DEFAULT = 0,
329 VOL_AMD,
330 VOL_IND,
331 VOL_KM,
332 VOL_LOCAL,
333 VOL_PRM,
334 VOL_PS1,
335 VOL_SMM,
336 VOL_URM,
337 VOL_USD
338 };
339
340 enum mdoc_arch {
341 ARCH_DEFAULT = 0,
342 ARCH_alpha,
343 ARCH_amd64,
344 ARCH_amiga,
345 ARCH_arc,
346 ARCH_armish,
347 ARCH_aviion,
348 ARCH_hp300,
349 ARCH_hppa,
350 ARCH_hppa64,
351 ARCH_i386,
352 ARCH_landisk,
353 ARCH_luna88k,
354 ARCH_mac68k,
355 ARCH_macppc,
356 ARCH_mvme68k,
357 ARCH_mvme88k,
358 ARCH_mvmeppc,
359 ARCH_pmax,
360 ARCH_sgi,
361 ARCH_socppc,
362 ARCH_sparc,
363 ARCH_sparc64,
364 ARCH_sun3,
365 ARCH_vax,
366 ARCH_zaurus
367 };
368
369 struct mdoc_meta {
370 enum mdoc_msec msec;
371 enum mdoc_vol vol;
372 enum mdoc_arch arch;
373 time_t date;
374 #define META_TITLE_SZ (64)
375 char title[META_TITLE_SZ];
376 #define META_OS_SZ (64)
377 char os[META_OS_SZ];
378 };
379
380 struct mdoc_text {
381 char *string;
382 };
383
384 struct mdoc_block {
385 size_t argc;
386 struct mdoc_arg *argv;
387 struct mdoc_node *head;
388 struct mdoc_node *body;
389 struct mdoc_node *tail;
390 };
391
392 struct mdoc_elem {
393 size_t sz;
394 char **args;
395 size_t argc;
396 struct mdoc_arg *argv;
397 };
398
399 union mdoc_data {
400 struct mdoc_text text;
401 struct mdoc_elem elem;
402 struct mdoc_block block;
403 };
404
405 struct mdoc_node {
406 struct mdoc_node *parent;
407 struct mdoc_node *child;
408 struct mdoc_node *next;
409 struct mdoc_node *prev;
410 int line;
411 int pos;
412 int tok;
413 enum mdoc_type type;
414 union mdoc_data data;
415 };
416
417 struct mdoc_cb {
418 int (*mdoc_err)(void *, int, int, enum mdoc_err);
419 int (*mdoc_warn)(void *, int, int, enum mdoc_warn);
420 void (*mdoc_msg)(void *, int, int, const char *);
421 };
422
423 extern const char *const *mdoc_macronames;
424 extern const char *const *mdoc_argnames;
425
426 __BEGIN_DECLS
427
428 struct mdoc;
429
430 void mdoc_free(struct mdoc *);
431 struct mdoc *mdoc_alloc(void *data, const struct mdoc_cb *);
432 int mdoc_parseln(struct mdoc *, int, char *buf);
433 const struct mdoc_node
434 *mdoc_result(struct mdoc *);
435 int mdoc_endparse(struct mdoc *);
436
437 __END_DECLS
438
439 #endif /*!MDOC_H*/