--- old/usr/src/cmd/mandoc/mdoc_html.c	Wed Jul 30 20:55:09 2014
+++ new/usr/src/cmd/mandoc/mdoc_html.c	Wed Jul 30 20:55:09 2014
@@ -1,4 +1,4 @@
-/*	$Id: mdoc_html.c,v 1.182 2011/11/03 20:37:00 schwarze Exp $ */
+/*	$Id: mdoc_html.c,v 1.186 2013/12/24 20:45:27 schwarze Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  *
@@ -35,7 +35,7 @@
 
 #define	INDENT		 5
 
-#define	MDOC_ARGS	  const struct mdoc_meta *m, \
+#define	MDOC_ARGS	  const struct mdoc_meta *meta, \
 			  const struct mdoc_node *n, \
 			  struct html *h
 
@@ -260,10 +260,11 @@
 };
 
 void
-html_mdoc(void *arg, const struct mdoc *m)
+html_mdoc(void *arg, const struct mdoc *mdoc)
 {
 
-	print_mdoc(mdoc_meta(m), mdoc_node(m), (struct html *)arg);
+	print_mdoc(mdoc_meta(mdoc), mdoc_node(mdoc),
+			(struct html *)arg);
 	putchar('\n');
 }
 
@@ -361,7 +362,7 @@
 		print_gen_decls(h);
 		t = print_otag(h, TAG_HTML, 0, NULL);
 		tt = print_otag(h, TAG_HEAD, 0, NULL);
-		print_mdoc_head(m, n, h);
+		print_mdoc_head(meta, n, h);
 		print_tagq(h, tt);
 		print_otag(h, TAG_BODY, 0, NULL);
 		print_otag(h, TAG_DIV, 1, &tag);
@@ -368,7 +369,7 @@
 	} else 
 		t = print_otag(h, TAG_DIV, 1, &tag);
 
-	print_mdoc_nodelist(m, n, h);
+	print_mdoc_nodelist(meta, n, h);
 	print_tagq(h, t);
 }
 
@@ -380,10 +381,10 @@
 
 	print_gen_head(h);
 	bufinit(h);
-	bufcat_fmt(h, "%s(%s)", m->title, m->msec);
+	bufcat_fmt(h, "%s(%s)", meta->title, meta->msec);
 
-	if (m->arch)
-		bufcat_fmt(h, " (%s)", m->arch);
+	if (meta->arch)
+		bufcat_fmt(h, " (%s)", meta->arch);
 
 	print_otag(h, TAG_TITLE, 0, NULL);
 	print_text(h, h->buf);
@@ -394,9 +395,9 @@
 print_mdoc_nodelist(MDOC_ARGS)
 {
 
-	print_mdoc_node(m, n, h);
+	print_mdoc_node(meta, n, h);
 	if (n->next)
-		print_mdoc_nodelist(m, n->next, h);
+		print_mdoc_nodelist(meta, n->next, h);
 }
 
 
@@ -411,7 +412,7 @@
 
 	switch (n->type) {
 	case (MDOC_ROOT):
-		child = mdoc_root_pre(m, n, h);
+		child = mdoc_root_pre(meta, n, h);
 		break;
 	case (MDOC_TEXT):
 		/* No tables in this mode... */
@@ -454,36 +455,32 @@
 
 		assert(NULL == h->tblt);
 		if (mdocs[n->tok].pre && ENDBODY_NOT == n->end)
-			child = (*mdocs[n->tok].pre)(m, n, h);
+			child = (*mdocs[n->tok].pre)(meta, n, h);
 		break;
 	}
 
 	if (HTML_KEEP & h->flags) {
-		if (n->prev && n->prev->line != n->line) {
+		if (n->prev ? (n->prev->lastline != n->line) :
+		    (n->parent && n->parent->line != n->line)) {
 			h->flags &= ~HTML_KEEP;
 			h->flags |= HTML_PREKEEP;
-		} else if (NULL == n->prev) {
-			if (n->parent && n->parent->line != n->line) {
-				h->flags &= ~HTML_KEEP;
-				h->flags |= HTML_PREKEEP;
-			}
 		}
 	}
 
 	if (child && n->child)
-		print_mdoc_nodelist(m, n->child, h);
+		print_mdoc_nodelist(meta, n->child, h);
 
 	print_stagq(h, t);
 
 	switch (n->type) {
 	case (MDOC_ROOT):
-		mdoc_root_post(m, n, h);
+		mdoc_root_post(meta, n, h);
 		break;
 	case (MDOC_EQN):
 		break;
 	default:
 		if (mdocs[n->tok].post && ENDBODY_NOT == n->end)
-			(*mdocs[n->tok].post)(m, n, h);
+			(*mdocs[n->tok].post)(meta, n, h);
 		break;
 	}
 }
