mdocml: Switch to using the files in contrib/mdocml
[dragonfly.git] / usr.bin / mandoc / libmdoc.h
1 /*      $Id: libmdoc.h,v 1.30 2009/10/30 05:58:37 kristaps 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 LIBMDOC_H
18 #define LIBMDOC_H
19
20 #include "mdoc.h"
21
22 enum    mdoc_next {
23         MDOC_NEXT_SIBLING = 0,
24         MDOC_NEXT_CHILD
25 };
26
27 struct  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
43 enum    merr {
44         ETAILWS = 0,
45         EQUOTPARM,
46         EQUOTTERM,
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
102 struct  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
113 extern  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
126 int               mdoc_err(struct mdoc *, int, int, int, enum merr);
127 int               mdoc_verr(struct mdoc *, int, int, const char *, ...);
128 int               mdoc_vwarn(struct mdoc *, int, int, const char *, ...);
129
130 int               mdoc_macro(MACRO_PROT_ARGS);
131 int               mdoc_word_alloc(struct mdoc *,
132                         int, int, const char *);
133 int               mdoc_elem_alloc(struct mdoc *, int, int,
134                         int, struct mdoc_arg *);
135 int               mdoc_block_alloc(struct mdoc *, int, int,
136                         int, struct mdoc_arg *);
137 int               mdoc_head_alloc(struct mdoc *, int, int, int);
138 int               mdoc_tail_alloc(struct mdoc *, int, int, int);
139 int               mdoc_body_alloc(struct mdoc *, int, int, int);
140 void              mdoc_node_free(struct mdoc_node *);
141 void              mdoc_node_freelist(struct mdoc_node *);
142 void              mdoc_hash_init(void);
143 int               mdoc_hash_find(const char *);
144 int               mdoc_iscdelim(char);
145 int               mdoc_isdelim(const char *);
146 size_t            mdoc_isescape(const char *);
147 enum    mdoc_sec  mdoc_atosec(const char *);
148 time_t            mdoc_atotime(const char *);
149
150 size_t            mdoc_macro2len(int);
151 const char       *mdoc_a2att(const char *);
152 const char       *mdoc_a2lib(const char *);
153 const char       *mdoc_a2st(const char *);
154 const char       *mdoc_a2arch(const char *);
155 const char       *mdoc_a2vol(const char *);
156 const char       *mdoc_a2msec(const char *);
157 int               mdoc_valid_pre(struct mdoc *,
158                         const struct mdoc_node *);
159 int               mdoc_valid_post(struct mdoc *);
160 int               mdoc_action_pre(struct mdoc *,
161                         const struct mdoc_node *);
162 int               mdoc_action_post(struct mdoc *);
163 int               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)
169 void              mdoc_argv_free(struct mdoc_arg *);
170 int               mdoc_args(struct mdoc *, int,
171                         int *, char *, int, char **);
172 int               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)
183 int               mdoc_macroend(struct mdoc *);
184
185 __END_DECLS
186
187 #endif /*!LIBMDOC_H*/