From cdce82be1753e738186e0b27a8ad7b9cf9c2412c Mon Sep 17 00:00:00 2001 From: Kristaps Dzonsons Date: Tue, 30 Mar 2010 08:24:01 +0000 Subject: Modified in_line_eoln() to handle leading punctuation. --- Makefile | 4 ++-- index.sgml | 10 +++++----- mdoc_macro.c | 54 +++++++++++++++++++++++++++++++++--------------------- 3 files changed, 40 insertions(+), 28 deletions(-) diff --git a/Makefile b/Makefile index 432c4f41..c1ce8c1c 100644 --- a/Makefile +++ b/Makefile @@ -10,8 +10,8 @@ INSTALL_DATA = install -m 0444 INSTALL_LIB = install -m 0644 INSTALL_MAN = $(INSTALL_DATA) -VERSION = 1.9.18 -VDATE = 27 March 2010 +VERSION = 1.9.20 +VDATE = 30 March 2010 VFLAGS = -DVERSION="\"$(VERSION)\"" -DHAVE_CONFIG_H WFLAGS = -W -Wall -Wstrict-prototypes -Wno-unused-parameter -Wwrite-strings diff --git a/index.sgml b/index.sgml index f319a4e3..e1b2377a 100644 --- a/index.sgml +++ b/index.sgml @@ -219,13 +219,13 @@ - 29-03-2010 + 30-03-2010 Version 1.9.20: more efforts to get roff instructions - in -man documents under control. This seems to be working for all manuals I can - find. Please let me know if you find ill-formatted -man manuals. Note that - roff instructions embedded in line-scoped, next-line macros (e.g. B) are - not supported. + in -man documents under control. Note that roff instructions embedded in + line-scoped, next-line macros (e.g. B) are not supported. Leading + punctuation for -mdoc macros, such as Fl ( ( a, are now correctly + handled. diff --git a/mdoc_macro.c b/mdoc_macro.c index eda9974a..d47bcc12 100644 --- a/mdoc_macro.c +++ b/mdoc_macro.c @@ -1209,7 +1209,13 @@ in_line_argn(MACRO_PROT_ARGS) struct mdoc_arg *arg; char *p; - /* Fixed maximum arguments per macro, if applicable. */ + /* + * A line macro that has a fixed number of arguments (maxargs). + * Only open the scope once the first non-leading-punctuation is + * found (unless MDOC_IGNDELIM is noted, like in `Pf'), then + * keep it open until the maximum number of arguments are + * exhausted. + */ switch (tok) { case (MDOC_Ap): @@ -1229,9 +1235,7 @@ in_line_argn(MACRO_PROT_ARGS) break; } - /* Macro argument processing. */ - - for (arg = NULL;; ) { + for (arg = NULL; ; ) { la = *pos; c = mdoc_argv(m, line, tok, &arg, pos, buf); @@ -1249,22 +1253,8 @@ in_line_argn(MACRO_PROT_ARGS) return(0); } - /* Open the element scope. */ - - if ( ! mdoc_elem_alloc(m, line, ppos, tok, arg)) - return(0); - - /* Process element arguments. */ - - for (flushed = j = 0; ; j++) { + for (flushed = j = 0; ; ) { la = *pos; - - if (j == maxargs && ! flushed) { - if ( ! rew_elem(m, tok)) - return(0); - flushed = 1; - } - c = mdoc_args(m, line, pos, buf, tok, &p); if (ARGS_ERROR == c) @@ -1274,12 +1264,28 @@ in_line_argn(MACRO_PROT_ARGS) if (ARGS_EOLN == c) break; + if ( ! (MDOC_IGNDELIM & mdoc_macros[tok].flags) && + 0 == j && 1 == mdoc_isdelim(p)) { + if ( ! mdoc_word_alloc(m, line, la, p)) + return(0); + continue; + } else if (0 == j) + if ( ! mdoc_elem_alloc(m, line, la, tok, arg)) + return(0); + + if (j == maxargs && ! flushed) { + if ( ! rew_elem(m, tok)) + return(0); + flushed = 1; + } + if (MDOC_MAX != (c = lookup(tok, p))) { if ( ! flushed && ! rew_elem(m, tok)) return(0); flushed = 1; if ( ! mdoc_macro(m, c, line, la, pos, buf)) return(0); + j++; break; } @@ -1297,18 +1303,24 @@ in_line_argn(MACRO_PROT_ARGS) * code is no here, it's unlikely to be removed. */ +#ifdef __OpenBSD__ if (MDOC_Xr == tok && j == maxargs) { - if ( ! mdoc_elem_alloc(m, line, ppos, MDOC_Ns, NULL)) + if ( ! mdoc_elem_alloc(m, line, la, MDOC_Ns, NULL)) return(0); if ( ! rew_elem(m, MDOC_Ns)) return(0); } +#endif if ( ! mdoc_word_alloc(m, line, la, p)) return(0); + j++; } - /* Close out and append delimiters. */ + if (0 == j && ! mdoc_elem_alloc(m, line, la, tok, arg)) + return(0); + + /* Close out in a consistent state. */ if ( ! flushed && ! rew_elem(m, tok)) return(0); -- cgit