-/* $Id: html.c,v 1.176 2014/10/10 15:26:29 schwarze Exp $ */
+/* $Id: html.c,v 1.181 2014/10/29 00:17:43 schwarze Exp $ */
/*
* Copyright (c) 2008-2011, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2011, 2012, 2013, 2014 Ingo Schwarze <schwarze@openbsd.org>
static int print_encode(struct html *, const char *, int);
static void print_metaf(struct html *, enum mandoc_esc);
static void print_attr(struct html *, const char *, const char *);
-static void *ml_alloc(char *);
-static void *
-ml_alloc(char *outopts)
+void *
+html_alloc(const struct mchars *mchars, char *outopts)
{
struct html *h;
const char *toks[5];
h = mandoc_calloc(1, sizeof(struct html));
h->tags.head = NULL;
- h->symtab = mchars_alloc();
+ h->symtab = mchars;
while (outopts && *outopts)
switch (getsubopt(&outopts, UNCONST(toks), &v)) {
return(h);
}
-void *
-html_alloc(char *outopts)
-{
-
- return(ml_alloc(outopts));
-}
-
-void *
-xhtml_alloc(char *outopts)
-{
-
- return(ml_alloc(outopts));
-}
-
void
html_free(void *p)
{
free(tag);
}
- if (h->symtab)
- mchars_free(h->symtab);
-
free(h);
}
case ESCAPE_UNICODE:
/* Skip past "u" header. */
c = mchars_num2uc(seq + 1, len - 1);
- if ('\0' != c)
- printf("&#x%x;", c);
break;
case ESCAPE_NUMBERED:
c = mchars_num2char(seq, len);
- if ( ! ('\0' == c || print_escape(c)))
- putchar(c);
+ if (c < 0)
+ continue;
break;
case ESCAPE_SPECIAL:
c = mchars_spec2cp(h->symtab, seq, len);
- if (c > 0)
- printf("&#%d;", c);
- else if (-1 == c && 1 == len &&
- !print_escape(*seq))
- putchar((int)*seq);
+ if (c <= 0)
+ continue;
break;
case ESCAPE_NOSPACE:
if ('\0' == *p)
nospace = 1;
- break;
+ continue;
default:
- break;
+ continue;
}
+ if ((c < 0x20 && c != 0x09) ||
+ (c > 0x7E && c < 0xA0))
+ c = 0xFFFD;
+ if (c > 0x7E)
+ printf("&#%d;", c);
+ else if ( ! print_escape(c))
+ putchar(c);
}
return(nospace);