diff options
author | Ingo Schwarze <schwarze@openbsd.org> | 2018-04-11 17:11:13 +0000 |
---|---|---|
committer | Ingo Schwarze <schwarze@openbsd.org> | 2018-04-11 17:11:13 +0000 |
commit | 0fde2fa390d9a4194f8a09e5c0f5d921d8755109 (patch) | |
tree | 08324b073d43d72772f99a603423e81140da0263 /roff.c | |
parent | aa23a004eb502cf67af388be4976d369784961db (diff) | |
download | mandoc-0fde2fa390d9a4194f8a09e5c0f5d921d8755109.tar.gz mandoc-0fde2fa390d9a4194f8a09e5c0f5d921d8755109.tar.zst mandoc-0fde2fa390d9a4194f8a09e5c0f5d921d8755109.zip |
preserve comments before .Dd when converting mdoc(7) to man(7)
with mandoc -Tman; suggested by Thomas Klausner <wiz at NetBSD>
Diffstat (limited to 'roff.c')
-rw-r--r-- | roff.c | 37 |
1 files changed, 30 insertions, 7 deletions
@@ -1,4 +1,4 @@ -/* $Id: roff.c,v 1.327 2018/04/10 00:52:30 schwarze Exp $ */ +/* $Id: roff.c,v 1.328 2018/04/11 17:11:13 schwarze Exp $ */ /* * Copyright (c) 2008-2012, 2014 Kristaps Dzonsons <kristaps@bsd.lv> * Copyright (c) 2010-2015, 2017, 2018 Ingo Schwarze <schwarze@openbsd.org> @@ -762,7 +762,7 @@ roff_alloc(struct mparse *parse, int options) r = mandoc_calloc(1, sizeof(struct roff)); r->parse = parse; - r->reqtab = roffhash_alloc(0, ROFF_USERDEF); + r->reqtab = roffhash_alloc(0, ROFF_RENAMED); r->options = options; r->format = options & (MPARSE_MDOC | MPARSE_MAN); r->rstackpos = -1; @@ -1122,8 +1122,10 @@ static enum rofferr roff_res(struct roff *r, struct buf *buf, int ln, int pos) { char ubuf[24]; /* buffer to print the number */ + struct roff_node *n; /* used for header comments */ const char *start; /* start of the string to process */ char *stesc; /* start of an escape sequence ('\\') */ + char *ep; /* end of comment string */ const char *stnam; /* start of the name, after "[(*" */ const char *cp; /* end of the name, e.g. before ']' */ const char *res; /* the string to be substituted */ @@ -1173,14 +1175,35 @@ roff_res(struct roff *r, struct buf *buf, int ln, int pos) /* Handle trailing whitespace. */ - cp = strchr(stesc--, '\0') - 1; - if (*cp == '\n') { + ep = strchr(stesc--, '\0') - 1; + if (*ep == '\n') { done = 1; - cp--; + ep--; } - if (*cp == ' ' || *cp == '\t') + if (*ep == ' ' || *ep == '\t') mandoc_msg(MANDOCERR_SPACE_EOL, r->parse, - ln, cp - buf->buf, NULL); + ln, ep - buf->buf, NULL); + + /* + * Save comments preceding the title macro + * in the syntax tree. + */ + + if (r->format == 0) { + while (*ep == ' ' || *ep == '\t') + ep--; + ep[1] = '\0'; + n = roff_node_alloc(r->man, + ln, stesc + 1 - buf->buf, + ROFFT_COMMENT, TOKEN_NONE); + n->string = mandoc_strdup(stesc + 2); + roff_node_append(r->man, n); + n->flags |= NODE_VALID | NODE_ENDED; + r->man->next = ROFF_NEXT_SIBLING; + } + + /* Discard comments. */ + while (stesc > start && stesc[-1] == ' ') stesc--; *stesc = '\0'; |