Do not break output lines in .Fn function arguments in SYNOPSIS mode.
authorschwarze <schwarze@openbsd.org>
Wed, 25 Dec 2013 00:39:13 +0000 (00:39 +0000)
committerschwarze <schwarze@openbsd.org>
Wed, 25 Dec 2013 00:39:13 +0000 (00:39 +0000)
Following an idea from Franco Fichtner, but implemented more cleanly.
This reduces groff-mandoc-differences in base by a fantastic 7.5%.

regress/usr.bin/mandoc/mdoc/Fo/Makefile
regress/usr.bin/mandoc/mdoc/Fo/break.in [new file with mode: 0644]
regress/usr.bin/mandoc/mdoc/Fo/break.out_ascii [new file with mode: 0644]
usr.bin/mandoc/mdoc_man.c
usr.bin/mandoc/mdoc_term.c
usr.bin/mandoc/term.c
usr.bin/mandoc/term.h

index 48facb8..88adf0c 100644 (file)
@@ -1,8 +1,8 @@
-# $OpenBSD: Makefile,v 1.6 2012/11/18 00:05:28 schwarze Exp $
+# $OpenBSD: Makefile,v 1.7 2013/12/25 00:39:14 schwarze Exp $
 
-REGRESS_TARGETS = basic section noarg font eos
+REGRESS_TARGETS = basic section break noarg font eos
 
-# groff 1.21 does not handle .nr nS
+# groff does not handle .nr nS
 
 SKIP_GROFF ?= section
 
diff --git a/regress/usr.bin/mandoc/mdoc/Fo/break.in b/regress/usr.bin/mandoc/mdoc/Fo/break.in
new file mode 100644 (file)
index 0000000..2a5d1dc
--- /dev/null
@@ -0,0 +1,11 @@
+.Dd December 25, 2013
+.Dt FO-BREAK 1
+.Os OpenBSD
+.Sh NAME
+.Nm Fo-break
+.Nd line breaks in function blocks
+.Sh SYNOPSIS
+.Ft my_long_return_type *
+.Fn my_long_function "my_long_type first_argument" "my_long_type second_argument"
+.Sh DESCRIPTION
+.Fn my_long_function "my_long_type first_argument" "my_long_type second_argument"
diff --git a/regress/usr.bin/mandoc/mdoc/Fo/break.out_ascii b/regress/usr.bin/mandoc/mdoc/Fo/break.out_ascii
new file mode 100644 (file)
index 0000000..a3379b7
--- /dev/null
@@ -0,0 +1,15 @@
+FO-BREAK(1)                OpenBSD Reference Manual                FO-BREAK(1)
+
+N\bNA\bAM\bME\bE
+     F\bFo\bo-\b-b\bbr\bre\bea\bak\bk - line breaks in function blocks
+
+S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
+     _\bm_\by_\b__\bl_\bo_\bn_\bg_\b__\br_\be_\bt_\bu_\br_\bn_\b__\bt_\by_\bp_\be _\b*
+     m\bmy\by_\b_l\blo\bon\bng\bg_\b_f\bfu\bun\bnc\bct\bti\bio\bon\bn(_\bm_\by_\b__\bl_\bo_\bn_\bg_\b__\bt_\by_\bp_\be _\bf_\bi_\br_\bs_\bt_\b__\ba_\br_\bg_\bu_\bm_\be_\bn_\bt,
+         _\bm_\by_\b__\bl_\bo_\bn_\bg_\b__\bt_\by_\bp_\be _\bs_\be_\bc_\bo_\bn_\bd_\b__\ba_\br_\bg_\bu_\bm_\be_\bn_\bt);
+
+D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
+     m\bmy\by_\b_l\blo\bon\bng\bg_\b_f\bfu\bun\bnc\bct\bti\bio\bon\bn(_\bm_\by_\b__\bl_\bo_\bn_\bg_\b__\bt_\by_\bp_\be _\bf_\bi_\br_\bs_\bt_\b__\ba_\br_\bg_\bu_\bm_\be_\bn_\bt, _\bm_\by_\b__\bl_\bo_\bn_\bg_\b__\bt_\by_\bp_\be
+     _\bs_\be_\bc_\bo_\bn_\bd_\b__\ba_\br_\bg_\bu_\bm_\be_\bn_\bt)
+
+OpenBSD                        December 25, 2013                       OpenBSD
index 2cc2341..5b713b3 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mdoc_man.c,v 1.54 2013/12/24 22:08:23 schwarze Exp $ */
+/*     $Id: mdoc_man.c,v 1.55 2013/12/25 00:39:13 schwarze Exp $ */
 /*
  * Copyright (c) 2011, 2012, 2013 Ingo Schwarze <schwarze@openbsd.org>
  *
@@ -252,6 +252,7 @@ static      int             outflags;
 #define        MMAN_An_split   (1 << 9)  /* author mode is "split" */
 #define        MMAN_An_nosplit (1 << 10) /* author mode is "nosplit" */
 #define        MMAN_PD         (1 << 11) /* inter-paragraph spacing disabled */
