1 /* $Id: mdoc.h,v 1.13 2009/08/22 22:11:24 schwarze Exp $ */ 2 /* 3 * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se> 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 MDOC_H 18 #define MDOC_H 19 20 #include <time.h> 21 22 /* 23 * This library implements a validating scanner/parser for ``mdoc'' roff 24 * macro documents, a.k.a. BSD manual page documents. The mdoc.c file 25 * drives the parser, while macro.c describes the macro ontologies. 26 * validate.c pre- and post-validates parsed macros, and action.c 27 * performs actions on parsed and validated macros. 28 */ 29 30 /* What follows is a list of ALL possible macros. */ 31 32 #define MDOC_Ap 0 33 #define MDOC_Dd 1 34 #define MDOC_Dt 2 35 #define MDOC_Os 3 36 #define MDOC_Sh 4 37 #define MDOC_Ss 5 38 #define MDOC_Pp 6 39 #define MDOC_D1 7 40 #define MDOC_Dl 8 41 #define MDOC_Bd 9 42 #define MDOC_Ed 10 43 #define MDOC_Bl 11 44 #define MDOC_El 12 45 #define MDOC_It 13 46 #define MDOC_Ad 14 47 #define MDOC_An 15 48 #define MDOC_Ar 16 49 #define MDOC_Cd 17 50 #define MDOC_Cm 18 51 #define MDOC_Dv 19 52 #define MDOC_Er 20 53 #define MDOC_Ev 21 54 #define MDOC_Ex 22 55 #define MDOC_Fa 23 56 #define MDOC_Fd 24 57 #define MDOC_Fl 25 58 #define MDOC_Fn 26 59 #define MDOC_Ft 27 60 #define MDOC_Ic 28 61 #define MDOC_In 29 62 #define MDOC_Li 30 63 #define MDOC_Nd 31 64 #define MDOC_Nm 32 65 #define MDOC_Op 33 66 #define MDOC_Ot 34 67 #define MDOC_Pa 35 68 #define MDOC_Rv 36 69 #define MDOC_St 37 70 #define MDOC_Va 38 71 #define MDOC_Vt 39 72 #define MDOC_Xr 40 73 #define MDOC__A 41 74 #define MDOC__B 42 75 #define MDOC__D 43 76 #define MDOC__I 44 77 #define MDOC__J 45 78 #define MDOC__N 46 79 #define MDOC__O 47 80 #define MDOC__P 48 81 #define MDOC__R 49 82 #define MDOC__T 50 83 #define MDOC__V 51 84 #define MDOC_Ac 52 85 #define MDOC_Ao 53 86 #define MDOC_Aq 54 87 #define MDOC_At 55 88 #define MDOC_Bc 56 89 #define MDOC_Bf 57 90 #define MDOC_Bo 58 91 #define MDOC_Bq 59 92 #define MDOC_Bsx 60 93 #define MDOC_Bx 61 94 #define MDOC_Db 62 95 #define MDOC_Dc 63 96 #define MDOC_Do 64 97 #define MDOC_Dq 65 98 #define MDOC_Ec 66 99 #define MDOC_Ef 67 100 #define MDOC_Em 68 101 #define MDOC_Eo 69 102 #define MDOC_Fx 70 103 #define MDOC_Ms 71 104 #define MDOC_No 72 105 #define MDOC_Ns 73 106 #define MDOC_Nx 74 107 #define MDOC_Ox 75 108 #define MDOC_Pc 76 109 #define MDOC_Pf 77 110 #define MDOC_Po 78 111 #define MDOC_Pq 79 112 #define MDOC_Qc 80 113 #define MDOC_Ql 81 114 #define MDOC_Qo 82 115 #define MDOC_Qq 83 116 #define MDOC_Re 84 117 #define MDOC_Rs 85 118 #define MDOC_Sc 86 119 #define MDOC_So 87 120 #define MDOC_Sq 88 121 #define MDOC_Sm 89 122 #define MDOC_Sx 90 123 #define MDOC_Sy 91 124 #define MDOC_Tn 92 125 #define MDOC_Ux 93 126 #define MDOC_Xc 94 127 #define MDOC_Xo 95 128 #define MDOC_Fo 96 129 #define MDOC_Fc 97 130 #define MDOC_Oo 98 131 #define MDOC_Oc 99 132 #define MDOC_Bk 100 133 #define MDOC_Ek 101 134 #define MDOC_Bt 102 135 #define MDOC_Hf 103 136 #define MDOC_Fr 104 137 #define MDOC_Ud 105 138 #define MDOC_Lb 106 139 #define MDOC_Lp 107 140 #define MDOC_Lk 108 141 #define MDOC_Mt 109 142 #define MDOC_Brq 110 143 #define MDOC_Bro 111 144 #define MDOC_Brc 112 145 #define MDOC__C 113 146 #define MDOC_Es 114 147 #define MDOC_En 115 148 #define MDOC_Dx 116 149 #define MDOC__Q 117 150 #define MDOC_br 118 151 #define MDOC_sp 119 152 #define MDOC_MAX 120 153 154 /* What follows is a list of ALL possible macro arguments. */ 155 156 #define MDOC_Split 0 157 #define MDOC_Nosplit 1 158 #define MDOC_Ragged 2 159 #define MDOC_Unfilled 3 160 #define MDOC_Literal 4 161 #define MDOC_File 5 162 #define MDOC_Offset 6 163 #define MDOC_Bullet 7 164 #define MDOC_Dash 8 165 #define MDOC_Hyphen 9 166 #define MDOC_Item 10 167 #define MDOC_Enum 11 168 #define MDOC_Tag 12 169 #define MDOC_Diag 13 170 #define MDOC_Hang 14 171 #define MDOC_Ohang 15 172 #define MDOC_Inset 16 173 #define MDOC_Column 17 174 #define MDOC_Width 18 175 #define MDOC_Compact 19 176 #define MDOC_Std 20 177 #define MDOC_Filled 21 178 #define MDOC_Words 22 179 #define MDOC_Emphasis 23 180 #define MDOC_Symbolic 24 181 #define MDOC_Nested 25 182 #define MDOC_ARG_MAX 26 183 184 /* Type of a syntax node. */ 185 enum mdoc_type { 186 MDOC_TEXT, 187 MDOC_ELEM, 188 MDOC_HEAD, 189 MDOC_TAIL, 190 MDOC_BODY, 191 MDOC_BLOCK, 192 MDOC_ROOT 193 }; 194 195 /* Section (named/unnamed) of `Sh'. */ 196 enum mdoc_sec { 197 SEC_NONE, /* No section, yet. */ 198 SEC_NAME, 199 SEC_LIBRARY, 200 SEC_SYNOPSIS, 201 SEC_DESCRIPTION, 202 SEC_IMPLEMENTATION, 203 SEC_EXIT_STATUS, 204 SEC_RETURN_VALUES, 205 SEC_ENVIRONMENT, 206 SEC_FILES, 207 SEC_EXAMPLES, 208 SEC_DIAGNOSTICS, 209 SEC_COMPATIBILITY, 210 SEC_ERRORS, 211 SEC_SEE_ALSO, 212 SEC_STANDARDS, 213 SEC_HISTORY, 214 SEC_AUTHORS, 215 SEC_CAVEATS, 216 SEC_BUGS, 217 SEC_SECURITY, 218 SEC_CUSTOM /* User-defined. */ 219 }; 220 221 /* Information from prologue. */ 222 struct mdoc_meta { 223 int msec; 224 char *vol; 225 char *arch; 226 time_t date; 227 char *title; 228 char *os; 229 char *name; 230 }; 231 232 /* An argument to a macro (multiple values = `It -column'). */ 233 struct mdoc_argv { 234 int arg; 235 int line; 236 int pos; 237 size_t sz; 238 char **value; 239 }; 240 241 struct mdoc_arg { 242 size_t argc; 243 struct mdoc_argv *argv; 244 unsigned int refcnt; 245 }; 246 247 /* Node in AST. */ 248 struct mdoc_node { 249 struct mdoc_node *parent; 250 struct mdoc_node *child; 251 struct mdoc_node *next; 252 struct mdoc_node *prev; 253 int nchild; 254 int line; 255 int pos; 256 int tok; 257 int flags; 258 #define MDOC_VALID (1 << 0) 259 #define MDOC_ACTED (1 << 1) 260 enum mdoc_type type; 261 enum mdoc_sec sec; 262 263 struct mdoc_arg *args; /* BLOCK/ELEM */ 264 struct mdoc_node *head; /* BLOCK */ 265 struct mdoc_node *body; /* BLOCK */ 266 struct mdoc_node *tail; /* BLOCK */ 267 char *string; /* TEXT */ 268 }; 269 270 #define MDOC_IGN_SCOPE (1 << 0) /* Ignore scope violations. */ 271 #define MDOC_IGN_ESCAPE (1 << 1) /* Ignore bad escape sequences. */ 272 #define MDOC_IGN_MACRO (1 << 2) /* Ignore unknown macros. */ 273 #define MDOC_IGN_CHARS (1 << 3) /* Ignore disallowed chars. */ 274 275 /* Call-backs for parse messages. */ 276 277 struct mdoc_cb { 278 int (*mdoc_err)(void *, int, int, const char *); 279 int (*mdoc_warn)(void *, int, int, const char *); 280 }; 281 282 /* See mdoc.3 for documentation. */ 283 284 extern const char *const *mdoc_macronames; 285 extern const char *const *mdoc_argnames; 286 287 __BEGIN_DECLS 288 289 struct mdoc; 290 291 /* See mdoc.3 for documentation. */ 292 293 void mdoc_free(struct mdoc *); 294 struct mdoc *mdoc_alloc(void *, int, const struct mdoc_cb *); 295 int mdoc_reset(struct mdoc *); 296 int mdoc_parseln(struct mdoc *, int, char *buf); 297 const struct mdoc_node *mdoc_node(const struct mdoc *); 298 const struct mdoc_meta *mdoc_meta(const struct mdoc *); 299 int mdoc_endparse(struct mdoc *); 300 301 __END_DECLS 302 303 #endif /*!MDOC_H*/ 304