summaryrefslogtreecommitdiffstats
path: root/html.c
diff options
context:
space:
mode:
authorKristaps Dzonsons <kristaps@bsd.lv>2010-07-21 20:35:03 +0000
committerKristaps Dzonsons <kristaps@bsd.lv>2010-07-21 20:35:03 +0000
commit83b4f157d4daded80000e151a11815be7bc92575 (patch)
treecfdf435a5578191efb49da30ccc56ef93351f543 /html.c
parent28eeb27f1cb4b3c30ede14a1e367fa86624a8420 (diff)
downloadmandoc-83b4f157d4daded80000e151a11815be7bc92575.tar.gz
Accomodate for groff's crappy behaviour wherein an unrecognised
single-character escape (and ONLY this type of escape) will map back into itself: "If a backslash is followed by a character that does not constitute a defined escape sequence the backslash is silently ignored and the character maps to itself." (From groff.7.) Found by Jason McIntyre.
Diffstat (limited to 'html.c')
-rw-r--r--html.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/html.c b/html.c
index 13b9f516..6c0668d1 100644
--- a/html.c
+++ b/html.c
@@ -88,7 +88,8 @@ static const char *const htmlattrs[ATTR_MAX] = {
"summary",
};
-static void print_spec(struct html *, const char *, size_t);
+static void print_spec(struct html *, enum roffdeco,
+ const char *, size_t);
static void print_res(struct html *, const char *, size_t);
static void print_ctag(struct html *, enum htmltag);
static void print_doctype(struct html *);
@@ -215,7 +216,7 @@ print_gen_head(struct html *h)
static void
-print_spec(struct html *h, const char *p, size_t len)
+print_spec(struct html *h, enum roffdeco d, const char *p, size_t len)
{
int cp;
const char *rhs;
@@ -224,6 +225,9 @@ print_spec(struct html *h, const char *p, size_t len)
if ((cp = chars_spec2cp(h->symtab, p, len)) > 0) {
printf("&#%d;", cp);
return;
+ } else if (-1 == cp && DECO_SSPECIAL == d) {
+ fwrite(p, 1, len, stdout);
+ return;
} else if (-1 == cp)
return;
@@ -342,8 +346,10 @@ print_encode(struct html *h, const char *p, int norecurse)
case (DECO_RESERVED):
print_res(h, seq, sz);
break;
+ case (DECO_SSPECIAL):
+ /* FALLTHROUGH */
case (DECO_SPECIAL):
- print_spec(h, seq, sz);
+ print_spec(h, deco, seq, sz);
break;
case (DECO_PREVIOUS):
/* FALLTHROUGH */