aboutsummaryrefslogtreecommitdiffstatshomepage
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
commit363897ee9adeffb350f656dffa050237faf305a3 (patch)
treef5c1889eaa821a973c93a8ae248a6d682fb24899 /mdoc_macro.c
parentd43a3b25e58b22f878cf000f42454792b509cd9d (diff)
downloadmandoc-363897ee9adeffb350f656dffa050237faf305a3.tar.gz
mandoc-363897ee9adeffb350f656dffa050237faf305a3.tar.zst
mandoc-363897ee9adeffb350f656dffa050237faf305a3.zip
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.c45
1 files changed, 33 insertions, 12 deletions
diff --git a/mdoc_macro.c b/mdoc_macro.c
index 274103fd..a19bdd32 100644
--- a/mdoc_macro.c
+++ b/mdoc_macro.c
@@ -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 <kristaps@kth.se>
*
@@ -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);
/*