1 /* $Vendor-Id: libmdoc.h,v 1.63 2010/11/30 13:04:14 kristaps Exp $ */ 2 /* 3 * Copyright (c) 2008, 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 LIBMDOC_H 18 #define LIBMDOC_H 19 20 #include "mdoc.h" 21 22 enum mdoc_next { 23 MDOC_NEXT_SIBLING = 0, 24 MDOC_NEXT_CHILD 25 }; 26 27 struct mdoc { 28 void *data; /* private application data */ 29 mandocmsg msg; /* message callback */ 30 int flags; 31 #define MDOC_HALT (1 << 0) /* error in parse: halt */ 32 #define MDOC_LITERAL (1 << 1) /* in a literal scope */ 33 #define MDOC_PBODY (1 << 2) /* in the document body */ 34 #define MDOC_NEWLINE (1 << 3) /* first macro/text in a line */ 35 #define MDOC_PHRASELIT (1 << 4) /* literal within a partila phrase */ 36 #define MDOC_PPHRASE (1 << 5) /* within a partial phrase */ 37 #define MDOC_FREECOL (1 << 6) /* `It' invocation should close */ 38 #define MDOC_SYNOPSIS (1 << 7) /* SYNOPSIS-style formatting */ 39 enum mdoc_next next; /* where to put the next node */ 40 struct mdoc_node *last; /* the last node parsed */ 41 struct mdoc_node *first; /* the first node parsed */ 42 struct mdoc_meta meta; /* document meta-data */ 43 enum mdoc_sec lastnamed; 44 enum mdoc_sec lastsec; 45 struct regset *regs; /* registers */ 46 }; 47 48 #define MACRO_PROT_ARGS struct mdoc *m, \ 49 enum mdoct tok, \ 50 int line, \ 51 int ppos, \ 52 int *pos, \ 53 char *buf 54 55 struct mdoc_macro { 56 int (*fp)(MACRO_PROT_ARGS); 57 int flags; 58 #define MDOC_CALLABLE (1 << 0) 59 #define MDOC_PARSED (1 << 1) 60 #define MDOC_EXPLICIT (1 << 2) 61 #define MDOC_PROLOGUE (1 << 3) 62 #define MDOC_IGNDELIM (1 << 4) 63 /* Reserved words in arguments treated as text. */ 64 }; 65 66 enum margserr { 67 ARGS_ERROR, 68 ARGS_EOLN, 69 ARGS_WORD, 70 ARGS_PUNCT, 71 ARGS_QWORD, 72 ARGS_PHRASE, 73 ARGS_PPHRASE, 74 ARGS_PEND 75 }; 76 77 enum margverr { 78 ARGV_ERROR, 79 ARGV_EOLN, 80 ARGV_ARG, 81 ARGV_WORD 82 }; 83 84 enum mdelim { 85 DELIM_NONE = 0, 86 DELIM_OPEN, 87 DELIM_MIDDLE, 88 DELIM_CLOSE 89 }; 90 91 extern const struct mdoc_macro *const mdoc_macros; 92 93 __BEGIN_DECLS 94 95 #define mdoc_pmsg(m, l, p, t) \ 96 (*(m)->msg)((t), (m)->data, (l), (p), NULL) 97 #define mdoc_nmsg(m, n, t) \ 98 (*(m)->msg)((t), (m)->data, (n)->line, (n)->pos, NULL) 99 int mdoc_vmsg(struct mdoc *, enum mandocerr, 100 int, int, const char *, ...); 101 int mdoc_macro(MACRO_PROT_ARGS); 102 int mdoc_word_alloc(struct mdoc *, 103 int, int, const char *); 104 int mdoc_elem_alloc(struct mdoc *, int, int, 105 enum mdoct, struct mdoc_arg *); 106 int mdoc_block_alloc(struct mdoc *, int, int, 107 enum mdoct, struct mdoc_arg *); 108 int mdoc_head_alloc(struct mdoc *, int, int, enum mdoct); 109 int mdoc_tail_alloc(struct mdoc *, int, int, enum mdoct); 110 int mdoc_body_alloc(struct mdoc *, int, int, enum mdoct); 111 int mdoc_endbody_alloc(struct mdoc *m, int line, int pos, 112 enum mdoct tok, struct mdoc_node *body, 113 enum mdoc_endbody end); 114 void mdoc_node_delete(struct mdoc *, struct mdoc_node *); 115 void mdoc_hash_init(void); 116 enum mdoct mdoc_hash_find(const char *); 117 enum mdelim mdoc_iscdelim(char); 118 enum mdelim mdoc_isdelim(const char *); 119 size_t mdoc_isescape(const char *); 120 enum mdoc_sec mdoc_str2sec(const char *); 121 time_t mdoc_atotime(const char *); 122 size_t mdoc_macro2len(enum mdoct); 123 const char *mdoc_a2att(const char *); 124 const char *mdoc_a2lib(const char *); 125 const char *mdoc_a2st(const char *); 126 const char *mdoc_a2arch(const char *); 127 const char *mdoc_a2vol(const char *); 128 const char *mdoc_a2msec(const char *); 129 int mdoc_valid_pre(struct mdoc *, struct mdoc_node *); 130 int mdoc_valid_post(struct mdoc *); 131 enum margverr mdoc_argv(struct mdoc *, int, enum mdoct, 132 struct mdoc_arg **, int *, char *); 133 void mdoc_argv_free(struct mdoc_arg *); 134 void mdoc_argn_free(struct mdoc_arg *, int); 135 enum margserr mdoc_args(struct mdoc *, int, 136 int *, char *, enum mdoct, char **); 137 enum margserr mdoc_zargs(struct mdoc *, int, 138 int *, char *, int, char **); 139 #define ARGS_DELIM (1 << 1) 140 #define ARGS_TABSEP (1 << 2) 141 #define ARGS_NOWARN (1 << 3) 142 143 int mdoc_macroend(struct mdoc *); 144 145 __END_DECLS 146 147 #endif /*!LIBMDOC_H*/ 148