=================================================================== RCS file: /cvs/mandoc/mdoc.h,v retrieving revision 1.25 retrieving revision 1.36 diff -u -p -r1.25 -r1.36 --- mandoc/mdoc.h 2009/01/17 16:15:27 1.25 +++ mandoc/mdoc.h 2009/03/02 12:09:32 1.36 @@ -1,4 +1,4 @@ -/* $Id: mdoc.h,v 1.25 2009/01/17 16:15:27 kristaps Exp $ */ +/* $Id: mdoc.h,v 1.36 2009/03/02 12:09:32 kristaps Exp $ */ /* * Copyright (c) 2008 Kristaps Dzonsons * @@ -19,6 +19,14 @@ #ifndef MDOC_H #define MDOC_H +/* + * This library implements a validating scanner/parser for ``mdoc'' roff + * macro documents, a.k.a. BSD manual page documents. The mdoc.c file + * drives the parser, while macro.c describes the macro ontologies. + * validate.c pre- and post-validates parsed macros, and action.c + * performs actions on parsed and validated macros. + */ + /* What follows is a list of ALL possible macros. */ #define MDOC___ 0 @@ -195,9 +203,10 @@ #define MDOC_Symbolic 61 #define MDOC_ARG_MAX 62 +/* Warnings are either syntax or groff-compatibility. */ enum mdoc_warn { - WARN_SYNTAX, /* Syntax warn (at line/col). */ - WARN_COMPAT /* Groff compat warn (at line/col). */ + WARN_SYNTAX, + WARN_COMPAT }; /* Possible values for the `At' macro. */ @@ -211,6 +220,7 @@ enum mdoc_att { ATT_v6, ATT_v7, ATT_32v, + ATT_V, ATT_V1, ATT_V2, ATT_V3, @@ -226,19 +236,6 @@ struct mdoc_arg { char **value; }; -/* - * Simplified grammar of syntax tree: - * - * MDOC_ROOT: root of tree - * MDOC_TEXT: free-form text - * MDOC_ELEM: elem [args] MDOC_TEXT... - * MDOC_BLOCK, MDOC_HEAD, MDOC_BODY, MDOC_TAIL: - * MDOC_BLOCK: - * MDOC_HEAD [args] (MDOC_TEXT|MDOC_ELEM|MDOC_BLOCK)... - * MDOC_BODY (MDOC_TEXT|MDOC_ELEM|MDOC_BLOCK)... - * MDOC_TAIL (optional) (MDOC_TEXT|MDOC_ELEM|MDOC_BLOCK)... - */ - /* Type of a syntax node. */ enum mdoc_type { MDOC_TEXT, @@ -340,7 +337,7 @@ enum mdoc_arch { ARCH_zaurus }; -/* Meta-information from prologue. */ +/* Information from prologue. */ struct mdoc_meta { enum mdoc_msec msec; enum mdoc_vol vol; @@ -351,10 +348,12 @@ struct mdoc_meta { char *name; }; +/* Text-only node. */ struct mdoc_text { char *string; }; +/* Block (scoped) node. */ struct mdoc_block { size_t argc; struct mdoc_arg *argv; @@ -363,20 +362,20 @@ struct mdoc_block { struct mdoc_node *tail; }; +/* In-line element node. */ struct mdoc_elem { - size_t sz; - char **args; size_t argc; struct mdoc_arg *argv; }; +/* Typed nodes of an AST node. */ union mdoc_data { struct mdoc_text text; struct mdoc_elem elem; struct mdoc_block block; }; -/* Syntax node in parse tree. */ +/* Node in AST. */ struct mdoc_node { struct mdoc_node *parent; struct mdoc_node *child; @@ -385,8 +384,12 @@ struct mdoc_node { int line; int pos; int tok; + int flags; +#define MDOC_VALID (1 << 0) +#define MDOC_ACTED (1 << 1) enum mdoc_type type; union mdoc_data data; + enum mdoc_sec sec; }; /* Call-backs for parse messages. */ @@ -397,7 +400,10 @@ struct mdoc_cb { enum mdoc_warn, const char *); }; +/* Global table of macro names (`Bd', `Ed', etc.). */ extern const char *const *mdoc_macronames; + +/* Global table of argument names (`column', `tag', etc.). */ extern const char *const *mdoc_argnames; __BEGIN_DECLS @@ -410,14 +416,26 @@ void mdoc_free(struct mdoc *); /* Allocate a new parser instance. */ struct mdoc *mdoc_alloc(void *data, const struct mdoc_cb *); -/* Parse a single line (boolean retval). */ +/* Parse a single line in a stream (boolean retval). */ int mdoc_parseln(struct mdoc *, int, char *buf); -/* Get parse result or NULL. */ -const struct mdoc_node *mdoc_result(struct mdoc *); +/* Get result first node (after mdoc_endparse!). */ +const struct mdoc_node *mdoc_node(const struct mdoc *); +/* Get result meta-information (after mdoc_endparse!). */ +const struct mdoc_meta *mdoc_meta(const struct mdoc *); + /* Signal end of parse sequence (boolean retval). */ int mdoc_endparse(struct mdoc *); + +/* The following are utility functions. */ +const char *mdoc_arch2a(enum mdoc_arch); +const char *mdoc_vol2a(enum mdoc_vol); +const char *mdoc_msec2a(enum mdoc_msec); +const char *mdoc_att2a(enum mdoc_att); +enum mdoc_att mdoc_atoatt(const char *); +const char *mdoc_st2a(int); +int mdoc_isdelim(const char *); __END_DECLS