=================================================================== RCS file: /cvs/mandoc/Attic/mdoc_action.c,v retrieving revision 1.70 retrieving revision 1.78 diff -u -p -r1.70 -r1.78 --- mandoc/Attic/mdoc_action.c 2010/06/13 21:02:48 1.70 +++ mandoc/Attic/mdoc_action.c 2010/07/30 17:14:09 1.78 @@ -1,6 +1,6 @@ -/* $Id: mdoc_action.c,v 1.70 2010/06/13 21:02:48 kristaps Exp $ */ +/* $Id: mdoc_action.c,v 1.78 2010/07/30 17:14:09 joerg Exp $ */ /* - * Copyright (c) 2008, 2009 Kristaps Dzonsons + * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -32,6 +32,11 @@ #include "libmdoc.h" #include "libmandoc.h" +/* + * FIXME: this file is deprecated. All future "actions" should be + * pushed into mdoc_validate.c. + */ + #define POST_ARGS struct mdoc *m, struct mdoc_node *n #define PRE_ARGS struct mdoc *m, struct mdoc_node *n @@ -452,6 +457,17 @@ post_sh(POST_ARGS) if (SEC_NONE == m->lastnamed || SEC_CUSTOM != sec) m->lastnamed = sec; + /* + * Switch the parser's SYNOPSIS mode, to be copied + * into individual nodes when creating them. + * Note that this mode can also be set and unset + * using the roff nS register. + */ + if (SEC_SYNOPSIS == sec) + m->flags |= MDOC_SYNOPSIS; + else + m->flags &= ~MDOC_SYNOPSIS; + /* Some sections only live in certain manual sections. */ switch ((m->lastsec = sec)) { @@ -644,6 +660,13 @@ post_bl_tagwidth(POST_ARGS) assert(MDOC_BLOCK == nn->type); nn = nn->head->child; + if (nn == NULL) { + /* No -width for .Bl and first .It is emtpy */ + if ( ! mdoc_nmsg(m, n, MANDOCERR_NOWIDTHARG)) + return(0); + break; + } + if (MDOC_TEXT == nn->type) { sz = strlen(nn->string) + 1; break; @@ -680,7 +703,7 @@ post_bl_tagwidth(POST_ARGS) n->args->argv[i].value[0] = mandoc_strdup(buf); /* Set our width! */ - n->data.Bl.width = n->args->argv[i].value[0]; + n->data.Bl->width = n->args->argv[i].value[0]; return(1); } @@ -703,9 +726,9 @@ post_bl_width(POST_ARGS) * the macro's width as set in share/tmac/mdoc/doc-common. */ - if (0 == strcmp(n->data.Bl.width, "Ds")) + if (0 == strcmp(n->data.Bl->width, "Ds")) width = 6; - else if (MDOC_MAX == (tok = mdoc_hash_find(n->data.Bl.width))) + else if (MDOC_MAX == (tok = mdoc_hash_find(n->data.Bl->width))) return(1); else if (0 == (width = mdoc_macro2len(tok))) return(mdoc_nmsg(m, n, MANDOCERR_BADWIDTH)); @@ -725,7 +748,7 @@ post_bl_width(POST_ARGS) n->args->argv[i].value[0] = mandoc_strdup(buf); /* Set our width! */ - n->data.Bl.width = n->args->argv[i].value[0]; + n->data.Bl->width = n->args->argv[i].value[0]; return(1); } @@ -741,7 +764,7 @@ post_bl_head(POST_ARGS) int i, c; struct mdoc_node *np, *nn, *nnp; - if (LIST_column != n->data.Bl.type) + if (LIST_column != n->data.Bl->type) return(1); else if (NULL == n->child) return(1); @@ -766,6 +789,9 @@ post_bl_head(POST_ARGS) np->args->argv[c].value = mandoc_malloc ((size_t)n->nchild * sizeof(char *)); + n->data.Bl->ncols = np->args->argv[c].sz; + n->data.Bl->cols = (const char **)np->args->argv[c].value; + for (i = 0, nn = n->child; nn; i++) { np->args->argv[c].value[i] = nn->string; nn->string = NULL; @@ -783,8 +809,6 @@ post_bl_head(POST_ARGS) static int post_bl(POST_ARGS) { - struct mdoc_node *nn; - const char *ww; if (MDOC_HEAD == n->type) return(post_bl_head(m, n)); @@ -799,28 +823,16 @@ post_bl(POST_ARGS) * rewritten into real lengths). */ - ww = n->data.Bl.width; - - if (LIST_tag == n->data.Bl.type && NULL == n->data.Bl.width) { + if (LIST_tag == n->data.Bl->type && NULL == n->data.Bl->width) { if ( ! post_bl_tagwidth(m, n)) return(0); - } else if (NULL != n->data.Bl.width) { + } else if (NULL != n->data.Bl->width) { if ( ! post_bl_width(m, n)) return(0); } else return(1); - assert(n->data.Bl.width); - - /* If it has changed, propogate new width to children. */ - - if (ww == n->data.Bl.width) - return(1); - - for (nn = n->child; nn; nn = nn->next) - if (MDOC_Bl == nn->tok) - nn->data.Bl.width = n->data.Bl.width; - + assert(n->data.Bl->width); return(1); } @@ -899,6 +911,11 @@ post_dd(POST_ARGS) { char buf[DATESIZ]; + if (NULL == n->child) { + m->meta.date = time(NULL); + return(post_prol(m, n)); + } + if ( ! concat(m, buf, n->child, DATESIZ)) return(0); @@ -951,9 +968,10 @@ pre_bd(PRE_ARGS) if (MDOC_BODY != n->type) return(1); - if (DISP_literal == n->data.Bd.type) + assert(n->data.Bd); + if (DISP_literal == n->data.Bd->type) m->flags |= MDOC_LITERAL; - if (DISP_unfilled == n->data.Bd.type) + if (DISP_unfilled == n->data.Bd->type) m->flags |= MDOC_LITERAL; return(1);