summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKristaps Dzonsons <kristaps@bsd.lv>2010-08-24 12:48:43 +0000
committerKristaps Dzonsons <kristaps@bsd.lv>2010-08-24 12:48:43 +0000
commit66d75094ce5444c76b0a0e54353e0043d11e8e04 (patch)
tree61c59087a6773c7b13c3abb2b883e795132e6b7d
parent365ec00baacbf68996ec61890a67247e7e2c661e (diff)
downloadmandoc-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.c27
1 files changed, 25 insertions, 2 deletions
diff --git a/roff.c b/roff.c
index f1b8f303..52a0e344 100644
--- a/roff.c
+++ b/roff.c
@@ -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);
}