summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorKristaps Dzonsons <kristaps@bsd.lv>2009-07-21 13:34:13 +0000
committerKristaps Dzonsons <kristaps@bsd.lv>2009-07-21 13:34:13 +0000
commit882b76ed67f76f2c0568ddf2aa980875a139fbe5 (patch)
treed9fb86e324e840ef552bb67d4a898fa792fc7c96
parentff6450df2b770952b864bc2e5ea77ed33f92c934 (diff)
downloadmandoc-882b76ed67f76f2c0568ddf2aa980875a139fbe5.tar.gz
mandoc-882b76ed67f76f2c0568ddf2aa980875a139fbe5.tar.zst
mandoc-882b76ed67f76f2c0568ddf2aa980875a139fbe5.zip
Bringing spacing more in line with groff, patches from schwarze@openbsd.org. Pre-testing.
-rw-r--r--mdoc_term.c19
-rw-r--r--term.c73
-rw-r--r--term.h3
3 files changed, 50 insertions, 45 deletions
diff --git a/mdoc_term.c b/mdoc_term.c
index bdd63db5..148aaaf5 100644
--- a/mdoc_term.c
+++ b/mdoc_term.c
@@ -1,4 +1,4 @@
-/* $Id: mdoc_term.c,v 1.50 2009/07/21 12:47:52 kristaps Exp $ */
+/* $Id: mdoc_term.c,v 1.51 2009/07/21 13:34:13 kristaps Exp $ */
/*
* Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
*
@@ -812,18 +812,22 @@ termp_it_pre(DECL_ARGS)
* while diagonal bodies need two.
*/
+ p->flags |= TERMP_NOSPACE;
+
switch (type) {
+ case (MDOC_Diag):
+ term_word(p, "\\ \\ ");
+ break;
case (MDOC_Inset):
if (MDOC_BODY == node->type)
- p->flags &= ~TERMP_NOSPACE;
- else
- p->flags |= TERMP_NOSPACE;
+ term_word(p, "\\ ");
break;
default:
- p->flags |= TERMP_NOSPACE;
break;
}
+ p->flags |= TERMP_NOSPACE;
+
/*
* Style flags. Diagnostic heads need TTYPE_DIAG.
*/
@@ -869,7 +873,7 @@ termp_it_pre(DECL_ARGS)
break;
case (MDOC_Tag):
if (MDOC_HEAD == node->type)
- p->flags |= TERMP_NOBREAK;
+ p->flags |= TERMP_NOBREAK | TERMP_TWOSPACE;
else
p->flags |= TERMP_NOLPAD;
@@ -1009,9 +1013,6 @@ termp_it_post(DECL_ARGS)
assert(-1 != type);
switch (type) {
- case (MDOC_Diag):
- term_word(p, "\\ ");
- /* FALLTHROUGH */
case (MDOC_Item):
/* FALLTHROUGH */
case (MDOC_Inset):
diff --git a/term.c b/term.c
index 4d33ce8d..f7b92697 100644
--- a/term.c
+++ b/term.c
@@ -1,4 +1,4 @@
-/* $Id: term.c,v 1.90 2009/07/19 21:26:27 kristaps Exp $ */
+/* $Id: term.c,v 1.91 2009/07/21 13:34:13 kristaps Exp $ */
/*
* Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
*
@@ -184,6 +184,9 @@ term_isopendelim(const char *p)
* columns. In short: don't print a newline and instead pad to the
* right margin. Used in conjunction with TERMP_NOLPAD.
*
+ * - TERMP_TWOSPACE: when padding, make sure there are at least two
+ * space characters of padding. Otherwise, rather break the line.
+ *
* - TERMP_DANGLE: don't newline when TERMP_NOBREAK is specified and
* the line is overrun, and don't pad-right if it's underrun.
*
@@ -214,7 +217,7 @@ term_flushln(struct termp *p)
{
int i, j;
size_t vbl, vsz, vis, maxvis, mmax, bp;
- static int sv = -1;
+ static int overstep = 0;
/*
* First, establish the maximum columns of "visible" content.
@@ -224,15 +227,11 @@ term_flushln(struct termp *p)
*/
assert(p->offset < p->rmargin);
- maxvis = p->rmargin - p->offset;
- mmax = p->maxrmargin - p->offset;
+ maxvis = p->rmargin - p->offset - overstep;
+ mmax = p->maxrmargin - p->offset - overstep;
bp = TERMP_NOBREAK & p->flags ? mmax : maxvis;
vis = 0;
-
- if (sv >= 0) {
- vis = (size_t)sv;
- sv = -1;
- }
+ overstep = 0;
/*
* If in the standard case (left-justified), then begin with our
@@ -302,38 +301,42 @@ term_flushln(struct termp *p)
}
vis += vsz;
}
+ p->col = 0;
- /*
- * If we've overstepped our maximum visible no-break space, then
- * cause a newline and offset at the right margin.
- */
-
- if ((TERMP_NOBREAK & p->flags) && vis >= maxvis) {
- if ( ! (TERMP_DANGLE & p->flags) &&
- ! (TERMP_HANG & p->flags)) {
- putchar('\n');
- for (i = 0; i < (int)p->rmargin; i++)
- putchar(' ');
- }
- if (TERMP_HANG & p->flags)
- sv = (int)(vis - maxvis);
- p->col = 0;
+ if ( ! (TERMP_NOBREAK & p->flags)) {
+ putchar('\n');
return;
}
- /*
- * If we're not to right-marginalise it (newline), then instead
- * pad to the right margin and stay off.
- */
+ if (TERMP_HANG & p->flags) {
- if (p->flags & TERMP_NOBREAK) {
- if ( ! (TERMP_DANGLE & p->flags))
- for ( ; vis < maxvis; vis++)
- putchar(' ');
- } else
- putchar('\n');
+ /* We need one blank after the tag. */
+ overstep = vis - maxvis + 1;
- p->col = 0;
+ /*
+ * Behave exactly the same way as groff:
+ * If we have overstepped the margin, temporarily move it
+ * to the right and flag the rest of the line to be shorter.
+ * If we landed right at the margin, be happy.
+ * If we are one step before the margin, temporarily move it
+ * one step LEFT and flag the rest of the line to be longer.
+ */
+ if (overstep >= -1)
+ maxvis += overstep;
+ else
+ overstep = 0;
+
+ } else if (TERMP_DANGLE & p->flags)
+ return;
+
+ if (maxvis > vis + ((TERMP_TWOSPACE & p->flags) ? 1 : 0)) /* pad */
+ for ( ; vis < maxvis; vis++)
+ putchar(' ');
+ else { /* break */
+ putchar('\n');
+ for (i = 0; i < (int)p->rmargin; i++)
+ putchar(' ');
+ }
}
diff --git a/term.h b/term.h
index e713cb65..ecc6317d 100644
--- a/term.h
+++ b/term.h
@@ -1,4 +1,4 @@
-/* $Id: term.h,v 1.39 2009/07/19 09:10:42 kristaps Exp $ */
+/* $Id: term.h,v 1.40 2009/07/21 13:34:13 kristaps Exp $ */
/*
* Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
*
@@ -47,6 +47,7 @@ struct termp {
#define TERMP_NONOSPACE (1 << 7) /* No space (no autounset). */
#define TERMP_DANGLE (1 << 8) /* See term_flushln(). */
#define TERMP_HANG (1 << 9) /* See term_flushln(). */
+#define TERMP_TWOSPACE (1 << 9) /* See term_flushln(). */
char *buf; /* Output buffer. */
enum termenc enc; /* Type of encoding. */
void *symtab; /* Encoded-symbol table. */