xref: /openbsd/usr.bin/mandoc/libman.h (revision b04f9fcc)
1*b04f9fccSschwarze /*	$Id: libman.h,v 1.14 2010/03/29 22:56:52 schwarze Exp $ */
2f73abda9Skristaps /*
3a6464425Sschwarze  * Copyright (c) 2009 Kristaps Dzonsons <kristaps@kth.se>
4f73abda9Skristaps  *
5f73abda9Skristaps  * Permission to use, copy, modify, and distribute this software for any
6a6464425Sschwarze  * purpose with or without fee is hereby granted, provided that the above
7a6464425Sschwarze  * copyright notice and this permission notice appear in all copies.
8f73abda9Skristaps  *
9a6464425Sschwarze  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10a6464425Sschwarze  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11a6464425Sschwarze  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12a6464425Sschwarze  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13a6464425Sschwarze  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14a6464425Sschwarze  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15a6464425Sschwarze  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16f73abda9Skristaps  */
17f73abda9Skristaps #ifndef LIBMAN_H
18f73abda9Skristaps #define LIBMAN_H
19f73abda9Skristaps 
20f73abda9Skristaps #include "man.h"
21f73abda9Skristaps 
22f73abda9Skristaps enum	man_next {
23f73abda9Skristaps 	MAN_NEXT_SIBLING = 0,
24f73abda9Skristaps 	MAN_NEXT_CHILD
25f73abda9Skristaps };
26f73abda9Skristaps 
27f73abda9Skristaps struct	man {
28f73abda9Skristaps 	void		*data;
29f73abda9Skristaps 	struct man_cb	 cb;
30f73abda9Skristaps 	int		 pflags;
31f73abda9Skristaps 	int		 flags;
32f73abda9Skristaps #define	MAN_HALT	(1 << 0)
33e35cb253Sschwarze #define	MAN_ELINE	(1 << 1) /* Next-line element scope. */
34e35cb253Sschwarze #define	MAN_BLINE	(1 << 2) /* Next-line block scope. */
3587e50d6cSschwarze #define	MAN_ILINE	(1 << 3) /* Ignored in next-line scope. */
3687e50d6cSschwarze #define	MAN_LITERAL	(1 << 4) /* Literal input. */
37f73abda9Skristaps 	enum man_next	 next;
38f73abda9Skristaps 	struct man_node	*last;
39f73abda9Skristaps 	struct man_node	*first;
40f73abda9Skristaps 	struct man_meta	 meta;
41f73abda9Skristaps };
42f73abda9Skristaps 
43161440b4Sschwarze enum	merr {
448269e7e2Sschwarze 	WNPRINT = 0,
45161440b4Sschwarze 	WMSEC,
46161440b4Sschwarze 	WDATE,
47161440b4Sschwarze 	WLNSCOPE,
4887e50d6cSschwarze 	WLNSCOPE2,
49161440b4Sschwarze 	WTSPACE,
50161440b4Sschwarze 	WTQUOTE,
51161440b4Sschwarze 	WNODATA,
52d31954ecSschwarze 	WNOTITLE,
538269e7e2Sschwarze 	WESCAPE,
548dc37b1cSschwarze 	WNUMFMT,
55e35cb253Sschwarze 	WHEADARGS,
56e35cb253Sschwarze 	WBODYARGS,
57e35cb253Sschwarze 	WNHEADARGS,
58e35cb253Sschwarze 	WMACROFORM,
59e35cb253Sschwarze 	WEXITSCOPE,
60fbaebbd2Sschwarze 	WNOSCOPE,
61fbaebbd2Sschwarze 	WOLITERAL,
62fbaebbd2Sschwarze 	WNLITERAL,
63ac531cf1Sschwarze 	WROFFNEST,
64*b04f9fccSschwarze 	WROFFSCOPE,
65*b04f9fccSschwarze 	WTITLECASE,
668269e7e2Sschwarze 	WERRMAX
67161440b4Sschwarze };
68161440b4Sschwarze 
69ac531cf1Sschwarze #define	MACRO_PROT_ARGS	  struct man *m, enum mant tok, int line, \
70e35cb253Sschwarze 			  int ppos, int *pos, char *buf
71e35cb253Sschwarze 
72e35cb253Sschwarze struct	man_macro {
73e35cb253Sschwarze 	int		(*fp)(MACRO_PROT_ARGS);
74e35cb253Sschwarze 	int		  flags;
75e35cb253Sschwarze #define	MAN_SCOPED	 (1 << 0)
76fbaebbd2Sschwarze #define	MAN_EXPLICIT	 (1 << 1)	/* See blk_imp(). */
77fbaebbd2Sschwarze #define	MAN_FSCOPED	 (1 << 2)	/* See blk_imp(). */
7887e50d6cSschwarze #define	MAN_NSCOPED	 (1 << 3)	/* See in_line_eoln(). */
79ac531cf1Sschwarze #define	MAN_NOCLOSE	 (1 << 4)	/* See blk_exp(). */
80e35cb253Sschwarze };
81e35cb253Sschwarze 
82e35cb253Sschwarze extern	const struct man_macro *const man_macros;
83e35cb253Sschwarze 
84f73abda9Skristaps __BEGIN_DECLS
85f73abda9Skristaps 
86161440b4Sschwarze #define		  man_perr(m, l, p, t) \
878269e7e2Sschwarze 		  man_err((m), (l), (p), 1, (t))
88161440b4Sschwarze #define		  man_pwarn(m, l, p, t) \
898269e7e2Sschwarze 		  man_err((m), (l), (p), 0, (t))
90161440b4Sschwarze #define		  man_nerr(m, n, t) \
91161440b4Sschwarze 		  man_err((m), (n)->line, (n)->pos, 1, (t))
92161440b4Sschwarze #define		  man_nwarn(m, n, t) \
93161440b4Sschwarze 		  man_err((m), (n)->line, (n)->pos, 0, (t))
94161440b4Sschwarze 
95f73abda9Skristaps int		  man_word_alloc(struct man *, int, int, const char *);
96ac531cf1Sschwarze int		  man_block_alloc(struct man *, int, int, enum mant);
97ac531cf1Sschwarze int		  man_head_alloc(struct man *, int, int, enum mant);
98ac531cf1Sschwarze int		  man_body_alloc(struct man *, int, int, enum mant);
99ac531cf1Sschwarze int		  man_elem_alloc(struct man *, int, int, enum mant);
100ac531cf1Sschwarze void		  man_node_delete(struct man *, struct man_node *);
101e5c95480Sschwarze void		  man_hash_init(void);
102ac531cf1Sschwarze enum	mant	  man_hash_find(const char *);
103f73abda9Skristaps int		  man_macroend(struct man *);
104e35cb253Sschwarze int		  man_args(struct man *, int, int *, char *, char **);
105e35cb253Sschwarze #define	ARGS_ERROR	(-1)
106e35cb253Sschwarze #define	ARGS_EOLN	(0)
107e35cb253Sschwarze #define	ARGS_WORD	(1)
108e35cb253Sschwarze #define	ARGS_QWORD	(1)
109e35cb253Sschwarze int		  man_err(struct man *, int, int, int, enum merr);
110f73abda9Skristaps int		  man_vwarn(struct man *, int, int, const char *, ...);
111f73abda9Skristaps int		  man_verr(struct man *, int, int, const char *, ...);
112f73abda9Skristaps int		  man_valid_post(struct man *);
113e35cb253Sschwarze int		  man_valid_pre(struct man *, const struct man_node *);
114f73abda9Skristaps int		  man_action_post(struct man *);
115fbaebbd2Sschwarze int		  man_action_pre(struct man *, struct man_node *);
116*b04f9fccSschwarze int		  man_unscope(struct man *,
117*b04f9fccSschwarze 			const struct man_node *, enum merr);
118f73abda9Skristaps 
119f73abda9Skristaps __END_DECLS
120f73abda9Skristaps 
121f73abda9Skristaps #endif /*!LIBMAN_H*/
122