=================================================================== RCS file: /cvs/mandoc/roff.c,v retrieving revision 1.282 retrieving revision 1.288 diff -u -p -r1.282 -r1.288 --- mandoc/roff.c 2015/10/21 23:51:11 1.282 +++ mandoc/roff.c 2017/01/12 18:02:20 1.288 @@ -1,7 +1,7 @@ -/* $Id: roff.c,v 1.282 2015/10/21 23:51:11 schwarze Exp $ */ +/* $Id: roff.c,v 1.288 2017/01/12 18:02:20 schwarze Exp $ */ /* * Copyright (c) 2008-2012, 2014 Kristaps Dzonsons - * Copyright (c) 2010-2015 Ingo Schwarze + * Copyright (c) 2010-2015, 2017 Ingo Schwarze * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -991,11 +991,11 @@ roff_node_alloc(struct roff_man *man, int line, int po n->sec = man->lastsec; if (man->flags & MDOC_SYNOPSIS) - n->flags |= MDOC_SYNPRETTY; + n->flags |= NODE_SYNPRETTY; else - n->flags &= ~MDOC_SYNPRETTY; + n->flags &= ~NODE_SYNPRETTY; if (man->flags & MDOC_NEWLINE) - n->flags |= MDOC_LINE; + n->flags |= NODE_LINE; man->flags &= ~MDOC_NEWLINE; return n; @@ -1017,14 +1017,17 @@ roff_node_append(struct roff_man *man, struct roff_nod n->parent = man->last->parent; break; case ROFF_NEXT_CHILD: + if (man->last->child != NULL) { + n->next = man->last->child; + man->last->child->prev = n; + } else + man->last->last = n; man->last->child = n; n->parent = man->last; - n->parent->last = n; break; default: abort(); } - n->parent->nchild++; man->last = n; switch (n->type) { @@ -1060,10 +1063,7 @@ roff_word_alloc(struct roff_man *man, int line, int po n = roff_node_alloc(man, line, pos, ROFFT_TEXT, TOKEN_NONE); n->string = roff_strdup(man->roff, word); roff_node_append(man, n); - if (man->macroset == MACROSET_MDOC) - n->flags |= MDOC_VALID | MDOC_ENDED; - else - man_valid_post(man); + n->flags |= NODE_VALID | NODE_ENDED; man->next = ROFF_NEXT_SIBLING; } @@ -1133,7 +1133,7 @@ roff_addeqn(struct roff_man *man, const struct eqn *eq n = roff_node_alloc(man, eqn->ln, eqn->pos, ROFFT_EQN, TOKEN_NONE); n->eqn = eqn; if (eqn->ln > man->last->line) - n->flags |= MDOC_LINE; + n->flags |= NODE_LINE; roff_node_append(man, n); man->next = ROFF_NEXT_SIBLING; } @@ -1148,10 +1148,7 @@ roff_addtbl(struct roff_man *man, const struct tbl_spa n = roff_node_alloc(man, tbl->line, 0, ROFFT_TBL, TOKEN_NONE); n->span = tbl; roff_node_append(man, n); - if (man->macroset == MACROSET_MDOC) - n->flags |= MDOC_VALID | MDOC_ENDED; - else - man_valid_post(man); + n->flags |= NODE_VALID | NODE_ENDED; man->next = ROFF_NEXT_SIBLING; } @@ -1169,7 +1166,6 @@ roff_node_unlink(struct roff_man *man, struct roff_nod /* Adjust parent. */ if (n->parent != NULL) { - n->parent->nchild--; if (n->parent->child == n) n->parent->child = n->next; if (n->parent->last == n) @@ -1211,7 +1207,6 @@ roff_node_delete(struct roff_man *man, struct roff_nod while (n->child != NULL) roff_node_delete(man, n->child); - assert(n->nchild == 0); roff_node_unlink(man, n); roff_node_free(n); } @@ -1228,16 +1223,12 @@ deroff(char **dest, const struct roff_node *n) return; } - /* Skip leading whitespace and escape sequences. */ + /* Skip leading whitespace. */ - cp = n->string; - while (*cp != '\0') { - if ('\\' == *cp) { + for (cp = n->string; *cp != '\0'; cp++) { + if (cp[0] == '\\' && strchr(" %&0^|~", cp[1]) != NULL) cp++; - mandoc_escape((const char **)&cp, NULL, NULL); - } else if (isspace((unsigned char)*cp)) - cp++; - else + else if ( ! isspace((unsigned char)*cp)) break; }