@@ -509,13 +506,13 @@
 
 	PAIR_CLASS_INIT(&tag[0], "foot-date");
 	print_otag(h, TAG_TD, 1, tag);
-	print_text(h, m->date);
+	print_text(h, meta->date);
 	print_stagq(h, tt);
 
 	PAIR_CLASS_INIT(&tag[0], "foot-os");
 	PAIR_INIT(&tag[1], ATTR_ALIGN, "right");
 	print_otag(h, TAG_TD, 2, tag);
-	print_text(h, m->os);
+	print_text(h, meta->os);
 	print_tagq(h, t);
 }
 
@@ -528,15 +525,15 @@
 	struct tag	*t, *tt;
 	char		 b[BUFSIZ], title[BUFSIZ];
 
-	strlcpy(b, m->vol, BUFSIZ);
+	strlcpy(b, meta->vol, BUFSIZ);
 
-	if (m->arch) {
+	if (meta->arch) {
 		strlcat(b, " (", BUFSIZ);
-		strlcat(b, m->arch, BUFSIZ);
+		strlcat(b, meta->arch, BUFSIZ);
 		strlcat(b, ")", BUFSIZ);
 	}
 
-	snprintf(title, BUFSIZ - 1, "%s(%s)", m->title, m->msec);
+	snprintf(title, BUFSIZ - 1, "%s(%s)", meta->title, meta->msec);
 
 	PAIR_SUMMARY_INIT(&tag[0], "Document Header");
 	PAIR_CLASS_INIT(&tag[1], "head");
@@ -689,13 +686,13 @@
 		synopsis_pre(h, n);
 		PAIR_CLASS_INIT(&tag, "name");
 		print_otag(h, TAG_B, 1, &tag);
-		if (NULL == n->child && m->name)
-			print_text(h, m->name);
+		if (NULL == n->child && meta->name)
+			print_text(h, meta->name);
 		return(1);
 	case (MDOC_HEAD):
 		print_otag(h, TAG_TD, 0, NULL);
-		if (NULL == n->child && m->name)
-			print_text(h, m->name);
+		if (NULL == n->child && meta->name)
+			print_text(h, meta->name);
 		return(1);
 	case (MDOC_BODY):
 		print_otag(h, TAG_TD, 0, NULL);
@@ -712,8 +709,8 @@
 		if (MDOC_TEXT == n->type)
 			len += html_strlen(n->string);
 
-	if (0 == len && m->name)
-		len = html_strlen(m->name);
+	if (0 == len && meta->name)
+		len = html_strlen(meta->name);
 
 	SCALE_HS_INIT(&su, (double)len);
 	bufinit(h);
@@ -981,8 +978,6 @@
 	struct roffsu	 su;
 	char		 buf[BUFSIZ];
 
-	bufinit(h);
-
 	if (MDOC_BODY == n->type) {
 		if (LIST_column == n->norm->Bl.type)
 			print_otag(h, TAG_TBODY, 0, NULL);
@@ -1001,6 +996,7 @@
 		 */
 
 		for (i = 0; i < (int)n->norm->Bl.ncols; i++) {
+			bufinit(h);
 			a2width(n->norm->Bl.cols[i], &su);
 			if (i < (int)n->norm->Bl.ncols - 1)
 				bufcat_su(h, "width", &su);
@@ -1014,6 +1010,7 @@
 	}
 
 	SCALE_VS_INIT(&su, 0);
+	bufinit(h);
 	bufcat_su(h, "margin-top", &su);
 	bufcat_su(h, "margin-bottom", &su);
 	PAIR_STYLE_INIT(&tag[0], h);
@@ -1225,7 +1222,7 @@
 	h->flags |= HTML_LITERAL;
 
 	for (nn = n->child; nn; nn = nn->next) {
-		print_mdoc_node(m, nn, h);
+		print_mdoc_node(meta, nn, h);
 		/*
 		 * If the printed node flushes its own line, then we
 		 * needn't do it here as well.  This is hacky, but the
@@ -2273,7 +2270,7 @@
 	case (MDOC_So):
 		/* FALLTHROUGH */
 	case (MDOC_Sq):
-		print_text(h, "\\(aq");
+		print_text(h, "\\(cq");
 		break;
 	default:
 		abort();
