bufcat_id(), then collapse it into a little function without so much
crap. Next, make bufinit() only be called when we really need to do so,
and not simply before pre/post calls.
-/* $Id: html.c,v 1.141 2011/05/17 11:19:45 kristaps Exp $ */
+/* $Id: html.c,v 1.142 2011/05/17 11:34:31 kristaps Exp $ */
/*
* Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2011 Ingo Schwarze <schwarze@openbsd.org>
/*
* Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2011 Ingo Schwarze <schwarze@openbsd.org>
-html_idcat(char *dst, const char *src, int sz)
+bufcat_id(struct html *h, const char *src)
- int ssz;
-
- assert(sz > 2);
/* Cf. <http://www.w3.org/TR/html4/types.html#h-6.2>. */
/* Cf. <http://www.w3.org/TR/html4/types.html#h-6.2>. */
- /* We can't start with a number (bah). */
-
- if ('#' == *dst) {
- dst++;
- sz--;
- }
- if ('\0' == *dst) {
- *dst++ = 'x';
- *dst = '\0';
- sz--;
- }
-
- for ( ; *dst != '\0' && sz; dst++, sz--)
- /* Jump to end. */ ;
-
- for ( ; *src != '\0' && sz > 1; src++) {
- ssz = snprintf(dst, (size_t)sz, "%.2x", *src);
- sz -= ssz;
- dst += ssz;
- }
+ if (0 == h->buflen)
+ bufcat(h, "#x");
+ while ('\0' != *src)
+ bufcat_fmt(h, "%.2x", *src++);
-/* $Id: html.h,v 1.43 2011/05/17 11:19:45 kristaps Exp $ */
+/* $Id: html.h,v 1.44 2011/05/17 11:34:31 kristaps Exp $ */
/*
* Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
*
/*
* Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
*
void print_tblclose(struct html *);
void print_tbl(struct html *, const struct tbl_span *);
void print_tblclose(struct html *);
void print_tbl(struct html *, const struct tbl_span *);
-void bufcat_su(struct html *, const char *,
- const struct roffsu *);
-void buffmt_man(struct html *,
- const char *, const char *);
-void buffmt_includes(struct html *, const char *);
void bufcat_fmt(struct html *, const char *, ...);
void bufcat(struct html *, const char *);
void bufcat_fmt(struct html *, const char *, ...);
void bufcat(struct html *, const char *);
+void bufcat_id(struct html *, const char *);
void bufcat_style(struct html *,
const char *, const char *);
void bufcat_style(struct html *,
const char *, const char *);
+void bufcat_su(struct html *, const char *,
+ const struct roffsu *);
void bufinit(struct html *);
void bufinit(struct html *);
+void buffmt_man(struct html *,
+ const char *, const char *);
+void buffmt_includes(struct html *, const char *);
-void html_idcat(char *, const char *, int);
int html_strlen(const char *);
__END_DECLS
int html_strlen(const char *);
__END_DECLS
-/* $Id: man_html.c,v 1.71 2011/05/17 11:19:45 kristaps Exp $ */
+/* $Id: man_html.c,v 1.72 2011/05/17 11:34:31 kristaps Exp $ */
/*
* Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
*
/*
* Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
*
bufcat_fmt(h, "%s(%s)", m->title, m->msec);
bufcat_fmt(h, "%s(%s)", m->title, m->msec);
print_otag(h, TAG_TITLE, 0, NULL);
print_text(h, h->buf);
}
print_otag(h, TAG_TITLE, 0, NULL);
print_text(h, h->buf);
}
child = 1;
t = h->tags.head;
child = 1;
t = h->tags.head;
switch (n->type) {
case (MAN_ROOT):
switch (n->type) {
case (MAN_ROOT):
/* This will automatically close out any font scope. */
print_stagq(h, t);
/* This will automatically close out any font scope. */
print_stagq(h, t);
switch (n->type) {
case (MAN_ROOT):
man_root_post(m, n, mh, h);
switch (n->type) {
case (MAN_ROOT):
man_root_post(m, n, mh, h);
bufcat_su(h, "height", &su);
PAIR_STYLE_INIT(&tag, h);
print_otag(h, TAG_DIV, 1, &tag);
bufcat_su(h, "height", &su);
PAIR_STYLE_INIT(&tag, h);
print_otag(h, TAG_DIV, 1, &tag);
if (MAN_BLOCK == n->type) {
print_otag(h, TAG_P, 0, NULL);
print_otag(h, TAG_TABLE, 0, NULL);
if (MAN_BLOCK == n->type) {
print_otag(h, TAG_P, 0, NULL);
print_otag(h, TAG_TABLE, 0, NULL);
bufcat_su(h, "width", &su);
PAIR_STYLE_INIT(&tag, h);
print_otag(h, TAG_COL, 1, &tag);
bufcat_su(h, "width", &su);
PAIR_STYLE_INIT(&tag, h);
print_otag(h, TAG_COL, 1, &tag);
struct roffsu su;
const struct man_node *np;
struct roffsu su;
const struct man_node *np;
np = MAN_BLOCK == n->type ?
n->head->child :
n->parent->head->child;
np = MAN_BLOCK == n->type ?
n->head->child :
n->parent->head->child;
if (n->head->child)
a2width(n->head->child, &su);
if (n->head->child)
a2width(n->head->child, &su);
bufcat_su(h, "margin-left", &su);
PAIR_STYLE_INIT(&tag, h);
print_otag(h, TAG_DIV, 1, &tag);
bufcat_su(h, "margin-left", &su);
PAIR_STYLE_INIT(&tag, h);
print_otag(h, TAG_DIV, 1, &tag);
-/* $Id: mdoc_html.c,v 1.167 2011/05/17 11:19:45 kristaps Exp $ */
+/* $Id: mdoc_html.c,v 1.168 2011/05/17 11:34:31 kristaps Exp $ */
/*
* Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
*
/*
* Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
*
bufinit(h);
bufcat_fmt(h, "%s(%s)", m->title, m->msec);
bufinit(h);
bufcat_fmt(h, "%s(%s)", m->title, m->msec);
- if (m->arch) {
- bufcat(h, " (");
- bufcat(h, m->arch);
- bufcat(h, ")");
- }
+ if (m->arch)
+ bufcat_fmt(h, " (%s)", m->arch);
print_otag(h, TAG_TITLE, 0, NULL);
print_text(h, h->buf);
print_otag(h, TAG_TITLE, 0, NULL);
print_text(h, h->buf);
child = 1;
t = h->tags.head;
child = 1;
t = h->tags.head;
switch (n->type) {
case (MDOC_ROOT):
child = mdoc_root_pre(m, n, h);
switch (n->type) {
case (MDOC_ROOT):
child = mdoc_root_pre(m, n, h);
switch (n->type) {
case (MDOC_ROOT):
mdoc_root_post(m, n, h);
switch (n->type) {
case (MDOC_ROOT):
mdoc_root_post(m, n, h);
mdoc_sh_pre(MDOC_ARGS)
{
struct htmlpair tag;
mdoc_sh_pre(MDOC_ARGS)
{
struct htmlpair tag;
if (MDOC_BLOCK == n->type) {
PAIR_CLASS_INIT(&tag, "section");
if (MDOC_BLOCK == n->type) {
PAIR_CLASS_INIT(&tag, "section");
} else if (MDOC_BODY == n->type)
return(1);
} else if (MDOC_BODY == n->type)
return(1);
for (n = n->child; n; n = n->next) {
for (n = n->child; n; n = n->next) {
- html_idcat(buf, n->string, BUFSIZ);
+ bufcat_id(h, n->string);
- html_idcat(buf, " ", BUFSIZ);
- PAIR_ID_INIT(&tag, buf);
+ PAIR_ID_INIT(&tag, h->buf);
print_otag(h, TAG_H1, 1, &tag);
return(1);
}
print_otag(h, TAG_H1, 1, &tag);
return(1);
}
mdoc_ss_pre(MDOC_ARGS)
{
struct htmlpair tag;
mdoc_ss_pre(MDOC_ARGS)
{
struct htmlpair tag;
if (MDOC_BLOCK == n->type) {
PAIR_CLASS_INIT(&tag, "subsection");
if (MDOC_BLOCK == n->type) {
PAIR_CLASS_INIT(&tag, "subsection");
} else if (MDOC_BODY == n->type)
return(1);
} else if (MDOC_BODY == n->type)
return(1);
for (n = n->child; n; n = n->next) {
for (n = n->child; n; n = n->next) {
- html_idcat(buf, n->string, BUFSIZ);
+ bufcat_id(h, n->string);
- html_idcat(buf, " ", BUFSIZ);
- PAIR_ID_INIT(&tag, buf);
+ PAIR_ID_INIT(&tag, h->buf);
print_otag(h, TAG_H2, 1, &tag);
return(1);
}
print_otag(h, TAG_H2, 1, &tag);
return(1);
}
len = html_strlen(m->name);
SCALE_HS_INIT(&su, (double)len);
len = html_strlen(m->name);
SCALE_HS_INIT(&su, (double)len);
bufcat_su(h, "width", &su);
PAIR_STYLE_INIT(&tag, h);
print_otag(h, TAG_COL, 1, &tag);
bufcat_su(h, "width", &su);
PAIR_STYLE_INIT(&tag, h);
print_otag(h, TAG_COL, 1, &tag);
assert(lists[type]);
PAIR_CLASS_INIT(&tag[0], lists[type]);
assert(lists[type]);
PAIR_CLASS_INIT(&tag[0], lists[type]);
if (MDOC_HEAD == n->type) {
switch (type) {
case(LIST_bullet):
if (MDOC_HEAD == n->type) {
switch (type) {
case(LIST_bullet):
struct roffsu su;
char buf[BUFSIZ];
struct roffsu su;
char buf[BUFSIZ];
if (MDOC_BODY == n->type) {
if (LIST_column == n->norm->Bl.type)
print_otag(h, TAG_TBODY, 0, NULL);
if (MDOC_BODY == n->type) {
if (LIST_column == n->norm->Bl.type)
print_otag(h, TAG_TBODY, 0, NULL);
for (i = 0; i < (int)n->norm->Bl.ncols; i++) {
a2width(n->norm->Bl.cols[i], &su);
for (i = 0; i < (int)n->norm->Bl.ncols; i++) {
a2width(n->norm->Bl.cols[i], &su);
if (i < (int)n->norm->Bl.ncols - 1)
bufcat_su(h, "width", &su);
else
if (i < (int)n->norm->Bl.ncols - 1)
bufcat_su(h, "width", &su);
else
return(1);
SCALE_VS_INIT(&su, 0);
return(1);
SCALE_VS_INIT(&su, 0);
bufcat_su(h, "margin-top", &su);
bufcat_su(h, "margin-bottom", &su);
PAIR_STYLE_INIT(&tag[0], h);
bufcat_su(h, "margin-top", &su);
bufcat_su(h, "margin-bottom", &su);
PAIR_STYLE_INIT(&tag[0], h);
mdoc_sx_pre(MDOC_ARGS)
{
struct htmlpair tag[2];
mdoc_sx_pre(MDOC_ARGS)
{
struct htmlpair tag[2];
- strlcpy(buf, "#", BUFSIZ);
for (n = n->child; n; n = n->next) {
for (n = n->child; n; n = n->next) {
- html_idcat(buf, n->string, BUFSIZ);
+ bufcat_id(h, n->string);
- html_idcat(buf, " ", BUFSIZ);
}
PAIR_CLASS_INIT(&tag[0], "link-sec");
}
PAIR_CLASS_INIT(&tag[0], "link-sec");
- PAIR_HREF_INIT(&tag[1], buf);
+ PAIR_HREF_INIT(&tag[1], h->buf);
print_otag(h, TAG_I, 1, tag);
print_otag(h, TAG_A, 2, tag);
print_otag(h, TAG_I, 1, tag);
print_otag(h, TAG_A, 2, tag);
SCALE_HS_INIT(&su, 0);
if (n->norm->Bd.offs)
a2offs(n->norm->Bd.offs, &su);
SCALE_HS_INIT(&su, 0);
if (n->norm->Bd.offs)
a2offs(n->norm->Bd.offs, &su);
bufcat_su(h, "margin-left", &su);
PAIR_STYLE_INIT(&tag[0], h);
bufcat_su(h, "margin-left", &su);
PAIR_STYLE_INIT(&tag[0], h);
buf[sz - 1] = '\0';
PAIR_CLASS_INIT(&tag[0], "link-includes");
buf[sz - 1] = '\0';
PAIR_CLASS_INIT(&tag[0], "link-includes");
i = 1;
if (h->base_includes) {
i = 1;
if (h->base_includes) {
print_text(h, "(");
h->flags |= HTML_NOSPACE;
print_text(h, "(");
h->flags |= HTML_NOSPACE;
PAIR_CLASS_INIT(&tag[0], "farg");
PAIR_CLASS_INIT(&tag[0], "farg");
bufcat_style(h, "white-space", "nowrap");
PAIR_STYLE_INIT(&tag[1], h);
bufcat_style(h, "white-space", "nowrap");
PAIR_STYLE_INIT(&tag[1], h);
bufcat_su(h, "height", &su);
PAIR_STYLE_INIT(&tag, h);
print_otag(h, TAG_DIV, 1, &tag);
bufcat_su(h, "height", &su);
PAIR_STYLE_INIT(&tag, h);
print_otag(h, TAG_DIV, 1, &tag);
assert(MDOC_TEXT == n->type);
PAIR_CLASS_INIT(&tag[0], "link-includes");
assert(MDOC_TEXT == n->type);
PAIR_CLASS_INIT(&tag[0], "link-includes");
if (h->base_includes) {
buffmt_includes(h, n->string);
PAIR_HREF_INIT(&tag[i], h->buf);
if (h->base_includes) {
buffmt_includes(h, n->string);
PAIR_HREF_INIT(&tag[i], h->buf);
* We want this to be inline-formatted, but needs to be div to
* accept block children.
*/
* We want this to be inline-formatted, but needs to be div to
* accept block children.
*/
bufcat_style(h, "display", "inline");
SCALE_HS_INIT(&su, 1);
/* Needs a left-margin for spacing. */
bufcat_style(h, "display", "inline");
SCALE_HS_INIT(&su, 1);
/* Needs a left-margin for spacing. */