-/* $Id: roff.c,v 1.278 2015/10/12 00:08:16 schwarze Exp $ */
+/* $Id: roff.c,v 1.284 2016/01/08 17:48:10 schwarze Exp $ */
/*
* Copyright (c) 2008-2012, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2010-2015 Ingo Schwarze <schwarze@openbsd.org>
#include "roff_int.h"
#include "libroff.h"
-/* Maximum number of nested if-else conditionals. */
-#define RSTACK_MAX 128
-
/* Maximum number of string expansions per line, to break infinite loops. */
#define EXPAND_LIMIT 1000
struct roff {
struct mparse *parse; /* parse point */
- const struct mchars *mchars; /* character table */
struct roffnode *last; /* leaf of stack */
int *rstack; /* stack of inverted `ie' values */
struct roffreg *regtab; /* number registers */
}
struct roff *
-roff_alloc(struct mparse *parse, const struct mchars *mchars, int options)
+roff_alloc(struct mparse *parse, int options)
{
struct roff *r;
r = mandoc_calloc(1, sizeof(struct roff));
r->parse = parse;
- r->mchars = mchars;
r->options = options;
r->format = options & (MPARSE_MDOC | MPARSE_MAN);
r->rstackpos = -1;
switch (man->next) {
case ROFF_NEXT_SIBLING:
+ if (man->last->next != NULL) {
+ n->next = man->last->next;
+ man->last->next->prev = n;
+ } else
+ man->last->parent->last = n;
man->last->next = n;
n->prev = man->last;
n->parent = man->last->parent;
case ROFF_NEXT_CHILD:
man->last->child = n;
n->parent = man->last;
+ n->parent->last = n;
break;
default:
abort();
}
- n->parent->nchild++;
- n->parent->last = n;
-
- /*
- * Copy over the normalised-data pointer of our parent. Not
- * everybody has one, but copying a null pointer is fine.
- */
-
- switch (n->type) {
- case ROFFT_BODY:
- if (n->end != ENDBODY_NOT)
- break;
- /* FALLTHROUGH */
- case ROFFT_TAIL:
- case ROFFT_HEAD:
- n->norm = n->parent->norm;
- break;
- default:
- break;
- }
-
- if (man->macroset == MACROSET_MDOC)
- mdoc_valid_pre(man, n);
+ man->last = n;
switch (n->type) {
case ROFFT_HEAD:
- assert(n->parent->type == ROFFT_BLOCK);
n->parent->head = n;
break;
case ROFFT_BODY:
- if (n->end)
- break;
- assert(n->parent->type == ROFFT_BLOCK);
+ if (n->end != ENDBODY_NOT)
+ return;
n->parent->body = n;
break;
case ROFFT_TAIL:
- assert(n->parent->type == ROFFT_BLOCK);
n->parent->tail = n;
break;
default:
- break;
+ return;
}
- man->last = n;
+
+ /*
+ * Copy over the normalised-data pointer of our parent. Not
+ * everybody has one, but copying a null pointer is fine.
+ */
+
+ n->norm = n->parent->norm;
+ assert(n->parent->type == ROFFT_BLOCK);
}
void
n->string = roff_strdup(man->roff, word);
roff_node_append(man, n);
if (man->macroset == MACROSET_MDOC)
- mdoc_valid_post(man);
+ n->flags |= MDOC_VALID | MDOC_ENDED;
else
- man_valid_post(man);
+ n->flags |= MAN_VALID;
man->next = ROFF_NEXT_SIBLING;
}
n->span = tbl;
roff_node_append(man, n);
if (man->macroset == MACROSET_MDOC)
- mdoc_valid_post(man);
+ n->flags |= MDOC_VALID | MDOC_ENDED;
else
- man_valid_post(man);
+ n->flags |= MAN_VALID;
man->next = ROFF_NEXT_SIBLING;
}
/* Adjust parent. */
if (n->parent != NULL) {
- n->parent->nchild--;
if (n->parent->child == n)
n->parent->child = n->next;
if (n->parent->last == n)
while (n->child != NULL)
roff_node_delete(man, n->child);
- assert(n->nchild == 0);
roff_node_unlink(man, n);
roff_node_free(n);
}
esc = mandoc_escape(&cp, &stnam, &inaml);
if (esc == ESCAPE_ERROR ||
(esc == ESCAPE_SPECIAL &&
- mchars_spec2cp(r->mchars, stnam, inaml) < 0))
+ mchars_spec2cp(stnam, inaml) < 0))
mandoc_vmsg(MANDOCERR_ESC_BAD,
r->parse, ln, (int)(stesc - buf->buf),
"%.*s", (int)(cp - stesc), stesc);