summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
a738248)
Consecutive ELINE scopes are now pruned (with a warning).
-.\" $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>
.\"
.\" 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 $
.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
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
-/* $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>
*
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. */
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);
/* 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;
-/* $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>
*
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));
-/* $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>
*
};
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);
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] = {
{ 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 */
- /* 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));
-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));