diff options
author | Kristaps Dzonsons <kristaps@bsd.lv> | 2010-08-24 12:48:43 +0000 |
---|---|---|
committer | Kristaps Dzonsons <kristaps@bsd.lv> | 2010-08-24 12:48:43 +0000 |
commit | 66d75094ce5444c76b0a0e54353e0043d11e8e04 (patch) | |
tree | 61c59087a6773c7b13c3abb2b883e795132e6b7d | |
parent | 365ec00baacbf68996ec61890a67247e7e2c661e (diff) | |
download | mandoc-66d75094ce5444c76b0a0e54353e0043d11e8e04.tar.gz |
Have the `ds' processor strip out `\\' as stipulated in groff.7. I only
care because pod2man uses this construct.
-rw-r--r-- | roff.c | 27 |
1 files changed, 25 insertions, 2 deletions
@@ -136,6 +136,7 @@ static int roff_res(struct roff *, char **, size_t *, int); static void roff_setstr(struct roff *, const char *, const char *); +static char *roff_strdup(const char *); /* See roff_hash_find() */ @@ -1035,6 +1036,27 @@ roff_nr(ROFF_ARGS) } +static char * +roff_strdup(const char *name) +{ + char *namecopy, *sv; + + /* + * This isn't a nice simple mandoc_strdup() because we must + * handle roff's stupid double-escape rule. + */ + sv = namecopy = mandoc_malloc(strlen(name) + 1); + while (*name) { + if ('\\' == *name && '\\' == *(name + 1)) + name++; + *namecopy++ = *name++; + } + + *namecopy = '\0'; + return(sv); +} + + static void roff_setstr(struct roff *r, const char *name, const char *string) { @@ -1054,8 +1076,9 @@ roff_setstr(struct roff *r, const char *name, const char *string) } else free(n->string); - ROFF_DEBUG("roff: new symbol: [%s] = [%s]\n", name, string); - n->string = string ? strdup(string) : NULL; + /* Don't use mandoc_strdup: clean out double-escapes. */ + n->string = string ? roff_strdup(string) : NULL; + ROFF_DEBUG("roff: new symbol: [%s] = [%s]\n", name, n->string); } |