xref: /openbsd-src/usr.bin/mandoc/libmdoc.h (revision 43003dfe3ad45d1698bed8a37f2b0f5b14f20d4f)
1 /*	$Id: libmdoc.h,v 1.21 2009/09/21 21:11:37 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 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 	EMALLOC,
48 	EARGVAL,
49 	EBODYPROL,
50 	EPROLBODY,
51 	ETEXTPROL,
52 	ENOBLANK,
53 	ETOOLONG,
54 	EESCAPE,
55 	EPRINT,
56 	ENODAT,
57 	ENOPROLOGUE,
58 	ELINE,
59 	EATT,
60 	ENAME,
61 	ELISTTYPE,
62 	EDISPTYPE,
63 	EMULTIDISP,
64 	EMULTILIST,
65 	ESECNAME,
66 	ENAMESECINC,
67 	EARGREP,
68 	EBOOL,
69 	ECOLMIS,
70 	ENESTDISP,
71 	EMISSWIDTH,
72 	EWRONGMSEC,
73 	ESECOOO,
74 	ESECREP,
75 	EBADSTAND,
76 	ENOMULTILINE,
77 	EMULTILINE,
78 	ENOLINE,
79 	EPROLOOO,
80 	EPROLREP,
81 	EBADMSEC,
82 	EBADSEC,
83 	EFONT,
84 	EBADDATE,
85 	ENUMFMT,
86 	ENOWIDTH,
87 	EUTSNAME,
88 	EOBS,
89 	EIMPBRK,
90 	EIGNE,
91 	EOPEN,
92 	EQUOTPHR,
93 	ENOCTX,
94 	ELIB,
95 	MERRMAX
96 };
97 
98 #define	MACRO_PROT_ARGS	struct mdoc *m, int tok, int line, \
99 			int ppos, int *pos, char *buf
100 
101 struct	mdoc_macro {
102 	int		(*fp)(MACRO_PROT_ARGS);
103 	int		  flags;
104 #define	MDOC_CALLABLE	 (1 << 0)
105 #define	MDOC_PARSED	 (1 << 1)
106 #define	MDOC_EXPLICIT	 (1 << 2)
107 #define	MDOC_PROLOGUE	 (1 << 3)
108 #define	MDOC_IGNDELIM	 (1 << 4)
109 	/* Reserved words in arguments treated as text. */
110 };
111 
112 extern	const struct mdoc_macro *const mdoc_macros;
113 
114 __BEGIN_DECLS
115 
116 #define		  mdoc_perr(m, l, p, t) \
117 		  mdoc_err((m), (l), (p), 1, (t))
118 #define		  mdoc_pwarn(m, l, p, t) \
119 		  mdoc_err((m), (l), (p), 0, (t))
120 #define		  mdoc_nerr(m, n, t) \
121 		  mdoc_err((m), (n)->line, (n)->pos, 1, (t))
122 #define		  mdoc_nwarn(m, n, t) \
123 		  mdoc_err((m), (n)->line, (n)->pos, 0, (t))
124 
125 int		  mdoc_err(struct mdoc *, int, int, int, enum merr);
126 int		  mdoc_verr(struct mdoc *, int, int, const char *, ...);
127 int		  mdoc_vwarn(struct mdoc *, int, int, const char *, ...);
128 
129 int		  mdoc_macro(MACRO_PROT_ARGS);
130 int		  mdoc_word_alloc(struct mdoc *,
131 			int, int, const char *);
132 int		  mdoc_elem_alloc(struct mdoc *, int, int,
133 			int, struct mdoc_arg *);
134 int		  mdoc_block_alloc(struct mdoc *, int, int,
135 			int, struct mdoc_arg *);
136 int		  mdoc_head_alloc(struct mdoc *, int, int, int);
137 int		  mdoc_tail_alloc(struct mdoc *, int, int, int);
138 int		  mdoc_body_alloc(struct mdoc *, int, int, int);
139 void		  mdoc_node_free(struct mdoc_node *);
140 void		  mdoc_node_freelist(struct mdoc_node *);
141 void		  mdoc_hash_init(void);
142 int		  mdoc_hash_find(const char *);
143 int		  mdoc_iscdelim(char);
144 int		  mdoc_isdelim(const char *);
145 size_t		  mdoc_isescape(const char *);
146 enum	mdoc_sec  mdoc_atosec(const char *);
147 time_t		  mdoc_atotime(const char *);
148 
149 size_t		  mdoc_macro2len(int);
150 const char	 *mdoc_a2att(const char *);
151 const char	 *mdoc_a2lib(const char *);
152 const char	 *mdoc_a2st(const char *);
153 const char	 *mdoc_a2arch(const char *);
154 const char	 *mdoc_a2vol(const char *);
155 const char	 *mdoc_a2msec(const char *);
156 int		  mdoc_valid_pre(struct mdoc *,
157 			const struct mdoc_node *);
158 int		  mdoc_valid_post(struct mdoc *);
159 int		  mdoc_action_pre(struct mdoc *,
160 			const struct mdoc_node *);
161 int		  mdoc_action_post(struct mdoc *);
162 int		  mdoc_argv(struct mdoc *, int, int,
163 			struct mdoc_arg **, int *, char *);
164 #define	ARGV_ERROR	(-1)
165 #define	ARGV_EOLN	(0)
166 #define	ARGV_ARG	(1)
167 #define	ARGV_WORD	(2)
168 void		  mdoc_argv_free(struct mdoc_arg *);
169 int		  mdoc_args(struct mdoc *, int,
170 			int *, char *, int, char **);
171 int		  mdoc_zargs(struct mdoc *, int,
172 			int *, char *, int, char **);
173 #define	ARGS_DELIM	(1 << 1)	/* See args(). */
174 #define	ARGS_TABSEP	(1 << 2)	/* See args(). */
175 #define	ARGS_NOWARN	(1 << 3)	/* See args(). */
176 #define	ARGS_ERROR	(-1)
177 #define	ARGS_EOLN	(0)
178 #define	ARGS_WORD	(1)
179 #define	ARGS_PUNCT	(2)
180 #define	ARGS_QWORD	(3)
181 #define	ARGS_PHRASE	(4)
182 int		  mdoc_macroend(struct mdoc *);
183 
184 __END_DECLS
185 
186 #endif /*!LIBMDOC_H*/
187