1 /* $Id: mdoc.h,v 1.114 2011/01/01 12:18:37 kristaps Exp $ */
3 * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
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.
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.
21 * What follows is a list of ALL possible macros.
150 * What follows is a list of ALL possible macro arguments.
184 * Type of a syntax node.
198 * Section (named/unnamed) of `Sh'. Note that these appear in the
199 * conventional order imposed by mdoc.7.
202 SEC_NONE = 0, /* No section, yet. */
223 SEC_CUSTOM, /* User-defined. */
228 * Information from prologue.
231 char *msec; /* `Dt' section (1, 3p, etc.) */
232 char *vol; /* `Dt' volume (implied) */
233 char *arch; /* `Dt' arch (i386, etc.) */
234 time_t date; /* `Dd' normalised date */
235 char *title; /* `Dt' title (FOO, etc.) */
236 char *os; /* `Os' system (OpenBSD, etc.) */
237 char *name; /* leading `Nm' name */
241 * An argument to a macro (multiple values = `-column xxx yyy').
244 enum mdocargt arg; /* type of argument */
247 size_t sz; /* elements in "value" */
248 char **value; /* argument strings */
252 * Reference-counted macro arguments. These are refcounted because
253 * blocks have multiple instances of the same arguments spread across
254 * the HEAD, BODY, TAIL, and BLOCK node types.
258 struct mdoc_argv *argv;
263 * Indicates that a BODY's formatting has ended, but the scope is still
264 * open. Used for syntax-broken blocks.
268 ENDBODY_SPACE, /* is broken: append a space */
269 ENDBODY_NOSPACE /* is broken: don't append a space */
273 * Normalised `Bl' list type.
292 * Normalised `Bd' display type.
304 * Normalised `An' splitting argument.
313 * Normalised `Bf' font type.
323 * Normalised arguments for `Bd'.
326 const char *offs; /* -offset */
327 enum mdoc_disp type; /* -ragged, etc. */
328 int comp; /* -compact */
332 * Normalised arguments for `Bl'.
335 const char *width; /* -width */
336 const char *offs; /* -offset */
337 enum mdoc_list type; /* -tag, -enum, etc. */
338 int comp; /* -compact */
339 size_t ncols; /* -column arg count */
340 const char **cols; /* -column val ptr */
344 * Normalised arguments for `Bf'.
347 enum mdoc_font font; /* font */
351 * Normalised arguments for `An'.
354 enum mdoc_auth auth; /* -split, etc. */
358 struct mdoc_node *child_J; /* pointer to %J */
362 * Consists of normalised node arguments. These should be used instead
363 * of iterating through the mdoc_arg pointers of a node: defaults are
375 * Single node in tree-linked AST.
378 struct mdoc_node *parent; /* parent AST node */
379 struct mdoc_node *child; /* first child AST node */
380 struct mdoc_node *last; /* last child AST node */
381 struct mdoc_node *next; /* sibling AST node */
382 struct mdoc_node *prev; /* prior sibling AST node */
383 int nchild; /* number children */
384 int line; /* parse line */
385 int pos; /* parse column */
386 enum mdoct tok; /* tok or MDOC__MAX if none */
388 #define MDOC_VALID (1 << 0) /* has been validated */
389 #define MDOC_EOS (1 << 2) /* at sentence boundary */
390 #define MDOC_LINE (1 << 3) /* first macro/text on line */
391 #define MDOC_SYNPRETTY (1 << 4) /* SYNOPSIS-style formatting */
392 #define MDOC_ENDED (1 << 5) /* rendering has been ended */
393 enum mdoc_type type; /* AST node type */
394 enum mdoc_sec sec; /* current named section */
395 union mdoc_data *norm; /* normalised args */
396 /* FIXME: these can be union'd to shave a few bytes. */
397 struct mdoc_arg *args; /* BLOCK/ELEM */
398 struct mdoc_node *pending; /* BLOCK */
399 struct mdoc_node *head; /* BLOCK */
400 struct mdoc_node *body; /* BLOCK */
401 struct mdoc_node *tail; /* BLOCK */
402 char *string; /* TEXT */
403 const struct tbl_span *span; /* TBL */
404 enum mdoc_endbody end; /* BODY */
408 * Names of macros. Index is enum mdoct. Indexing into this returns
409 * the normalised name, e.g., mdoc_macronames[MDOC_Sh] -> "Sh".
411 extern const char *const *mdoc_macronames;
414 * Names of macro args. Index is enum mdocargt. Indexing into this
415 * returns the normalised name, e.g., mdoc_argnames[MDOC_File] ->
418 extern const char *const *mdoc_argnames;
424 void mdoc_free(struct mdoc *);
425 struct mdoc *mdoc_alloc(struct regset *, void *, mandocmsg);
426 void mdoc_reset(struct mdoc *);
427 int mdoc_parseln(struct mdoc *, int, char *, int);
428 const struct mdoc_node *mdoc_node(const struct mdoc *);
429 const struct mdoc_meta *mdoc_meta(const struct mdoc *);
430 int mdoc_endparse(struct mdoc *);
431 int mdoc_addspan(struct mdoc *,
432 const struct tbl_span *);