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