xref: /openbsd/usr.bin/mandoc/libman.h (revision 9830bf9f)
1*9830bf9fSschwarze /*	$Id: libman.h,v 1.23 2010/06/27 21:54:41 schwarze Exp $ */
2f73abda9Skristaps /*
331e23753Sschwarze  * Copyright (c) 2009 Kristaps Dzonsons <kristaps@bsd.lv>
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 
20*9830bf9fSschwarze #include "regs.h"
21f73abda9Skristaps #include "man.h"
22f73abda9Skristaps 
23f73abda9Skristaps enum	man_next {
24f73abda9Skristaps 	MAN_NEXT_SIBLING = 0,
25f73abda9Skristaps 	MAN_NEXT_CHILD
26f73abda9Skristaps };
27f73abda9Skristaps 
28f73abda9Skristaps struct	man {
29*9830bf9fSschwarze 	void		*data; /* private application data */
30*9830bf9fSschwarze 	mandocmsg	 msg; /* output message handler */
31a52dde15Sschwarze 	int		 pflags; /* parse flags (see man.h) */
32a52dde15Sschwarze 	int		 flags; /* parse flags */
33a52dde15Sschwarze #define	MAN_HALT	(1 << 0) /* badness happened: die */
34e35cb253Sschwarze #define	MAN_ELINE	(1 << 1) /* Next-line element scope. */
35e35cb253Sschwarze #define	MAN_BLINE	(1 << 2) /* Next-line block scope. */
3687e50d6cSschwarze #define	MAN_ILINE	(1 << 3) /* Ignored in next-line scope. */
3787e50d6cSschwarze #define	MAN_LITERAL	(1 << 4) /* Literal input. */
38a52dde15Sschwarze #define	MAN_BPLINE	(1 << 5)
39*9830bf9fSschwarze 	enum man_next	 next; /* where to put the next node */
40*9830bf9fSschwarze 	struct man_node	*last; /* the last parsed node */
41*9830bf9fSschwarze 	struct man_node	*first; /* the first parsed node */
42*9830bf9fSschwarze 	struct man_meta	 meta; /* document meta-data */
43*9830bf9fSschwarze 	struct regset	*regs; /* registers */
44f73abda9Skristaps };
45f73abda9Skristaps 
46*9830bf9fSschwarze #define	MACRO_PROT_ARGS	  struct man *m, \
47*9830bf9fSschwarze 			  enum mant tok, \
48*9830bf9fSschwarze 			  int line, \
49*9830bf9fSschwarze 			  int ppos, \
50*9830bf9fSschwarze 			  int *pos, \
51*9830bf9fSschwarze 			  char *buf
52e35cb253Sschwarze 
53e35cb253Sschwarze struct	man_macro {
54e35cb253Sschwarze 	int		(*fp)(MACRO_PROT_ARGS);
55e35cb253Sschwarze 	int		  flags;
56e35cb253Sschwarze #define	MAN_SCOPED	 (1 << 0)
57fbaebbd2Sschwarze #define	MAN_EXPLICIT	 (1 << 1)	/* See blk_imp(). */
58fbaebbd2Sschwarze #define	MAN_FSCOPED	 (1 << 2)	/* See blk_imp(). */
5987e50d6cSschwarze #define	MAN_NSCOPED	 (1 << 3)	/* See in_line_eoln(). */
60ac531cf1Sschwarze #define	MAN_NOCLOSE	 (1 << 4)	/* See blk_exp(). */
61e35cb253Sschwarze };
62e35cb253Sschwarze 
63e35cb253Sschwarze extern	const struct man_macro *const man_macros;
64e35cb253Sschwarze 
65f73abda9Skristaps __BEGIN_DECLS
66f73abda9Skristaps 
676e03d529Sschwarze #define		  man_pmsg(m, l, p, t) \
686e03d529Sschwarze 		  (*(m)->msg)((t), (m)->data, (l), (p), NULL)
696e03d529Sschwarze #define		  man_nmsg(m, n, t) \
706e03d529Sschwarze 		  (*(m)->msg)((t), (m)->data, (n)->line, (n)->pos, NULL)
71f73abda9Skristaps int		  man_word_alloc(struct man *, int, int, const char *);
72ac531cf1Sschwarze int		  man_block_alloc(struct man *, int, int, enum mant);
73ac531cf1Sschwarze int		  man_head_alloc(struct man *, int, int, enum mant);
74ac531cf1Sschwarze int		  man_body_alloc(struct man *, int, int, enum mant);
75ac531cf1Sschwarze int		  man_elem_alloc(struct man *, int, int, enum mant);
76ac531cf1Sschwarze void		  man_node_delete(struct man *, struct man_node *);
77e5c95480Sschwarze void		  man_hash_init(void);
78ac531cf1Sschwarze enum	mant	  man_hash_find(const char *);
79f73abda9Skristaps int		  man_macroend(struct man *);
80e35cb253Sschwarze int		  man_args(struct man *, int, int *, char *, char **);
81e35cb253Sschwarze #define	ARGS_ERROR	(-1)
82e35cb253Sschwarze #define	ARGS_EOLN	(0)
83e35cb253Sschwarze #define	ARGS_WORD	(1)
84e35cb253Sschwarze #define	ARGS_QWORD	(1)
856e03d529Sschwarze int		  man_vmsg(struct man *, enum mandocerr,
866e03d529Sschwarze 			int, int, const char *, ...);
87f73abda9Skristaps int		  man_valid_post(struct man *);
8831e23753Sschwarze int		  man_valid_pre(struct man *, struct man_node *);
89f73abda9Skristaps int		  man_action_post(struct man *);
90fbaebbd2Sschwarze int		  man_action_pre(struct man *, struct man_node *);
91b04f9fccSschwarze int		  man_unscope(struct man *,
926e03d529Sschwarze 			const struct man_node *, enum mandocerr);
93f73abda9Skristaps 
94f73abda9Skristaps __END_DECLS
95f73abda9Skristaps 
96f73abda9Skristaps #endif /*!LIBMAN_H*/
97