summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mdoc_man.c81
1 files changed, 54 insertions, 27 deletions
diff --git a/mdoc_man.c b/mdoc_man.c
index adfd3659..d677ac7a 100644
--- a/mdoc_man.c
+++ b/mdoc_man.c
@@ -254,6 +254,8 @@ static int outflags;
#define MMAN_An_split (1 << 8) /* author mode is "split" */
#define MMAN_An_nosplit (1 << 9) /* author mode is "nosplit" */
+static int TPremain; /* characters before tag is full */
+
static struct {
char *head;
char *tail;
@@ -270,7 +272,8 @@ font_push(char newfont)
fontqueue.size);
}
*fontqueue.tail = newfont;
- print_word("\\f");
+ print_word("");
+ printf("\\f");
putchar(newfont);
outflags &= ~MMAN_spc;
}
@@ -282,7 +285,8 @@ font_pop(void)
if (fontqueue.tail > fontqueue.head)
fontqueue.tail--;
outflags &= ~MMAN_spc;
- print_word("\\f");
+ print_word("");
+ printf("\\f");
putchar(*fontqueue.tail);
}
@@ -305,28 +309,34 @@ print_word(const char *s)
else if (MMAN_nl & outflags)
putchar('\n');
outflags &= ~(MMAN_PP|MMAN_sp|MMAN_br|MMAN_nl|MMAN_spc);
- } else if (MMAN_spc & outflags && '\0' != s[0])
+ if (1 == TPremain)
+ printf(".br\n");
+ TPremain = 0;
+ } else if (MMAN_spc & outflags) {
/*
* If we need a space, only print it if
* (1) it is forced by `No' or
* (2) what follows is not terminating punctuation or
* (3) what follows is longer than one character.
*/
- if (MMAN_spc_force & outflags ||
+ if (MMAN_spc_force & outflags || '\0' == s[0] ||
NULL == strchr(".,:;)]?!", s[0]) || '\0' != s[1]) {
if (MMAN_Bk & outflags) {
putchar('\\');
putchar('~');
} else
putchar(' ');
+ if (TPremain)
+ TPremain--;
}
+ }
/*
* Reassign needing space if we're not following opening
* punctuation.
*/
- if (MMAN_Sm & outflags &&
- (('(' != s[0] && '[' != s[0]) || '\0' != s[1]))
+ if (MMAN_Sm & outflags && ('\0' == s[0] ||
+ (('(' != s[0] && '[' != s[0]) || '\0' != s[1])))
outflags |= MMAN_spc;
else
outflags &= ~MMAN_spc;
@@ -344,6 +354,8 @@ print_word(const char *s)
putchar((unsigned char)*s);
break;
}
+ if (TPremain)
+ TPremain--;
}
}
@@ -400,33 +412,38 @@ print_width(const char *v, const struct mdoc_node *child, size_t defsz)
char buf[24];
struct roffsu su;
size_t sz, chsz;
+ int numeric, remain;
- /* XXX Rough estimation, might have multiple parts. */
- chsz = (NULL != child && MDOC_TEXT == child->type) ?
- strlen(child->string) : 0;
-
+ numeric = 1;
+ remain = 0;
if (NULL == v)
sz = defsz;
else if (a2roffsu(v, &su, SCALE_MAX)) {
if (SCALE_EN == su.unit)
sz = su.scale;
else {
- if (chsz)
- print_block(".HP", 0);
- else
- print_block(".TP", 0);
- print_word(v);
- return;
+ sz = 0;
+ numeric = 0;
}
} else
sz = strlen(v);
- if (chsz > sz)
+ /* XXX Rough estimation, might have multiple parts. */
+ chsz = (NULL != child && MDOC_TEXT == child->type) ?
+ strlen(child->string) : 0;
+
+ if (defsz && chsz > sz)
print_block(".HP", 0);
- else
+ else {
print_block(".TP", 0);
- snprintf(buf, sizeof(buf), "%ldn", sz + 2);
- print_word(buf);
+ remain = sz + 2;
+ }
+ if (numeric) {
+ snprintf(buf, sizeof(buf), "%ldn", sz + 2);
+ print_word(buf);
+ } else
+ print_word(v);
+ TPremain = remain;
}
void
@@ -499,7 +516,8 @@ print_node(DECL_ARGS)
*/
if (MMAN_nl & outflags && ('.' == *n->string ||
'\'' == *n->string)) {
- print_word("\\&");
+ print_word("");
+ printf("\\&");
outflags &= ~MMAN_spc;
}
print_word(n->string);
@@ -599,7 +617,8 @@ pre__t(DECL_ARGS)
if (n->parent && MDOC_Rs == n->parent->tok &&
n->parent->norm->Rs.quote_T) {
- print_word("\"");
+ print_word("");
+ putchar('\"');
outflags &= ~MMAN_spc;
} else
font_push('I');
@@ -613,7 +632,8 @@ post__t(DECL_ARGS)
if (n->parent && MDOC_Rs == n->parent->tok &&
n->parent->norm->Rs.quote_T) {
outflags &= ~MMAN_spc;
- print_word("\"");
+ print_word("");
+ putchar('\"');
} else
font_pop();
post_percent(m, n);
@@ -630,7 +650,8 @@ pre_sect(DECL_ARGS)
return(1);
outflags |= MMAN_sp;
print_block(manacts[n->tok].prefix, 0);
- print_word("\"");
+ print_word("");
+ putchar('\"');
outflags &= ~MMAN_spc;
return(1);
}
@@ -645,7 +666,8 @@ post_sect(DECL_ARGS)
if (MDOC_HEAD != n->type)
return;
outflags &= ~MMAN_spc;
- print_word("\"");
+ print_word("");
+ putchar('\"');
outflags |= MMAN_nl;
if (MDOC_Sh == n->tok && SEC_AUTHORS == n->sec)
outflags &= ~(MMAN_An_split | MMAN_An_nosplit);
@@ -1117,6 +1139,7 @@ pre_it(DECL_ARGS)
/* FALLTHROUGH */
case (LIST_hyphen):
print_width(bln->norm->Bl.width, NULL, 0);
+ TPremain = 0;
outflags |= MMAN_nl;
font_push('B');
if (LIST_bullet == bln->norm->Bl.type)
@@ -1127,15 +1150,19 @@ pre_it(DECL_ARGS)
break;
case (LIST_enum):
print_width(bln->norm->Bl.width, NULL, 0);
+ TPremain = 0;
outflags |= MMAN_nl;
print_count(&bln->norm->Bl.count);
break;
case (LIST_hang):
print_width(bln->norm->Bl.width, n->child, 6);
+ TPremain = 0;
break;
case (LIST_tag):
- print_width(bln->norm->Bl.width, NULL, 8);
- break;
+ print_width(bln->norm->Bl.width, n->child, 0);
+ putchar('\n');
+ outflags &= ~MMAN_spc;
+ return(1);
default:
return(1);
}