aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/mdoc.c
diff options
context:
space:
mode:
authorKristaps Dzonsons <kristaps@bsd.lv>2009-03-20 15:14:01 +0000
committerKristaps Dzonsons <kristaps@bsd.lv>2009-03-20 15:14:01 +0000
commitc77635473d2482e2462a6d24ba39e43e5ea6ed64 (patch)
tree27fdbb70907287167ccf1c7366ff0a668e882c8d /mdoc.c
parentb4ee9d6b1b8964750454bb66e67aa323b06752a9 (diff)
downloadmandoc-c77635473d2482e2462a6d24ba39e43e5ea6ed64.tar.gz
mandoc-c77635473d2482e2462a6d24ba39e43e5ea6ed64.tar.zst
mandoc-c77635473d2482e2462a6d24ba39e43e5ea6ed64.zip
Support for `Bd' of all types (see mdoc.7 for newline/tab rules).VERSION_1_6_2
Renamed term.c and terminal.c functions to be term_. Some bugfixes to lists.
Diffstat (limited to 'mdoc.c')
-rw-r--r--mdoc.c51
1 files changed, 42 insertions, 9 deletions
diff --git a/mdoc.c b/mdoc.c
index 6c74fa93..dc4c39fb 100644
--- a/mdoc.c
+++ b/mdoc.c
@@ -1,4 +1,4 @@
-/* $Id: mdoc.c,v 1.67 2009/03/19 11:49:00 kristaps Exp $ */
+/* $Id: mdoc.c,v 1.68 2009/03/20 15:14:01 kristaps Exp $ */
/*
* Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@openbsd.org>
*
@@ -29,7 +29,7 @@
/*
* Main caller in the libmdoc library. This begins the parsing routine,
* handles allocation of data, and so forth. Most of the "work" is done
- * in macro.c and validate.c.
+ * in macro.c, validate.c and action.c.
*/
static struct mdoc_node *mdoc_node_alloc(const struct mdoc *);
@@ -94,10 +94,17 @@ const char * const *mdoc_macronames = __mdoc_macronames;
const char * const *mdoc_argnames = __mdoc_argnames;
+/*
+ * Get the first (root) node of the parse tree.
+ */
const struct mdoc_node *
mdoc_node(const struct mdoc *mdoc)
{
+ if (MDOC_HALT & mdoc->flags)
+ return(NULL);
+ if (mdoc->first)
+ assert(MDOC_ROOT == mdoc->first->type);
return(mdoc->first);
}
@@ -106,10 +113,16 @@ const struct mdoc_meta *
mdoc_meta(const struct mdoc *mdoc)
{
+ if (MDOC_HALT & mdoc->flags)
+ return(NULL);
return(&mdoc->meta);
}
+/*
+ * Free up all resources contributed by a parse: the node tree, meta-data and
+ * so on. Then reallocate the root node for another parse.
+ */
void
mdoc_reset(struct mdoc *mdoc)
{
@@ -138,14 +151,15 @@ mdoc_reset(struct mdoc *mdoc)
}
+/*
+ * Completely free up all resources.
+ */
void
mdoc_free(struct mdoc *mdoc)
{
if (mdoc->first)
mdoc_node_freelist(mdoc->first);
- if (mdoc->htab)
- mdoc_tokhash_free(mdoc->htab);
if (mdoc->meta.title)
free(mdoc->meta.title);
if (mdoc->meta.os)
@@ -157,6 +171,9 @@ mdoc_free(struct mdoc *mdoc)
if (mdoc->meta.vol)
free(mdoc->meta.vol);
+ if (mdoc->htab)
+ mdoc_tokhash_free(mdoc->htab);
+
free(mdoc);
}
@@ -182,6 +199,10 @@ mdoc_alloc(void *data, int pflags, const struct mdoc_cb *cb)
}
+/*
+ * Climb back up the parse tree, validating open scopes. Mostly calls
+ * through to macro_end in macro.c.
+ */
int
mdoc_endparse(struct mdoc *mdoc)
{
@@ -318,6 +339,8 @@ mdoc_node_append(struct mdoc *mdoc, struct mdoc_node *p)
if ( ! mdoc_valid_pre(mdoc, p))
return(0);
+ if ( ! mdoc_action_pre(mdoc, p))
+ return(0);
switch (p->type) {
case (MDOC_HEAD):
@@ -512,17 +535,21 @@ mdoc_node_freelist(struct mdoc_node *p)
* control character.
*/
static int
-parsetext(struct mdoc *mdoc, int line, char *buf)
+parsetext(struct mdoc *m, int line, char *buf)
{
- if (SEC_PROLOGUE == mdoc->lastnamed)
- return(mdoc_perr(mdoc, line, 0,
+ if (SEC_PROLOGUE == m->lastnamed)
+ return(mdoc_perr(m, line, 0,
"text disallowed in prologue"));
- if ( ! mdoc_word_alloc(mdoc, line, 0, buf))
+ if (0 == buf[0] && ! (MDOC_LITERAL & m->flags))
+ return(mdoc_perr(m, line, 0,
+ "blank lines only in literal context"));
+
+ if ( ! mdoc_word_alloc(m, line, 0, buf))
return(0);
- mdoc->next = MDOC_NEXT_SIBLING;
+ m->next = MDOC_NEXT_SIBLING;
return(1);
}
@@ -601,6 +628,12 @@ parsemacro(struct mdoc *m, int ln, char *buf)
if ( ! mdoc_macro(m, c, ln, 1, &i, buf))
goto err;
+ /*
+ * If we're in literal mode, then add a newline to the end of
+ * macro lines. Our frontends will interpret this correctly
+ * (it's documented in mdoc.3).
+ */
+
return(1);
err: /* Error out. */