diff options
author | Kristaps Dzonsons <kristaps@bsd.lv> | 2010-07-21 20:35:03 +0000 |
---|---|---|
committer | Kristaps Dzonsons <kristaps@bsd.lv> | 2010-07-21 20:35:03 +0000 |
commit | 83b4f157d4daded80000e151a11815be7bc92575 (patch) | |
tree | cfdf435a5578191efb49da30ccc56ef93351f543 /html.c | |
parent | 28eeb27f1cb4b3c30ede14a1e367fa86624a8420 (diff) | |
download | mandoc-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.c | 12 |
1 files changed, 9 insertions, 3 deletions
@@ -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 */ |