1 /* $Id: man.h,v 1.50 2011/01/01 12:59:17 kristaps Exp $ */ 2 /* 3 * Copyright (c) 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv> 4 * 5 * Permission to use, copy, modify, and distribute this software for any 6 * purpose with or without fee is hereby granted, provided that the above 7 * copyright notice and this permission notice appear in all copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16 */ 17 #ifndef MAN_H 18 #define MAN_H 19 20 /* 21 * What follows is a list of ALL possible macros. 22 */ 23 enum mant { 24 MAN_br = 0, 25 MAN_TH, 26 MAN_SH, 27 MAN_SS, 28 MAN_TP, 29 MAN_LP, 30 MAN_PP, 31 MAN_P, 32 MAN_IP, 33 MAN_HP, 34 MAN_SM, 35 MAN_SB, 36 MAN_BI, 37 MAN_IB, 38 MAN_BR, 39 MAN_RB, 40 MAN_R, 41 MAN_B, 42 MAN_I, 43 MAN_IR, 44 MAN_RI, 45 MAN_na, 46 MAN_sp, 47 MAN_nf, 48 MAN_fi, 49 MAN_RE, 50 MAN_RS, 51 MAN_DT, 52 MAN_UC, 53 MAN_PD, 54 MAN_AT, 55 MAN_in, 56 MAN_ft, 57 MAN_MAX 58 }; 59 60 /* 61 * Type of a syntax node. 62 */ 63 enum man_type { 64 MAN_TEXT, 65 MAN_ELEM, 66 MAN_ROOT, 67 MAN_BLOCK, 68 MAN_HEAD, 69 MAN_BODY, 70 MAN_TBL 71 }; 72 73 /* 74 * Information from prologue. 75 */ 76 struct man_meta { 77 char *msec; /* `TH' section (1, 3p, etc.) */ 78 time_t date; /* `TH' normalised date */ 79 char *rawdate; /* raw `TH' date */ 80 char *vol; /* `TH' volume */ 81 char *title; /* `TH' title (e.g., FOO) */ 82 char *source; /* `TH' source (e.g., GNU) */ 83 }; 84 85 /* 86 * Single node in tree-linked AST. 87 */ 88 struct man_node { 89 struct man_node *parent; /* parent AST node */ 90 struct man_node *child; /* first child AST node */ 91 struct man_node *next; /* sibling AST node */ 92 struct man_node *prev; /* prior sibling AST node */ 93 int nchild; /* number children */ 94 int line; 95 int pos; 96 enum mant tok; /* tok or MAN__MAX if none */ 97 int flags; 98 #define MAN_VALID (1 << 0) /* has been validated */ 99 #define MAN_EOS (1 << 2) /* at sentence boundary */ 100 enum man_type type; /* AST node type */ 101 char *string; /* TEXT node argument */ 102 struct man_node *head; /* BLOCK node HEAD ptr */ 103 struct man_node *body; /* BLOCK node BODY ptr */ 104 const struct tbl_span *span; /* TBL */ 105 }; 106 107 /* 108 * Names of macros. Index is enum mant. Indexing into this returns 109 * the normalised name, e.g., man_macronames[MAN_SH] -> "SH". 110 */ 111 extern const char *const *man_macronames; 112 113 __BEGIN_DECLS 114 115 struct man; 116 117 void man_free(struct man *); 118 struct man *man_alloc(struct regset *, void *, mandocmsg); 119 void man_reset(struct man *); 120 int man_parseln(struct man *, int, char *, int); 121 int man_endparse(struct man *); 122 int man_addspan(struct man *, 123 const struct tbl_span *); 124 125 const struct man_node *man_node(const struct man *); 126 const struct man_meta *man_meta(const struct man *); 127 128 __END_DECLS 129 130 #endif /*!MAN_H*/ 131