-/* $Id: action.c,v 1.13 2009/01/20 12:51:28 kristaps Exp $ */
+/* $Id: action.c,v 1.19 2009/02/22 14:31:08 kristaps Exp $ */
/*
* Copyright (c) 2008 Kristaps Dzonsons <kristaps@kth.se>
*
#include "private.h"
+/*
+ * Actions are executed on macros after they've been post-validated: in
+ * other words, a macro will not be "acted upon" until all of its
+ * children have been filled in (post-fix order).
+ */
struct actions {
int (*post)(struct mdoc *);
};
+/*
+ * The `Nm' macro sets the document's name when used the first time with
+ * an argument. Subsequent calls without a value will result in the
+ * name value being used.
+ */
static int
post_nm(struct mdoc *mdoc)
{
}
+/*
+ * We keep track of the current section in order to provide warnings on
+ * section ordering, per-section macros, and so on.
+ */
static int
post_sh(struct mdoc *mdoc)
{
return(1);
if (xstrlcats(buf, mdoc->last->child, 64)) {
if (SEC_CUSTOM != (sec = mdoc_atosec(buf)))
- mdoc->sec_lastn = sec;
- mdoc->sec_last = sec;
+ mdoc->lastnamed = sec;
+ mdoc->lastsec = sec;
return(1);
}
}
+/*
+ * Prologue title must be parsed into document meta-data.
+ */
static int
post_dt(struct mdoc *mdoc)
{
assert(NULL == mdoc->meta.title);
+ /* LINTED */
for (i = 0, n = mdoc->last->child; n; n = n->next, i++) {
assert(MDOC_TEXT == n->type);
p = n->data.text.string;
}
if (NULL == mdoc->meta.title)
- mdoc->meta.title = xstrdup("untitled");
+ mdoc->meta.title = xstrdup("UNTITLED");
+
+ mdoc_msg(mdoc, "title: %s", mdoc->meta.title);
return(post_prologue(mdoc));
}
+/*
+ * Prologue operating system must be parsed into document meta-data.
+ */
static int
post_os(struct mdoc *mdoc)
{
return(mdoc_err(mdoc, "macro parameters too long"));
mdoc->meta.os = xstrdup(buf[0] ? buf : "local");
- mdoc->sec_lastn = mdoc->sec_last = SEC_BODY;
- mdoc->flags |= MDOC_BODYPARSE;
+ mdoc->lastnamed = SEC_BODY;
return(post_prologue(mdoc));
}
+/*
+ * Prologue date must be parsed into document meta-data.
+ */
static int
post_dd(struct mdoc *mdoc)
{
- char date[64];
- size_t sz;
- char *p;
- struct mdoc_node *n;
+ char buf[64];
assert(MDOC_ELEM == mdoc->last->type);
assert(MDOC_Dd == mdoc->last->tok);
- n = mdoc->last->child;
assert(0 == mdoc->meta.date);
- date[0] = 0;
- sz = 64;
-
- for ( ; 0 == mdoc->meta.date && n; n = n->next) {
- assert(MDOC_TEXT == n->type);
- p = n->data.text.string;
+ if ( ! xstrlcats(buf, mdoc->last->child, 64))
+ return(mdoc_err(mdoc, "macro parameters too long"));
+ if (0 == (mdoc->meta.date = mdoc_atotime(buf)))
+ return(mdoc_err(mdoc, "invalid parameter syntax"));
- if (xstrcmp(p, "$Mdocdate: January 20 2009 $")) {
- mdoc->meta.date = time(NULL);
- continue;
- } else if (xstrcmp(p, "$")) {
- mdoc->meta.date = mdoc_atotime(date);
- continue;
- } else if (xstrcmp(p, "$Mdocdate:"))
- continue;
+ mdoc_msg(mdoc, "date: %u", mdoc->meta.date);
- if ( ! xstrlcat(date, n->data.text.string, sz))
- return(mdoc_nerr(mdoc, n, "invalid parameter syntax"));
- if (n->next && ! xstrlcat(date, " ", sz))
- return(mdoc_nerr(mdoc, n, "invalid parameter syntax"));
- }
-
- if (mdoc->meta.date && NULL == n)
- return(post_prologue(mdoc));
- else if (n)
- return(mdoc_err(mdoc, "invalid parameter syntax"));
- if ((mdoc->meta.date = mdoc_atotime(date)))
- return(post_prologue(mdoc));
- return(mdoc_err(mdoc, "invalid parameter syntax"));
+ return(post_prologue(mdoc));
}
+/*
+ * The end document shouldn't have the prologue macros as part of the
+ * syntax tree (they encompass only meta-data).
+ */
static int
post_prologue(struct mdoc *mdoc)
{