summaryrefslogtreecommitdiff
path: root/usr.bin/mandoc
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@cvs.openbsd.org>2013-12-22 23:33:53 +0000
committerIngo Schwarze <schwarze@cvs.openbsd.org>2013-12-22 23:33:53 +0000
commit820ac390a24b43ad03bf201c9adebb423c5765ed (patch)
tree676a569fbe245fc4b5dc2ee4d1572a0222c2ec9b /usr.bin/mandoc
parent40511a43998dc2401c4a8476d80282cfcd6fd5ee (diff)
Polishing the worms in my favourite can, term_flushln().
The TERMP_TWOSPACE flag i introduced in August 2009 was idiosyncratic and served only a very narrow purpose. Replace it by a more intuitive and more general termp attribute "trailspace", to be used together with TERMP_NOBREAK, to request a minimum amount of whitespace at the end of the current column. Adapt all code to the new interface. No functional change intended; code reviews to confirm that are welcome *eg*.
Diffstat (limited to 'usr.bin/mandoc')
-rw-r--r--usr.bin/mandoc/man_term.c18
-rw-r--r--usr.bin/mandoc/mdoc_term.c49
-rw-r--r--usr.bin/mandoc/term.c14
-rw-r--r--usr.bin/mandoc/term.h5
4 files changed, 53 insertions, 33 deletions
diff --git a/usr.bin/mandoc/man_term.c b/usr.bin/mandoc/man_term.c
index c9ea3456656..630720af481 100644
--- a/usr.bin/mandoc/man_term.c
+++ b/usr.bin/mandoc/man_term.c
@@ -1,4 +1,4 @@
-/* $Id: man_term.c,v 1.92 2013/11/11 00:35:51 schwarze Exp $ */
+/* $Id: man_term.c,v 1.93 2013/12/22 23:33:52 schwarze Exp $ */
/*
* Copyright (c) 2008-2012 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2010, 2011, 2012, 2013 Ingo Schwarze <schwarze@openbsd.org>
@@ -261,7 +261,8 @@ pre_literal(DECL_ARGS)
if (MAN_HP == n->parent->tok && p->rmargin < p->maxrmargin) {
p->offset = p->rmargin;
p->rmargin = p->maxrmargin;
- p->flags &= ~(TERMP_NOBREAK | TERMP_TWOSPACE);
+ p->trailspace = 0;
+ p->flags &= ~TERMP_NOBREAK;
p->flags |= TERMP_NOSPACE;
}
@@ -531,7 +532,7 @@ pre_HP(DECL_ARGS)
if ( ! (MANT_LITERAL & mt->fl)) {
p->flags |= TERMP_NOBREAK;
- p->flags |= TERMP_TWOSPACE;
+ p->trailspace = 2;
}
len = mt->lmargin[mt->lmargincur];
@@ -566,7 +567,7 @@ post_HP(DECL_ARGS)
case (MAN_BODY):
term_newln(p);
p->flags &= ~TERMP_NOBREAK;
- p->flags &= ~TERMP_TWOSPACE;
+ p->trailspace = 0;
p->offset = mt->offset;
p->rmargin = p->maxrmargin;
break;
@@ -609,6 +610,7 @@ pre_IP(DECL_ARGS)
break;
case (MAN_HEAD):
p->flags |= TERMP_NOBREAK;
+ p->trailspace = 1;
break;
case (MAN_BLOCK):
print_bvspace(p, n, mt->pardist);
@@ -671,6 +673,7 @@ post_IP(DECL_ARGS)
case (MAN_HEAD):
term_flushln(p);
p->flags &= ~TERMP_NOBREAK;
+ p->trailspace = 0;
p->rmargin = p->maxrmargin;
break;
case (MAN_BODY):
@@ -694,6 +697,7 @@ pre_TP(DECL_ARGS)
switch (n->type) {
case (MAN_HEAD):
p->flags |= TERMP_NOBREAK;
+ p->trailspace = 1;
break;
case (MAN_BODY):
p->flags |= TERMP_NOSPACE;
@@ -741,8 +745,8 @@ pre_TP(DECL_ARGS)
case (MAN_BODY):
p->offset = mt->offset + len;
p->rmargin = p->maxrmargin;
+ p->trailspace = 0;
p->flags &= ~TERMP_NOBREAK;
- p->flags &= ~TERMP_TWOSPACE;
break;
default:
break;
@@ -1097,6 +1101,7 @@ print_man_foot(struct termp *p, const void *arg)
/* Bottom left corner: manual source. */
p->flags |= TERMP_NOSPACE | TERMP_NOBREAK;
+ p->trailspace = 1;
p->offset = 0;
p->rmargin = (p->maxrmargin - datelen + term_len(p, 1)) / 2;
@@ -1119,6 +1124,7 @@ print_man_foot(struct termp *p, const void *arg)
p->flags &= ~TERMP_NOBREAK;
p->flags |= TERMP_NOSPACE;
+ p->trailspace = 0;
p->offset = p->rmargin;
p->rmargin = p->maxrmargin;
@@ -1150,6 +1156,7 @@ print_man_head(struct termp *p, const void *arg)
titlen = term_strlen(p, title);
p->flags |= TERMP_NOBREAK | TERMP_NOSPACE;
+ p->trailspace = 1;
p->offset = 0;
p->rmargin = 2 * (titlen+1) + buflen < p->maxrmargin ?
(p->maxrmargin -
@@ -1172,6 +1179,7 @@ print_man_head(struct termp *p, const void *arg)
/* Top right corner: title and section, again. */
p->flags &= ~TERMP_NOBREAK;
+ p->trailspace = 0;
if (p->rmargin + titlen <= p->maxrmargin) {
p->flags |= TERMP_NOSPACE;
p->offset = p->rmargin;
diff --git a/usr.bin/mandoc/mdoc_term.c b/usr.bin/mandoc/mdoc_term.c
index 39d7314994f..aa1a687af1d 100644
--- a/usr.bin/mandoc/mdoc_term.c
+++ b/usr.bin/mandoc/mdoc_term.c
@@ -1,7 +1,7 @@
-/* $Id: mdoc_term.c,v 1.151 2013/06/02 18:16:51 schwarze Exp $ */
+/* $Id: mdoc_term.c,v 1.152 2013/12/22 23:33:52 schwarze Exp $ */
/*
* Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
- * Copyright (c) 2010, 2012 Ingo Schwarze <schwarze@openbsd.org>
+ * Copyright (c) 2010, 2012, 2013 Ingo Schwarze <schwarze@openbsd.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -420,6 +420,7 @@ print_mdoc_foot(struct termp *p, const void *arg)
p->offset = 0;
p->rmargin = (p->maxrmargin -
term_strlen(p, meta->date) + term_len(p, 1)) / 2;
+ p->trailspace = 1;
p->flags |= TERMP_NOSPACE | TERMP_NOBREAK;
term_word(p, meta->os);
@@ -434,6 +435,7 @@ print_mdoc_foot(struct termp *p, const void *arg)
p->offset = p->rmargin;
p->rmargin = p->maxrmargin;
+ p->trailspace = 0;
p->flags &= ~TERMP_NOBREAK;
p->flags |= TERMP_NOSPACE;
@@ -485,6 +487,7 @@ print_mdoc_head(struct termp *p, const void *arg)
titlen = term_strlen(p, title);
p->flags |= TERMP_NOBREAK | TERMP_NOSPACE;
+ p->trailspace = 1;
p->offset = 0;
p->rmargin = 2 * (titlen+1) + buflen < p->maxrmargin ?
(p->maxrmargin -
@@ -503,6 +506,7 @@ print_mdoc_head(struct termp *p, const void *arg)
term_flushln(p);
p->flags &= ~TERMP_NOBREAK;
+ p->trailspace = 0;
if (p->rmargin + titlen <= p->maxrmargin) {
p->flags |= TERMP_NOSPACE;
p->offset = p->rmargin;
@@ -790,13 +794,13 @@ termp_it_pre(DECL_ARGS)
case (LIST_dash):
/* FALLTHROUGH */
case (LIST_hyphen):
- if (MDOC_HEAD == n->type)
- p->flags |= TERMP_NOBREAK;
+ if (MDOC_HEAD != n->type)
+ break;
+ p->flags |= TERMP_NOBREAK;
+ p->trailspace = 1;
break;
case (LIST_hang):
- if (MDOC_HEAD == n->type)
- p->flags |= TERMP_NOBREAK;
- else
+ if (MDOC_HEAD != n->type)
break;
/*
@@ -808,16 +812,18 @@ termp_it_pre(DECL_ARGS)
if (n->next->child &&
(MDOC_Bl == n->next->child->tok ||
MDOC_Bd == n->next->child->tok))
- p->flags &= ~TERMP_NOBREAK;
- else
- p->flags |= TERMP_HANG;
+ break;
+
+ p->flags |= TERMP_NOBREAK | TERMP_HANG;
+ p->trailspace = 1;
break;
case (LIST_tag):
- if (MDOC_HEAD == n->type)
- p->flags |= TERMP_NOBREAK | TERMP_TWOSPACE;
-
if (MDOC_HEAD != n->type)
break;
+
+ p->flags |= TERMP_NOBREAK;
+ p->trailspace = 2;
+
if (NULL == n->next || NULL == n->next->child)
p->flags |= TERMP_DANGLE;
break;
@@ -825,15 +831,20 @@ termp_it_pre(DECL_ARGS)
if (MDOC_HEAD == n->type)
break;
- if (NULL == n->next)
+ if (NULL == n->next) {
p->flags &= ~TERMP_NOBREAK;
- else
+ p->trailspace = 0;
+ } else {
p->flags |= TERMP_NOBREAK;
+ p->trailspace = 1;
+ }
break;
case (LIST_diag):
- if (MDOC_HEAD == n->type)
- p->flags |= TERMP_NOBREAK;
+ if (MDOC_HEAD != n->type)
+ break;
+ p->flags |= TERMP_NOBREAK;
+ p->trailspace = 1;
break;
default:
break;
@@ -985,8 +996,8 @@ termp_it_post(DECL_ARGS)
p->flags &= ~TERMP_DANGLE;
p->flags &= ~TERMP_NOBREAK;
- p->flags &= ~TERMP_TWOSPACE;
p->flags &= ~TERMP_HANG;
+ p->trailspace = 0;
}
@@ -1019,6 +1030,7 @@ termp_nm_pre(DECL_ARGS)
if (MDOC_HEAD == n->type && n->next->child) {
p->flags |= TERMP_NOSPACE | TERMP_NOBREAK;
+ p->trailspace = 1;
p->rmargin = p->offset + term_len(p, 1);
if (NULL == n->child) {
p->rmargin += term_strlen(p, meta->name);
@@ -1047,6 +1059,7 @@ termp_nm_post(DECL_ARGS)
if (MDOC_HEAD == n->type && n->next->child) {
term_flushln(p);
p->flags &= ~(TERMP_NOBREAK | TERMP_HANG);
+ p->trailspace = 0;
} else if (MDOC_BODY == n->type && n->child)
term_flushln(p);
}
diff --git a/usr.bin/mandoc/term.c b/usr.bin/mandoc/term.c
index 29ef86ef400..bca3dedb110 100644
--- a/usr.bin/mandoc/term.c
+++ b/usr.bin/mandoc/term.c
@@ -1,4 +1,4 @@
-/* $Id: term.c,v 1.71 2013/08/21 21:19:47 schwarze Exp $ */
+/* $Id: term.c,v 1.72 2013/12/22 23:33:52 schwarze Exp $ */
/*
* Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2010, 2011, 2012, 2013 Ingo Schwarze <schwarze@openbsd.org>
@@ -79,9 +79,8 @@ term_end(struct termp *p)
* - TERMP_NOBREAK: this is the most important and is used when making
* columns. In short: don't print a newline and instead expect the
* next call to do the padding up to the start of the next column.
- *
- * - TERMP_TWOSPACE: make sure there is room for at least two space
- * characters of padding. Otherwise, rather break the line.
+ * p->trailspace may be set to 0, 1, or 2, depending on how many
+ * space characters are required at the end of the column.
*
* - TERMP_DANGLE: don't newline when TERMP_NOBREAK is specified and
* the line is overrun, and don't pad-right if it's underrun.
@@ -265,8 +264,8 @@ term_flushln(struct termp *p)
}
if (TERMP_HANG & p->flags) {
- /* We need one blank after the tag. */
- p->overstep = (int)(vis - maxvis + (*p->width)(p, ' '));
+ p->overstep = (int)(vis - maxvis +
+ p->trailspace * (*p->width)(p, ' '));
/*
* If we have overstepped the margin, temporarily move
@@ -281,8 +280,7 @@ term_flushln(struct termp *p)
return;
/* If the column was overrun, break the line. */
- if (maxvis <= vis +
- ((TERMP_TWOSPACE & p->flags) ? (*p->width)(p, ' ') : 0)) {
+ if (maxvis < vis + p->trailspace * (*p->width)(p, ' ')) {
(*p->endline)(p);
p->viscol = 0;
}
diff --git a/usr.bin/mandoc/term.h b/usr.bin/mandoc/term.h
index cd865783ee2..85ac531e6d7 100644
--- a/usr.bin/mandoc/term.h
+++ b/usr.bin/mandoc/term.h
@@ -1,6 +1,7 @@
-/* $Id: term.h,v 1.38 2013/08/21 21:19:47 schwarze Exp $ */
+/* $Id: term.h,v 1.39 2013/12/22 23:33:52 schwarze Exp $ */
/*
* Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
+ * Copyright (c) 2011, 2012, 2013 Ingo Schwarze <schwarze@openbsd.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -63,6 +64,7 @@ struct termp {
size_t tabwidth; /* Distance of tab positions. */
size_t col; /* Bytes in buf. */
size_t viscol; /* Chars on current line. */
+ size_t trailspace; /* See termp_flushln(). */
int overstep; /* See termp_flushln(). */
int skipvsp; /* Vertical space to skip. */
int flags;
@@ -73,7 +75,6 @@ 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 << 10) /* See term_flushln(). */
#define TERMP_NOSPLIT (1 << 11) /* See termp_an_pre/post(). */
#define TERMP_SPLIT (1 << 12) /* See termp_an_pre/post(). */
#define TERMP_ANPREC (1 << 13) /* See termp_an_pre(). */