aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/html.c
diff options
context:
space:
mode:
authorKristaps Dzonsons <kristaps@bsd.lv>2011-04-09 15:29:40 +0000
committerKristaps Dzonsons <kristaps@bsd.lv>2011-04-09 15:29:40 +0000
commitdc6820cf87c36506f7d235493e75c1520231e9d9 (patch)
treee5c60975fd48bf07a47693f981a0ff9991db03b9 /html.c
parent0383763dbd62d52405be4dc65ae9aaff035c8f79 (diff)
downloadmandoc-dc6820cf87c36506f7d235493e75c1520231e9d9.tar.gz
mandoc-dc6820cf87c36506f7d235493e75c1520231e9d9.tar.zst
mandoc-dc6820cf87c36506f7d235493e75c1520231e9d9.zip
Remove a2roffdeco() and mandoc_special() functions and replace them with
a public (mandoc.h) function mandoc_escape(), which merges the functionality of both prior functions. Reason: code duplication. The a2roffdeco() and mandoc_special() functions were pretty much the same thing and both quite complex. This allows one function to receive improvements in (e.g.) subexpression handling and performance, instead of having to replicate functionality. As such, the mandoc_escape() function already handles a superset of the escapes handled in previous versions and has improvements in performance (using strcspn(), for example) and reliable handling of subexpressions. This code Works For Me, but may need work to catch any regressions. Since the benefits are great (leaner code, simpler API), I'd rather have it in-tree than floating as a patch.
Diffstat (limited to 'html.c')
-rw-r--r--html.c89
1 files changed, 42 insertions, 47 deletions
diff --git a/html.c b/html.c
index ab57c374..812a1847 100644
--- a/html.c
+++ b/html.c
@@ -1,4 +1,4 @@
-/* $Id: html.c,v 1.131 2011/03/22 14:05:45 kristaps Exp $ */
+/* $Id: html.c,v 1.132 2011/04/09 15:29:40 kristaps Exp $ */
/*
* Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2011 Ingo Schwarze <schwarze@openbsd.org>
@@ -94,14 +94,13 @@ static const char *const htmlattrs[ATTR_MAX] = {
};
static void print_num(struct html *, const char *, size_t);
-static void print_spec(struct html *, enum roffdeco,
- const char *, size_t);
+static void print_spec(struct html *, 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 *);
static void print_xmltype(struct html *);
static int print_encode(struct html *, const char *, int);
-static void print_metaf(struct html *, enum roffdeco);
+static void print_metaf(struct html *, enum mandoc_esc);
static void print_attr(struct html *,
const char *, const char *);
static void *ml_alloc(char *, enum htmltype);
@@ -221,7 +220,7 @@ print_num(struct html *h, const char *p, size_t len)
}
static void
-print_spec(struct html *h, enum roffdeco d, const char *p, size_t len)
+print_spec(struct html *h, const char *p, size_t len)
{
int cp;
const char *rhs;
@@ -230,7 +229,7 @@ print_spec(struct html *h, enum roffdeco d, 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) {
+ } else if (-1 == cp && 1 == len) {
fwrite(p, 1, len, stdout);
return;
} else if (-1 == cp)
@@ -260,21 +259,21 @@ print_res(struct html *h, const char *p, size_t len)
static void
-print_metaf(struct html *h, enum roffdeco deco)
+print_metaf(struct html *h, enum mandoc_esc deco)
{
enum htmlfont font;
switch (deco) {
- case (DECO_PREVIOUS):
+ case (ESCAPE_FONTPREV):
font = h->metal;
break;
- case (DECO_ITALIC):
+ case (ESCAPE_FONTITALIC):
font = HTMLFONT_ITALIC;
break;
- case (DECO_BOLD):
+ case (ESCAPE_FONTBOLD):
font = HTMLFONT_BOLD;
break;
- case (DECO_ROMAN):
+ case (ESCAPE_FONTROMAN):
font = HTMLFONT_NONE;
break;
default:
@@ -303,73 +302,69 @@ print_encode(struct html *h, const char *p, int norecurse)
size_t sz;
int len, nospace;
const char *seq;
- enum roffdeco deco;
+ enum mandoc_esc esc;
static const char rejs[6] = { '\\', '<', '>', '&', ASCII_HYPH, '\0' };
nospace = 0;
- for (; *p; p++) {
+ while ('\0' != *p) {
sz = strcspn(p, rejs);
fwrite(p, 1, sz, stdout);
- p += /* LINTED */
- sz;
+ p += (int)sz;
- if ('<' == *p) {
+ if ('\0' == *p)
+ break;
+
+ switch (*p++) {
+ case ('<'):
printf("&lt;");
continue;
- } else if ('>' == *p) {
+ case ('>'):
printf("&gt;");
continue;
- } else if ('&' == *p) {
+ case ('&'):
printf("&amp;");
continue;
- } else if (ASCII_HYPH == *p) {
- /*
- * Note: "soft hyphens" aren't graphically
- * displayed when not breaking the text; we want
- * them to be displayed.
- */
- /*printf("&#173;");*/
+ case (ASCII_HYPH):
putchar('-');
continue;
- } else if ('\0' == *p)
+ default:
break;
+ }
- seq = ++p;
- len = a2roffdeco(&deco, &seq, &sz);
+ esc = mandoc_escape(&p, &seq, &len);
+ if (ESCAPE_ERROR == esc)
+ break;
- switch (deco) {
- case (DECO_NUMBERED):
- print_num(h, seq, sz);
+ switch (esc) {
+ case (ESCAPE_NUMBERED):
+ print_num(h, seq, len);
break;
- case (DECO_RESERVED):
- print_res(h, seq, sz);
+ case (ESCAPE_PREDEF):
+ print_res(h, seq, len);
break;
- case (DECO_SSPECIAL):
- /* FALLTHROUGH */
- case (DECO_SPECIAL):
- print_spec(h, deco, seq, sz);
+ case (ESCAPE_SPECIAL):
+ print_spec(h, seq, len);
break;
- case (DECO_PREVIOUS):
+ case (ESCAPE_FONTPREV):
/* FALLTHROUGH */
- case (DECO_BOLD):
+ case (ESCAPE_FONTBOLD):
/* FALLTHROUGH */
- case (DECO_ITALIC):
+ case (ESCAPE_FONTITALIC):
/* FALLTHROUGH */
- case (DECO_ROMAN):
+ case (ESCAPE_FONTROMAN):
if (norecurse)
break;
- print_metaf(h, deco);
+ print_metaf(h, esc);
+ break;
+ case (ESCAPE_NOSPACE):
+ if ('\0' == *p)
+ nospace = 1;
break;
default:
break;
}
-
- p += len - 1;
-
- if (DECO_NOSPACE == deco && '\0' == *(p + 1))
- nospace = 1;
}
return(nospace);