]> git.cameronkatri.com Git - mandoc.git/commitdiff
Open explicit scope on libman exit now only generates warning.
authorKristaps Dzonsons <kristaps@bsd.lv>
Fri, 21 Aug 2009 12:12:12 +0000 (12:12 +0000)
committerKristaps Dzonsons <kristaps@bsd.lv>
Fri, 21 Aug 2009 12:12:12 +0000 (12:12 +0000)
Consecutive ELINE scopes are now pruned (with a warning).

man.7
man.c
man_macro.c
man_validate.c

diff --git a/man.7 b/man.7
index bec44daf4c5b1fb1092db5ca7d0134cf2c4ffd69..3b4751fe0b30c96786888265985ba7dd5e8f4e4b 100644 (file)
--- a/man.7
+++ b/man.7
@@ -1,4 +1,4 @@
-.\"    $Id: man.7,v 1.34 2009/08/20 13:51:55 kristaps Exp $
+.\"    $Id: man.7,v 1.35 2009/08/21 12:12:12 kristaps Exp $
 .\"
 .\" Copyright (c) 2009 Kristaps Dzonsons <kristaps@kth.se>
 .\"
 .\"
 .\" Copyright (c) 2009 Kristaps Dzonsons <kristaps@kth.se>
 .\"
@@ -14,7 +14,7 @@
 .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 .\"
 .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 .\"
-.Dd $Mdocdate: August 20 2009 $
+.Dd $Mdocdate: August 21 2009 $
 .Dt MAN 7
 .Os
 .
 .Dt MAN 7
 .Os
 .
@@ -205,18 +205,14 @@ foo
 .Pp
 is equivalent to
 .Sq \&.I foo .
 .Pp
 is equivalent to
 .Sq \&.I foo .
