=================================================================== RCS file: /cvs/mandoc/mdoc_macro.c,v retrieving revision 1.69 retrieving revision 1.70 diff -u -p -r1.69 -r1.70 --- mandoc/mdoc_macro.c 2010/05/26 09:35:35 1.69 +++ mandoc/mdoc_macro.c 2010/05/29 18:47:54 1.70 @@ -1,4 +1,4 @@ -/* $Id: mdoc_macro.c,v 1.69 2010/05/26 09:35:35 kristaps Exp $ */ +/* $Id: mdoc_macro.c,v 1.70 2010/05/29 18:47:54 kristaps Exp $ */ /* * Copyright (c) 2008, 2009 Kristaps Dzonsons * @@ -754,7 +754,7 @@ blk_exp_close(MACRO_PROT_ARGS) static int in_line(MACRO_PROT_ARGS) { - int la, lastpunct, cnt, nc, nl; + int la, scope, cnt, nc, nl; enum margverr av; enum mdoct ntok; enum margserr ac; @@ -805,7 +805,7 @@ in_line(MACRO_PROT_ARGS) return(0); } - for (cnt = 0, lastpunct = 1;; ) { + for (cnt = scope = 0;; ) { la = *pos; ac = mdoc_args(m, line, pos, buf, tok, &p); @@ -826,7 +826,7 @@ in_line(MACRO_PROT_ARGS) */ if (MDOC_MAX != ntok) { - if (0 == lastpunct && ! rew_elem(m, tok)) + if (scope && ! rew_elem(m, tok)) return(0); if (nc && 0 == cnt) { if ( ! mdoc_elem_alloc(m, line, ppos, tok, arg)) @@ -853,14 +853,35 @@ in_line(MACRO_PROT_ARGS) d = ARGS_QWORD == ac ? DELIM_NONE : mdoc_isdelim(p); - if (ARGS_QWORD != ac && DELIM_NONE != d) { - if (0 == lastpunct && ! rew_elem(m, tok)) + if (DELIM_NONE != d) { + /* + * If we encounter closing punctuation, no word + * has been omitted, no scope is open, and we're + * allowed to have an empty element, then start + * a new scope. `Ar', `Fl', and `Li', only do + * this once per invocation. There may be more + * of these (all of them?). + */ + if (0 == cnt && (nc || MDOC_Li == tok) && + DELIM_CLOSE == d && ! scope) { + if ( ! mdoc_elem_alloc(m, line, ppos, tok, arg)) + return(0); + if (MDOC_Ar == tok || MDOC_Li == tok || + MDOC_Fl == tok) + cnt++; + scope = 1; + } + /* + * Close out our scope, if one is open, before + * any punctuation. + */ + if (scope && ! rew_elem(m, tok)) return(0); - lastpunct = 1; - } else if (lastpunct) { + scope = 0; + } else if ( ! scope) { if ( ! mdoc_elem_alloc(m, line, ppos, tok, arg)) return(0); - lastpunct = 0; + scope = 1; } if (DELIM_NONE == d) @@ -873,14 +894,14 @@ in_line(MACRO_PROT_ARGS) * word so that the `-' can be added to each one without * having to parse out spaces. */ - if (0 == lastpunct && MDOC_Fl == tok) { + if (scope && MDOC_Fl == tok) { if ( ! rew_elem(m, tok)) return(0); - lastpunct = 1; + scope = 0; } } - if (0 == lastpunct && ! rew_elem(m, tok)) + if (scope && ! rew_elem(m, tok)) return(0); /*