summaryrefslogtreecommitdiffstats
path: root/mdoc_macro.c
diff options
context:
space:
mode:
authorKristaps Dzonsons <kristaps@bsd.lv>2010-03-30 08:24:01 +0000
committerKristaps Dzonsons <kristaps@bsd.lv>2010-03-30 08:24:01 +0000
commitcdce82be1753e738186e0b27a8ad7b9cf9c2412c (patch)
tree9a22ba6c080c42deecad5a772e67adcba75114f8 /mdoc_macro.c
parentc270a3e5debc9428c1ee317603730c73802d0a77 (diff)
downloadmandoc-cdce82be1753e738186e0b27a8ad7b9cf9c2412c.tar.gz
Modified in_line_eoln() to handle leading punctuation.VERSION.1.9.20
Diffstat (limited to 'mdoc_macro.c')
-rw-r--r--mdoc_macro.c54
1 files changed, 33 insertions, 21 deletions
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);