+#define        MMAN_nbrword    (1 << 12) /* do not break the next word */
 
 #define        BL_STACK_MAX    32
 
@@ -360,6 +361,12 @@ print_word(const char *s)
                case (ASCII_HYPH):
                        putchar('-');
                        break;
+               case (' '):
+                       if (MMAN_nbrword & outflags) {
+                               printf("\\ ");
+                               break;
+                       }
+                       /* FALLTHROUGH */
                default:
                        putchar((unsigned char)*s);
                        break;
@@ -367,6 +374,7 @@ print_word(const char *s)
                if (TPremain)
                        TPremain--;
        }
+       outflags &= ~MMAN_nbrword;
 }
 
 static void
@@ -1024,6 +1032,8 @@ pre_fa(DECL_ARGS)
 
        while (NULL != n) {
                font_push('I');
+               if (MDOC_SYNPRETTY & n->flags)
+                       outflags |= MMAN_nbrword;
                print_node(meta, n);
                font_pop();
                if (NULL != (n = n->next))
index 162a832..ac5b7e0 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mdoc_term.c,v 1.156 2013/12/24 23:04:29 schwarze Exp $ */
+/*     $Id: mdoc_term.c,v 1.157 2013/12/25 00:39:13 schwarze Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010, 2012, 2013 Ingo Schwarze <schwarze@openbsd.org>
@@ -1560,6 +1560,8 @@ termp_fn_pre(DECL_ARGS)
        for (n = n->next; n; n = n->next) {
                assert(MDOC_TEXT == n->type);
                term_fontpush(p, TERMFONT_UNDER);
+               if (pretty)
+                       p->flags |= TERMP_NBRWORD;
                term_word(p, n->string);
                term_fontpop(p);
 
index 0a6a223..795a3fd 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: term.c,v 1.74 2013/12/24 23:04:29 schwarze Exp $ */
+/*     $Id: term.c,v 1.75 2013/12/25 00:39:13 schwarze Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010, 2011, 2012, 2013 Ingo Schwarze <schwarze@openbsd.org>
@@ -403,6 +403,7 @@ term_fontpop(struct termp *p)
 void
 term_word(struct termp *p, const char *word)
 {
+       const char       nbrsp[2] = { ASCII_NBRSP, 0 };
        const char      *seq, *cp;
        char             c;
        int              sz, uc;
@@ -434,7 +435,15 @@ term_word(struct termp *p, const char *word)
                                word++;
                                continue;
                        }
-                       ssz = strcspn(word, "\\");
+                       if (TERMP_NBRWORD & p->flags) {
+                               if (' ' == *word) {
+                                       encode(p, nbrsp, 1);
+                                       word++;
+                                       continue;
+                               }
+                               ssz = strcspn(word, "\\ ");
+                       } else
+                               ssz = strcspn(word, "\\");
                        encode(p, word, ssz);
                        word += (int)ssz;
                        continue;
@@ -509,6 +518,7 @@ term_word(struct termp *p, const char *word)
                        break;
                }
        }
+       p->flags &= ~TERMP_NBRWORD;
 }
 
 static void
index d890c4b..4da26f9 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: term.h,v 1.40 2013/12/24 23:04:29 schwarze Exp $ */
+/*     $Id: term.h,v 1.41 2013/12/25 00:39:13 schwarze Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2011, 2012, 2013 Ingo Schwarze <schwarze@openbsd.org>
@@ -71,6 +71,7 @@ struct        termp {
 #define        TERMP_SENTENCE   (1 << 1)       /* Space before a sentence. */
 #define        TERMP_NOSPACE    (1 << 2)       /* No space before words. */
 #define        TERMP_NONOSPACE  (1 << 3)       /* No space (no autounset). */
+#define        TERMP_NBRWORD    (1 << 4)       /* Make next word nonbreaking. */
 #define        TERMP_KEEP       (1 << 5)       /* Keep words together. */
 #define        TERMP_PREKEEP    (1 << 6)       /* ...starting with the next one. */
 #define        TERMP_SKIPCHAR   (1 << 7)       /* Skip the next character. */