mandoc(1): Update to 1.9.13.
[dragonfly.git] / usr.bin / mandoc / libmdoc.h
CommitLineData
32c903ac 1/* $Id: libmdoc.h,v 1.30 2009/10/30 05:58:37 kristaps Exp $ */
589e7c1d
SW
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 LIBMDOC_H
18#define LIBMDOC_H
19
20#include "mdoc.h"
21
22enum mdoc_next {
23 MDOC_NEXT_SIBLING = 0,
24 MDOC_NEXT_CHILD
25};
26
27struct mdoc {
28 void *data;
29 struct mdoc_cb cb;
30 int flags;
31#define MDOC_HALT (1 << 0) /* Error in parse. Halt. */
32#define MDOC_LITERAL (1 << 1) /* In a literal scope. */
33#define MDOC_PBODY (1 << 2) /* In the document body. */
34 int pflags;
35 enum mdoc_next next;
36 struct mdoc_node *last;
37 struct mdoc_node *first;
38 struct mdoc_meta meta;
39 enum mdoc_sec lastnamed;
40 enum mdoc_sec lastsec;
41};
42
43enum merr {
44 ETAILWS = 0,
45 EQUOTPARM,
46 EQUOTTERM,
589e7c1d
SW
47 EARGVAL,
48 EBODYPROL,
49 EPROLBODY,
50 ETEXTPROL,
51 ENOBLANK,
52 ETOOLONG,
53 EESCAPE,
54 EPRINT,
55 ENODAT,
56 ENOPROLOGUE,
57 ELINE,
58 EATT,
59 ENAME,
60 ELISTTYPE,
61 EDISPTYPE,
62 EMULTIDISP,
63 EMULTILIST,
64 ESECNAME,
65 ENAMESECINC,
66 EARGREP,
67 EBOOL,
68 ECOLMIS,
69 ENESTDISP,
70 EMISSWIDTH,
71 EWRONGMSEC,
72 ESECOOO,
73 ESECREP,
74 EBADSTAND,
75 ENOMULTILINE,
76 EMULTILINE,
77 ENOLINE,
78 EPROLOOO,
79 EPROLREP,
80 EBADMSEC,
81 EBADSEC,
82 EFONT,
83 EBADDATE,
84 ENUMFMT,
85 ENOWIDTH,
86 EUTSNAME,
87 EOBS,
88 EIMPBRK,
89 EIGNE,
90 EOPEN,
91 EQUOTPHR,
92 ENOCTX,
93 ELIB,
94 EBADCHILD,
95 ENOTYPE,
96 MERRMAX
97};
98
99#define MACRO_PROT_ARGS struct mdoc *m, int tok, int line, \
100 int ppos, int *pos, char *buf
101
102struct mdoc_macro {
103 int (*fp)(MACRO_PROT_ARGS);
104 int flags;
105#define MDOC_CALLABLE (1 << 0)
106#define MDOC_PARSED (1 << 1)
107#define MDOC_EXPLICIT (1 << 2)
108#define MDOC_PROLOGUE (1 << 3)
109#define MDOC_IGNDELIM (1 << 4)
110 /* Reserved words in arguments treated as text. */
111};
112
113extern const struct mdoc_macro *const mdoc_macros;
114
115__BEGIN_DECLS
116
117#define mdoc_perr(m, l, p, t) \
118 mdoc_err((m), (l), (p), 1, (t))
119#define mdoc_pwarn(m, l, p, t) \
120 mdoc_err((m), (l), (p), 0, (t))
121#define mdoc_nerr(m, n, t) \
122 mdoc_err((m), (n)->line, (n)->pos, 1, (t))
123#define mdoc_nwarn(m, n, t) \
124 mdoc_err((m), (n)->line, (n)->pos, 0, (t))
125
126int mdoc_err(struct mdoc *, int, int, int, enum merr);
127int mdoc_verr(struct mdoc *, int, int, const char *, ...);
128int mdoc_vwarn(struct mdoc *, int, int, const char *, ...);
129
130int mdoc_macro(MACRO_PROT_ARGS);
131int mdoc_word_alloc(struct mdoc *,
132 int, int, const char *);
133int mdoc_elem_alloc(struct mdoc *, int, int,
134 int, struct mdoc_arg *);
135int mdoc_block_alloc(struct mdoc *, int, int,
136 int, struct mdoc_arg *);
137int mdoc_head_alloc(struct mdoc *, int, int, int);
138int mdoc_tail_alloc(struct mdoc *, int, int, int);
139int mdoc_body_alloc(struct mdoc *, int, int, int);
140void mdoc_node_free(struct mdoc_node *);
141void mdoc_node_freelist(struct mdoc_node *);
142void mdoc_hash_init(void);
143int mdoc_hash_find(const char *);
144int mdoc_iscdelim(char);
145int mdoc_isdelim(const char *);
146size_t mdoc_isescape(const char *);
147enum mdoc_sec mdoc_atosec(const char *);
148time_t mdoc_atotime(const char *);
149
150size_t mdoc_macro2len(int);
151const char *mdoc_a2att(const char *);
152const char *mdoc_a2lib(const char *);
153const char *mdoc_a2st(const char *);
154const char *mdoc_a2arch(const char *);
155const char *mdoc_a2vol(const char *);
156const char *mdoc_a2msec(const char *);
157int mdoc_valid_pre(struct mdoc *,
158 const struct mdoc_node *);
159int mdoc_valid_post(struct mdoc *);
160int mdoc_action_pre(struct mdoc *,
161 const struct mdoc_node *);
162int mdoc_action_post(struct mdoc *);
163int mdoc_argv(struct mdoc *, int, int,
164 struct mdoc_arg **, int *, char *);
165#define ARGV_ERROR (-1)
166#define ARGV_EOLN (0)
167#define ARGV_ARG (1)
168#define ARGV_WORD (2)
169void mdoc_argv_free(struct mdoc_arg *);
170int mdoc_args(struct mdoc *, int,
171 int *, char *, int, char **);
172int mdoc_zargs(struct mdoc *, int,
173 int *, char *, int, char **);
174#define ARGS_DELIM (1 << 1) /* See args(). */
175#define ARGS_TABSEP (1 << 2) /* See args(). */
176#define ARGS_NOWARN (1 << 3) /* See args(). */
177#define ARGS_ERROR (-1)
178#define ARGS_EOLN (0)
179#define ARGS_WORD (1)
180#define ARGS_PUNCT (2)
181#define ARGS_QWORD (3)
182#define ARGS_PHRASE (4)
183int mdoc_macroend(struct mdoc *);
184
185__END_DECLS
186
187#endif /*!LIBMDOC_H*/