+
+
+void
+bufcat_su(struct html *h, const char *p, const struct roffsu *su)
+{
+ double v;
+ const char *u;
+
+ v = su->scale;
+
+ switch (su->unit) {
+ case (SCALE_CM):
+ u = "cm";
+ break;
+ case (SCALE_IN):
+ u = "in";
+ break;
+ case (SCALE_PC):
+ u = "pc";
+ break;
+ case (SCALE_PT):
+ u = "pt";
+ break;
+ case (SCALE_EM):
+ u = "em";
+ break;
+ case (SCALE_MM):
+ if (0 == (v /= 100))
+ v = 1;
+ u = "em";
+ break;
+ case (SCALE_EN):
+ u = "ex";
+ break;
+ case (SCALE_BU):
+ u = "ex";
+ break;
+ case (SCALE_VS):
+ u = "em";
+ break;
+ default:
+ u = "ex";
+ break;
+ }
+
+ /*
+ * XXX: the CSS spec isn't clear as to which types accept
+ * integer or real numbers, so we just make them all decimals.
+ */
+ buffmt(h, "%s: %.2f%s;", p, v, u);
+}
+
+
+void
+html_idcat(char *dst, const char *src, int sz)
+{
+ int ssz;
+
+ assert(sz);
+
+ /* Cf. <http://www.w3.org/TR/html4/types.html#h-6.2>. */
+
+ for ( ; *dst != '\0' && sz; dst++, sz--)
+ /* Jump to end. */ ;
+
+ assert(sz > 2);
+
+ /* We can't start with a number (bah). */
+
+ *dst++ = 'x';
+ *dst = '\0';
+ sz--;
+
+ for ( ; *src != '\0' && sz > 1; src++) {
+ ssz = snprintf(dst, (size_t)sz, "%.2x", *src);
+ sz -= ssz;
+ dst += ssz;
+ }
+}