xref: /dflybsd-src/contrib/mdocml/libmdoc.h (revision 54ba96075f5891e4574304da6ba88f1a1afe520b)
1*54ba9607SSascha Wildner /*	$Id: libmdoc.h,v 1.117 2018/12/31 04:55:46 schwarze Exp $ */
280387638SSascha Wildner /*
336342e81SSascha Wildner  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
4*54ba9607SSascha Wildner  * Copyright (c) 2013,2014,2015,2017,2018 Ingo Schwarze <schwarze@openbsd.org>
580387638SSascha Wildner  *
680387638SSascha Wildner  * Permission to use, copy, modify, and distribute this software for any
780387638SSascha Wildner  * purpose with or without fee is hereby granted, provided that the above
880387638SSascha Wildner  * copyright notice and this permission notice appear in all copies.
980387638SSascha Wildner  *
10*54ba9607SSascha Wildner  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES
1180387638SSascha Wildner  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12*54ba9607SSascha Wildner  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR
1380387638SSascha Wildner  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
1480387638SSascha Wildner  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
1580387638SSascha Wildner  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
1680387638SSascha Wildner  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
1780387638SSascha Wildner  */
1880387638SSascha Wildner 
19*54ba9607SSascha Wildner struct	roff_node;
20*54ba9607SSascha Wildner struct	roff_man;
21*54ba9607SSascha Wildner struct	mdoc_arg;
2280387638SSascha Wildner 
23*54ba9607SSascha Wildner #define	MACRO_PROT_ARGS	struct roff_man *mdoc, \
24*54ba9607SSascha Wildner 			enum roff_tok tok, \
2580387638SSascha Wildner 			int line, \
2680387638SSascha Wildner 			int ppos, \
2780387638SSascha Wildner 			int *pos, \
2880387638SSascha Wildner 			char *buf
2980387638SSascha Wildner 
3080387638SSascha Wildner struct	mdoc_macro {
31*54ba9607SSascha Wildner 	void		(*fp)(MACRO_PROT_ARGS);
3280387638SSascha Wildner 	int		  flags;
3380387638SSascha Wildner #define	MDOC_CALLABLE	 (1 << 0)
3480387638SSascha Wildner #define	MDOC_PARSED	 (1 << 1)
3580387638SSascha Wildner #define	MDOC_EXPLICIT	 (1 << 2)
3680387638SSascha Wildner #define	MDOC_PROLOGUE	 (1 << 3)
3780387638SSascha Wildner #define	MDOC_IGNDELIM	 (1 << 4)
387888c61dSFranco Fichtner #define	MDOC_JOIN	 (1 << 5)
3980387638SSascha Wildner };
4080387638SSascha Wildner 
4180387638SSascha Wildner enum	margserr {
4280387638SSascha Wildner 	ARGS_ERROR,
43a4c7eb57SSascha Wildner 	ARGS_EOLN, /* end-of-line */
44a4c7eb57SSascha Wildner 	ARGS_WORD, /* normal word */
45*54ba9607SSascha Wildner 	ARGS_ALLOC, /* normal word from roff_getarg() */
46a4c7eb57SSascha Wildner 	ARGS_PUNCT, /* series of punctuation */
47*54ba9607SSascha Wildner 	ARGS_PHRASE /* Bl -column phrase */
4880387638SSascha Wildner };
4980387638SSascha Wildner 
5060e1e752SSascha Wildner /*
5160e1e752SSascha Wildner  * A punctuation delimiter is opening, closing, or "middle mark"
5260e1e752SSascha Wildner  * punctuation.  These govern spacing.
5360e1e752SSascha Wildner  * Opening punctuation (e.g., the opening parenthesis) suppresses the
5460e1e752SSascha Wildner  * following space; closing punctuation (e.g., the closing parenthesis)
5560e1e752SSascha Wildner  * suppresses the leading space; middle punctuation (e.g., the vertical
5660e1e752SSascha Wildner  * bar) can do either.  The middle punctuation delimiter bends the rules
5760e1e752SSascha Wildner  * depending on usage.
5860e1e752SSascha Wildner  */
5980387638SSascha Wildner enum	mdelim {
6080387638SSascha Wildner 	DELIM_NONE = 0,
6180387638SSascha Wildner 	DELIM_OPEN,
6280387638SSascha Wildner 	DELIM_MIDDLE,
6360e1e752SSascha Wildner 	DELIM_CLOSE,
6460e1e752SSascha Wildner 	DELIM_MAX
6580387638SSascha Wildner };
6680387638SSascha Wildner 
67*54ba9607SSascha Wildner const struct mdoc_macro *mdoc_macro(enum roff_tok);
6880387638SSascha Wildner 
69*54ba9607SSascha Wildner void		  mdoc_elem_alloc(struct roff_man *, int, int,
70*54ba9607SSascha Wildner 			enum roff_tok, struct mdoc_arg *);
71*54ba9607SSascha Wildner struct roff_node *mdoc_block_alloc(struct roff_man *, int, int,
72*54ba9607SSascha Wildner 			enum roff_tok, struct mdoc_arg *);
73*54ba9607SSascha Wildner void		  mdoc_tail_alloc(struct roff_man *, int, int,
74*54ba9607SSascha Wildner 			enum roff_tok);
75*54ba9607SSascha Wildner struct roff_node *mdoc_endbody_alloc(struct roff_man *, int, int,
76*54ba9607SSascha Wildner 			enum roff_tok, struct roff_node *);
77*54ba9607SSascha Wildner void		  mdoc_state(struct roff_man *, struct roff_node *);
78*54ba9607SSascha Wildner const char	 *mdoc_a2arch(const char *);
7980387638SSascha Wildner const char	 *mdoc_a2att(const char *);
8080387638SSascha Wildner const char	 *mdoc_a2lib(const char *);
81*54ba9607SSascha Wildner enum roff_sec	  mdoc_a2sec(const char *);
8280387638SSascha Wildner const char	 *mdoc_a2st(const char *);
83*54ba9607SSascha Wildner void		  mdoc_argv(struct roff_man *, int, enum roff_tok,
8480387638SSascha Wildner 			struct mdoc_arg **, int *, char *);
85*54ba9607SSascha Wildner enum margserr	  mdoc_args(struct roff_man *, int,
86*54ba9607SSascha Wildner 			int *, char *, enum roff_tok, char **);
8760e1e752SSascha Wildner enum mdelim	  mdoc_isdelim(const char *);
88