summaryrefslogtreecommitdiff
path: root/usr.bin/mandoc
diff options
context:
space:
mode:
Diffstat (limited to 'usr.bin/mandoc')
-rw-r--r--usr.bin/mandoc/mdoc.712
-rw-r--r--usr.bin/mandoc/mdoc_macro.c10
-rw-r--r--usr.bin/mandoc/mdoc_term.c65
-rw-r--r--usr.bin/mandoc/term.h5
4 files changed, 84 insertions, 8 deletions
diff --git a/usr.bin/mandoc/mdoc.7 b/usr.bin/mandoc/mdoc.7
index 7c26f5b7b07..17051683b1b 100644
--- a/usr.bin/mandoc/mdoc.7
+++ b/usr.bin/mandoc/mdoc.7
@@ -1,4 +1,4 @@
-.\" $Id: mdoc.7,v 1.10 2009/08/09 16:36:45 schwarze Exp $
+.\" $Id: mdoc.7,v 1.11 2009/08/09 21:59:41 schwarze Exp $
.\"
.\" Copyright (c) 2009 Kristaps Dzonsons <kristaps@kth.se>
.\"
@@ -456,6 +456,16 @@ file re-write
.Bl -dash -compact
.\" LIST-ITEM
.It
+The
+.Sq \-split
+or
+.Sq \-nosplit
+argument to
+.Sq \&An
+applies to the whole document, not just to the current section as it
+does in groff.
+.\" LIST-ITEM
+.It
In quoted literals, groff allowed pair-wise double-quotes to produce a
standalone double-quote in formatted output. This idiosyncratic
behaviour is no longer applicable.
diff --git a/usr.bin/mandoc/mdoc_macro.c b/usr.bin/mandoc/mdoc_macro.c
index eeb3d8923fa..1c7609b4f3e 100644
--- a/usr.bin/mandoc/mdoc_macro.c
+++ b/usr.bin/mandoc/mdoc_macro.c
@@ -1,4 +1,4 @@
-/* $Id: mdoc_macro.c,v 1.18 2009/08/09 19:59:13 schwarze Exp $ */
+/* $Id: mdoc_macro.c,v 1.19 2009/08/09 21:59:41 schwarze Exp $ */
/*
* Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
*
@@ -742,15 +742,17 @@ in_line(MACRO_PROT_ARGS)
* usually because of reserved words) to squeak by.
*/
switch (tok) {
- case (MDOC_Nm):
+ case (MDOC_An):
+ /* FALLTHROUGH */
+ case (MDOC_Ar):
/* FALLTHROUGH */
case (MDOC_Fl):
/* FALLTHROUGH */
case (MDOC_Lk):
/* FALLTHROUGH */
- case (MDOC_Pa):
+ case (MDOC_Nm):
/* FALLTHROUGH */
- case (MDOC_Ar):
+ case (MDOC_Pa):
nc = 1;
break;
default:
diff --git a/usr.bin/mandoc/mdoc_term.c b/usr.bin/mandoc/mdoc_term.c
index a7b6ef2ac6a..5c66d393870 100644
--- a/usr.bin/mandoc/mdoc_term.c
+++ b/usr.bin/mandoc/mdoc_term.c
@@ -1,4 +1,4 @@
-/* $Id: mdoc_term.c,v 1.48 2009/08/09 21:38:25 schwarze Exp $ */
+/* $Id: mdoc_term.c,v 1.49 2009/08/09 21:59:41 schwarze Exp $ */
/*
* Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
*
@@ -97,6 +97,7 @@ struct termact {
static void termp____post(DECL_ARGS);
static void termp__t_post(DECL_ARGS);
+static void termp_an_post(DECL_ARGS);
static void termp_aq_post(DECL_ARGS);
static void termp_bd_post(DECL_ARGS);
static void termp_bl_post(DECL_ARGS);
@@ -123,6 +124,7 @@ static void termp_vt_post(DECL_ARGS);
static int termp__j_pre(DECL_ARGS);
static int termp__t_pre(DECL_ARGS);
+static int termp_an_pre(DECL_ARGS);
static int termp_ap_pre(DECL_ARGS);
static int termp_aq_pre(DECL_ARGS);
static int termp_ar_pre(DECL_ARGS);
@@ -190,7 +192,7 @@ static const struct termact termacts[MDOC_MAX] = {
{ NULL, NULL }, /* El */
{ termp_it_pre, termp_it_post }, /* It */
{ NULL, NULL }, /* Ad */
- { NULL, NULL }, /* An */
+ { termp_an_pre, termp_an_post }, /* An */
{ termp_ar_pre, NULL }, /* Ar */
{ termp_cd_pre, NULL }, /* Cd */
{ termp_cm_pre, NULL }, /* Cm */
@@ -1126,6 +1128,65 @@ termp_fl_pre(DECL_ARGS)
/* ARGSUSED */
static int
+termp_an_pre(DECL_ARGS)
+{
+
+ if (NULL == node->child)
+ return(1);
+
+ /*
+ * XXX: this is poorly documented. If not in the AUTHORS
+ * section, `An -split' will cause newlines to occur before the
+ * author name. If in the AUTHORS section, by default, the
+ * first `An' invocation is nosplit, then all subsequent ones,
+ * regardless of whether interspersed with other macros/text,
+ * are split. -split, in this case, will override the condition
+ * of the implied first -nosplit.
+ */
+
+ if (node->sec == SEC_AUTHORS) {
+ if ( ! (TERMP_ANPREC & p->flags)) {
+ if (TERMP_SPLIT & p->flags)
+ term_newln(p);
+ return(1);
+ }
+ if (TERMP_NOSPLIT & p->flags)
+ return(1);
+ term_newln(p);
+ return(1);
+ }
+
+ if (TERMP_SPLIT & p->flags)
+ term_newln(p);
+
+ return(1);
+}
+
+
+/* ARGSUSED */
+static void
+termp_an_post(DECL_ARGS)
+{
+
+ if (node->child) {
+ if (SEC_AUTHORS == node->sec)
+ p->flags |= TERMP_ANPREC;
+ return;
+ }
+
+ if (arg_getattr(MDOC_Split, node) > -1) {
+ p->flags &= ~TERMP_NOSPLIT;
+ p->flags |= TERMP_SPLIT;
+ } else {
+ p->flags &= ~TERMP_SPLIT;
+ p->flags |= TERMP_NOSPLIT;
+ }
+
+}
+
+
+/* ARGSUSED */
+static int
termp_ar_pre(DECL_ARGS)
{
diff --git a/usr.bin/mandoc/term.h b/usr.bin/mandoc/term.h
index cd2ada20ec1..9812ed1b383 100644
--- a/usr.bin/mandoc/term.h
+++ b/usr.bin/mandoc/term.h
@@ -1,4 +1,4 @@
-/* $Id: term.h,v 1.6 2009/08/09 18:43:29 schwarze Exp $ */
+/* $Id: term.h,v 1.7 2009/08/09 21:59:41 schwarze Exp $ */
/*
* Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
*
@@ -48,6 +48,9 @@ struct termp {
#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(). */
char *buf; /* Output buffer. */
enum termenc enc; /* Type of encoding. */
void *symtab; /* Encoded-symbol table. */