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