-/* $Id: mdoc_action.c,v 1.46 2009/10/29 04:34:38 kristaps Exp $ */
+/* $Id: mdoc_action.c,v 1.54 2010/05/08 07:30:19 kristaps Exp $ */
/*
* Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
*
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
#ifndef OSNAME
#include <sys/utsname.h>
#endif
#include <assert.h>
-#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static int concat(struct mdoc *, char *,
const struct mdoc_node *, size_t);
-static inline int order_rs(int);
-
-#ifdef __linux__
-extern size_t strlcat(char *, const char *, size_t);
-#endif
+static inline int order_rs(enum mdoct);
static int post_ar(POST_ARGS);
static int post_at(POST_ARGS);
#define RSORD_MAX 14
-static const int rsord[RSORD_MAX] = {
+static const enum mdoct rsord[RSORD_MAX] = {
MDOC__A,
MDOC__T,
MDOC__B,
if ( ! concat(m, buf, n->child, BUFSIZ))
return(0);
sec = mdoc_atosec(buf);
- if (SEC_CUSTOM != sec)
+ /*
+ * The first section should always make us move into a non-new
+ * state.
+ */
+ if (SEC_NONE == m->lastnamed || SEC_CUSTOM != sec)
m->lastnamed = sec;
/* Some sections only live in certain manual sections. */
if (cp) {
/* FIXME: where is strtonum!? */
m->meta.vol = mandoc_strdup(cp);
- errno = 0;
lval = strtol(nn->string, &ep, 10);
if (nn->string[0] != '\0' && *ep == '\0')
m->meta.msec = (int)lval;
post_bl_width(POST_ARGS)
{
size_t width;
- int i, tok;
+ int i;
+ enum mdoct tok;
char buf[NUMSIZ];
char *p;
nn->string = NULL;
nnp = nn;
nn = nn->next;
- mdoc_node_free(nnp);
+ mdoc_node_delete(NULL, nnp);
}
n->nchild = 0;
/*
- * Parse the date field in `Dd', primarily through mdoc_atotime().
- * FIXME: push mdoc_atotime() into here.
+ * Parse the date field in `Dd'.
*/
static int
post_dd(POST_ARGS)
if ( ! concat(m, buf, n->child, DATESIZ))
return(0);
- m->meta.date = mdoc_atotime(buf);
+ m->meta.date = mandoc_a2time
+ (MTIME_MDOCDATE | MTIME_CANONICAL, buf);
+
if (0 == m->meta.date) {
if ( ! mdoc_nwarn(m, n, EBADDATE))
return(0);
static int
post_prol(POST_ARGS)
{
- struct mdoc_node *np;
-
- if (n->parent->child == n)
- n->parent->child = n->prev;
- if (n->prev)
- n->prev->next = NULL;
-
- np = n;
- assert(NULL == n->next);
-
- if (n->prev) {
- m->last = n->prev;
- m->next = MDOC_NEXT_SIBLING;
- } else {
- m->last = n->parent;
- m->next = MDOC_NEXT_CHILD;
- }
-
- mdoc_node_freelist(np);
+ mdoc_node_delete(m, n);
if (m->meta.title && m->meta.date && m->meta.os)
m->flags |= MDOC_PBODY;
-
return(1);
}
}
+/* ARGSUSED */
static int
pre_offset(PRE_ARGS)
{
static inline int
-order_rs(int t)
+order_rs(enum mdoct t)
{
int i;
- for (i = 0; i < RSORD_MAX; i++)
+ for (i = 0; i < (int)RSORD_MAX; i++)
if (rsord[i] == t)
return(i);