diff options
Diffstat (limited to 'usr.bin/mandoc')
-rw-r--r-- | usr.bin/mandoc/mdoc.7 | 12 | ||||
-rw-r--r-- | usr.bin/mandoc/mdoc_macro.c | 10 | ||||
-rw-r--r-- | usr.bin/mandoc/mdoc_term.c | 65 | ||||
-rw-r--r-- | usr.bin/mandoc/term.h | 5 |
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. */ |