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