=================================================================== RCS file: /cvs/mandoc/Attic/mdoc_action.c,v retrieving revision 1.12 retrieving revision 1.18 diff -u -p -r1.12 -r1.18 --- mandoc/Attic/mdoc_action.c 2009/06/16 19:45:51 1.12 +++ mandoc/Attic/mdoc_action.c 2009/06/22 12:04:05 1.18 @@ -1,4 +1,4 @@ -/* $Id: mdoc_action.c,v 1.12 2009/06/16 19:45:51 kristaps Exp $ */ +/* $Id: mdoc_action.c,v 1.18 2009/06/22 12:04:05 kristaps Exp $ */ /* * Copyright (c) 2008, 2009 Kristaps Dzonsons * @@ -51,6 +51,7 @@ static int concat(struct mdoc *, const struct mdoc_n static int post_ar(POST_ARGS); static int post_bl(POST_ARGS); +static int post_bl_head(POST_ARGS); static int post_bl_width(POST_ARGS); static int post_bl_tagwidth(POST_ARGS); static int post_dd(POST_ARGS); @@ -515,8 +516,8 @@ post_os(POST_ARGS) if (NULL == (m->meta.os = strdup(buf))) return(verr(m, EMALLOC)); - m->lastnamed = m->lastsec = SEC_BODY; + m->flags |= MDOC_PBODY; return(post_prol(m)); } @@ -613,7 +614,7 @@ post_bl_width(struct mdoc *m) */ if (0 == strcmp(p, "Ds")) - width = 8; + width = 6; else if (MDOC_MAX == (tok = mdoc_hash_find(m->htab, p))) return(1); else if (0 == (width = mdoc_macro2len(tok))) @@ -634,10 +635,60 @@ post_bl_width(struct mdoc *m) static int +post_bl_head(POST_ARGS) +{ + int i, c; + struct mdoc_node *n, *nn, *nnp; + + if (NULL == m->last->child) + return(1); + + n = m->last->parent; + assert(n->args); + + for (c = 0; c < (int)n->args->argc; c++) + if (MDOC_Column == n->args->argv[c].arg) + break; + + /* Only process -column. */ + + if (c == (int)n->args->argc) + return(1); + + assert(0 == n->args->argv[c].sz); + + /* + * Accomodate for new-style groff column syntax. Shuffle the + * child nodes, all of which must be TEXT, as arguments for the + * column field. Then, delete the head children. + */ + + n->args->argv[c].sz = (size_t)m->last->nchild; + n->args->argv[c].value = malloc + ((size_t)m->last->nchild * sizeof(char *)); + + for (i = 0, nn = m->last->child; nn; i++) { + n->args->argv[c].value[i] = nn->string; + nn->string = NULL; + nnp = nn; + nn = nn->next; + mdoc_node_free(nnp); + } + + m->last->nchild = 0; + m->last->child = NULL; + + return(1); +} + + +static int post_bl(POST_ARGS) { int i, r, len; + if (MDOC_HEAD == m->last->type) + return(post_bl_head(m)); if (MDOC_BLOCK != m->last->type) return(1); @@ -768,9 +819,8 @@ static int pre_dl(PRE_ARGS) { - if (MDOC_BODY != n->type) - return(1); - m->flags |= MDOC_LITERAL; + if (MDOC_BODY == n->type) + m->flags |= MDOC_LITERAL; return(1); }