-.\" PARAGRAPH
-Consecutive next-line scope invocations are disallowed.
+If next-line macros are invoked consecutively, only the last is used.
+If a next-line macro is proceded by a block macro, it is ignored.
 .Bd -literal -offset indent
 \&.YO \(lBbody...\(rB
 \(lBbody...\(rB
 .Ed
 .
 .Pp
 .Bd -literal -offset indent
 \&.YO \(lBbody...\(rB
 \(lBbody...\(rB
 .Ed
 .
 .Pp
-It is considered an error when next-line scope is open at the end of
-file.
-.
-.Pp
 .Bl -column -compact -offset indent "MacroX" "ArgumentsX" "ScopeXXXXX"
 .It Em Macro Ta Em Arguments Ta Em Scope
 .It    B     Ta    n         Ta    next-line
 .Bl -column -compact -offset indent "MacroX" "ArgumentsX" "ScopeXXXXX"
 .It Em Macro Ta Em Arguments Ta Em Scope
 .It    B     Ta    n         Ta    next-line
@@ -288,10 +284,6 @@ or
 No closure refers to an explicit block closing macro.
 .
 .Pp
 No closure refers to an explicit block closing macro.
 .
 .Pp
-It is considered an error when part or next-line scope is open at the
-end of file.
-.
-.Pp
 .Bl -column "MacroX" "ArgumentsX" "Head ScopeX" "sub-sectionX" -compact -offset indent
 .It Em Macro Ta Em Arguments Ta Em Head Scope Ta Em Body Scope
 .It   HP     Ta    <2        Ta    current    Ta    paragraph
 .Bl -column "MacroX" "ArgumentsX" "Head ScopeX" "sub-sectionX" -compact -offset indent
 .It Em Macro Ta Em Arguments Ta Em Head Scope Ta Em Body Scope
 .It   HP     Ta    <2        Ta    current    Ta    paragraph
diff --git a/man.c b/man.c
index 6cac5884c9a22e6d0422f0460cd8c3a7aef3d631..f1c461e670360c83e21b2a0902884e695e2e60fe 100644 (file)
--- a/man.c
+++ b/man.c
@@ -1,4 +1,4 @@
-/*     $Id: man.c,v 1.33 2009/08/20 11:51:07 kristaps Exp $ */
+/*     $Id: man.c,v 1.34 2009/08/21 12:12:12 kristaps Exp $ */
 /*
  * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
  *
 /*
  * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
  *
@@ -454,8 +454,9 @@ descope:
 int
 man_pmacro(struct man *m, int ln, char *buf)
 {
 int
 man_pmacro(struct man *m, int ln, char *buf)
 {
-       int               i, j, c, ppos, fl;
-       char              mac[5];
+       int              i, j, c, ppos, fl;
+       char             mac[5];
+       struct man_node *n;
 
        /* Comments and empties are quickly ignored. */
 
 
        /* Comments and empties are quickly ignored. */
 
@@ -512,6 +513,29 @@ man_pmacro(struct man *m, int ln, char *buf)
        while (buf[i] && ' ' == buf[i])
                i++;
 
        while (buf[i] && ' ' == buf[i])
                i++;
 
+       /* Remove prior ELINE macro, if applicable. */
+
+       if (m->flags & MAN_ELINE) {
+               n = m->last;
+               assert(NULL == n->child);
+               if ( ! man_nwarn(m, n, WLNSCOPE))
+                       return(0);
+
+               if (n->prev) {
+                       assert(n != n->parent->child);
+                       assert(n == n->prev->next);
+                       n->prev->next = NULL;
+                       m->last = n->prev;
+               } else {
+                       assert(n == n->parent->child);
+                       n->parent->child = NULL;
+                       m->last = n->parent;
+               }
+
+               man_node_free(n);
+               m->flags &= ~MAN_ELINE;
+       }
+
        /* Begin recursive parse sequence. */
 
        assert(man_macros[c].fp);
        /* Begin recursive parse sequence. */
 
        assert(man_macros[c].fp);
@@ -533,8 +557,6 @@ out:
 
        /* Close out the block scope opened in the prior line.  */
 
 
        /* Close out the block scope opened in the prior line.  */
 
-       /* XXX - this should be in man_action.c. */
-
        assert(MAN_BLINE & m->flags);
        m->flags &= ~MAN_BLINE;
 
        assert(MAN_BLINE & m->flags);
        m->flags &= ~MAN_BLINE;
 
index 0622d255de65020794976fa8725c63238a7c1877..867e3e700fe59a376c00336f737e5b530f5c20a1 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: man_macro.c,v 1.25 2009/08/20 13:55:19 kristaps Exp $ */
+/*     $Id: man_macro.c,v 1.26 2009/08/21 12:12:12 kristaps Exp $ */
 /*
  * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
  *
 /*
  * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
  *
@@ -357,7 +357,8 @@ man_macroend(struct man *m)
                        continue;
                if ( ! (MAN_EXPLICIT & man_macros[n->tok].flags))
                        continue;
                        continue;
                if ( ! (MAN_EXPLICIT & man_macros[n->tok].flags))
                        continue;
-               return(man_nerr(m, n, WEXITSCOPE));
+               if ( ! man_nwarn(m, n, WEXITSCOPE))
+                       return(0);
        }
 
        return(man_unscope(m, m->first));
        }
 
        return(man_unscope(m, m->first));
index fa847caebdb1621ea8660b73973c653031c8f0f3..d85687623c4eacdb403c970263e2c11176956934 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: man_validate.c,v 1.21 2009/08/20 11:51:07 kristaps Exp $ */
+/*     $Id: man_validate.c,v 1.22 2009/08/21 12:12:12 kristaps Exp $ */
 /*
  * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
  *
 /*
  * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
  *
@@ -36,7 +36,6 @@ struct        man_valid {
 };
 
 static int       check_bline(CHKARGS);
 };
 
 static int       check_bline(CHKARGS);
-static int       check_eline(CHKARGS);
 static int       check_eq0(CHKARGS);
 static int       check_eq1(CHKARGS);
 static int       check_ge2(CHKARGS);
 static int       check_eq0(CHKARGS);
 static int       check_eq1(CHKARGS);
 static int       check_ge2(CHKARGS);
@@ -52,7 +51,6 @@ static        v_check   posts_ge2_le5[] = { check_ge2, check_le5, NULL };
 static v_check   posts_par[] = { check_par, NULL };
 static v_check   posts_sec[] = { check_sec, NULL };
 static v_check   posts_sp[] = { check_sp, NULL };
 static v_check   posts_par[] = { check_par, NULL };
 static v_check   posts_sec[] = { check_sec, NULL };
 static v_check   posts_sp[] = { check_sp, NULL };
-static v_check   pres_eline[] = { check_eline, NULL };
 static v_check   pres_bline[] = { check_bline, NULL };
 
 static const struct man_valid man_valids[MAN_MAX] = {
 static v_check   pres_bline[] = { check_bline, NULL };
 
 static const struct man_valid man_valids[MAN_MAX] = {
@@ -66,15 +64,15 @@ static      const struct man_valid man_valids[MAN_MAX] = {
        { pres_bline, posts_par }, /* P */
        { pres_bline, posts_par }, /* IP */
        { pres_bline, posts_par }, /* HP */
        { pres_bline, posts_par }, /* P */
        { pres_bline, posts_par }, /* IP */
        { pres_bline, posts_par }, /* HP */
-       { pres_eline, NULL }, /* SM */
-       { pres_eline, NULL }, /* SB */
+       { NULL, NULL }, /* SM */
+       { NULL, NULL }, /* SB */
        { NULL, NULL }, /* BI */
        { NULL, NULL }, /* IB */
        { NULL, NULL }, /* BR */
        { NULL, NULL }, /* RB */
        { NULL, NULL }, /* BI */
        { NULL, NULL }, /* IB */
        { NULL, NULL }, /* BR */
        { NULL, NULL }, /* RB */
-       { pres_eline, NULL }, /* R */
-       { pres_eline, NULL }, /* B */
-       { pres_eline, NULL }, /* I */
+       { NULL, NULL }, /* R */
+       { NULL, NULL }, /* B */
+       { NULL, NULL }, /* I */
        { NULL, NULL }, /* IR */
        { NULL, NULL }, /* RI */
        { pres_bline, posts_eq0 }, /* na */
        { NULL, NULL }, /* IR */
        { NULL, NULL }, /* RI */
        { pres_bline, posts_eq0 }, /* na */
@@ -140,12 +138,13 @@ static int
 check_root(CHKARGS) 
 {
 
 check_root(CHKARGS) 
 {
 
-       /* XXX - make this into a warning? */
        if (MAN_BLINE & m->flags)
        if (MAN_BLINE & m->flags)
-               return(man_nerr(m, n, WEXITSCOPE));
-       /* XXX - make this into a warning? */
+               return(man_nwarn(m, n, WEXITSCOPE));
        if (MAN_ELINE & m->flags)
        if (MAN_ELINE & m->flags)
-               return(man_nerr(m, n, WEXITSCOPE));
+               return(man_nwarn(m, n, WEXITSCOPE));
+
+       m->flags &= ~MAN_BLINE;
+       m->flags &= ~MAN_ELINE;
 
        if (NULL == m->first->child)
                return(man_nerr(m, n, WNODATA));
 
        if (NULL == m->first->child)
                return(man_nerr(m, n, WNODATA));
@@ -288,24 +287,13 @@ check_par(CHKARGS)
 }
 
 
 }
 
 
-static int
-check_eline(CHKARGS)
-{
-
-       if (MAN_ELINE & m->flags)
-               return(man_nerr(m, n, WLNSCOPE));
-       return(1);
-}
-
-
 static int
 check_bline(CHKARGS)
 {
 
 static int
 check_bline(CHKARGS)
 {
 
+       assert( ! (MAN_ELINE & m->flags));
        if (MAN_BLINE & m->flags)
                return(man_nerr(m, n, WLNSCOPE));
        if (MAN_BLINE & m->flags)
                return(man_nerr(m, n, WLNSCOPE));
-       if (MAN_ELINE & m->flags)
-               return(man_nerr(m, n, WLNSCOPE));
        return(1);
 }
 
        return(1);
 }