summaryrefslogtreecommitdiffstats
path: root/mdoc_macro.c
diff options
context:
space:
mode:
authorKristaps Dzonsons <kristaps@bsd.lv>2010-05-29 18:47:54 +0000
committerKristaps Dzonsons <kristaps@bsd.lv>2010-05-29 18:47:54 +0000
commit9556337196fc2bcc77b1327d58828a073ca49879 (patch)
tree137bbeeb6c506d7ff53fd9c4c8f6901e5e3c0cac /mdoc_macro.c
parentb3536e4d2b9fcb0daf7141c545883a7d2b442e33 (diff)
downloadmandoc-9556337196fc2bcc77b1327d58828a073ca49879.tar.gz
Commit of patch floated on discuss@ a few days ago: if an in_line scope
has not been opened and closing punctuation is encountered AND the macro is marked as accepting no-content (or `Li'), then open an empty scope. Added regression tests for `Fl' and `Li' testing this behaviour. Also, squeeze hyph0.in tests into the last characters of each line so that groff doesn't hyphenate and break the test.
Diffstat (limited to 'mdoc_macro.c')
-rw-r--r--mdoc_macro.c43
1 files changed, 32 insertions, 11 deletions
diff --git a/mdoc_macro.c b/mdoc_macro.c
index f091a015..bb89b25a 100644
--- a/mdoc_macro.c
+++ b/mdoc_macro.c
@@ -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);
/*