=================================================================== RCS file: /cvs/mandoc/Attic/mdoc_action.c,v retrieving revision 1.74 retrieving revision 1.83 diff -u -p -r1.74 -r1.83 --- mandoc/Attic/mdoc_action.c 2010/07/01 22:56:17 1.74 +++ mandoc/Attic/mdoc_action.c 2010/11/29 14:56:43 1.83 @@ -1,6 +1,6 @@ -/* $Id: mdoc_action.c,v 1.74 2010/07/01 22:56:17 kristaps Exp $ */ +/* $Id: mdoc_action.c,v 1.83 2010/11/29 14:56:43 kristaps 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 @@ -50,10 +50,7 @@ struct actions { static int concat(struct mdoc *, char *, const struct mdoc_node *, size_t); -static inline int order_rs(enum mdoct); -static int post_ar(POST_ARGS); -static int post_at(POST_ARGS); static int post_bl(POST_ARGS); static int post_bl_head(POST_ARGS); static int post_bl_tagwidth(POST_ARGS); @@ -61,14 +58,10 @@ static int post_bl_width(POST_ARGS); static int post_dd(POST_ARGS); static int post_display(POST_ARGS); static int post_dt(POST_ARGS); -static int post_lb(POST_ARGS); -static int post_li(POST_ARGS); static int post_nm(POST_ARGS); static int post_os(POST_ARGS); static int post_pa(POST_ARGS); static int post_prol(POST_ARGS); -static int post_rs(POST_ARGS); -static int post_sh(POST_ARGS); static int post_st(POST_ARGS); static int post_std(POST_ARGS); @@ -80,7 +73,7 @@ static const struct actions mdoc_actions[MDOC_MAX] = { { NULL, post_dd }, /* Dd */ { NULL, post_dt }, /* Dt */ { NULL, post_os }, /* Os */ - { NULL, post_sh }, /* Sh */ + { NULL, NULL }, /* Sh */ { NULL, NULL }, /* Ss */ { NULL, NULL }, /* Pp */ { NULL, NULL }, /* D1 */ @@ -92,7 +85,7 @@ static const struct actions mdoc_actions[MDOC_MAX] = { { NULL, NULL }, /* It */ { NULL, NULL }, /* Ad */ { NULL, NULL }, /* An */ - { NULL, post_ar }, /* Ar */ + { NULL, NULL }, /* Ar */ { NULL, NULL }, /* Cd */ { NULL, NULL }, /* Cm */ { NULL, NULL }, /* Dv */ @@ -106,7 +99,7 @@ static const struct actions mdoc_actions[MDOC_MAX] = { { NULL, NULL }, /* Ft */ { NULL, NULL }, /* Ic */ { NULL, NULL }, /* In */ - { NULL, post_li }, /* Li */ + { NULL, NULL }, /* Li */ { NULL, NULL }, /* Nd */ { NULL, post_nm }, /* Nm */ { NULL, NULL }, /* Op */ @@ -131,7 +124,7 @@ static const struct actions mdoc_actions[MDOC_MAX] = { { NULL, NULL }, /* Ac */ { NULL, NULL }, /* Ao */ { NULL, NULL }, /* Aq */ - { NULL, post_at }, /* At */ + { NULL, NULL }, /* At */ { NULL, NULL }, /* Bc */ { NULL, NULL }, /* Bf */ { NULL, NULL }, /* Bo */ @@ -161,7 +154,7 @@ static const struct actions mdoc_actions[MDOC_MAX] = { { NULL, NULL }, /* Qo */ { NULL, NULL }, /* Qq */ { NULL, NULL }, /* Re */ - { NULL, post_rs }, /* Rs */ + { NULL, NULL }, /* Rs */ { NULL, NULL }, /* Sc */ { NULL, NULL }, /* So */ { NULL, NULL }, /* Sq */ @@ -182,7 +175,7 @@ static const struct actions mdoc_actions[MDOC_MAX] = { { NULL, NULL }, /* Hf */ { NULL, NULL }, /* Fr */ { NULL, NULL }, /* Ud */ - { NULL, post_lb }, /* Lb */ + { NULL, NULL }, /* Lb */ { NULL, NULL }, /* Lp */ { NULL, NULL }, /* Lk */ { NULL, NULL }, /* Mt */ @@ -337,40 +330,7 @@ post_nm(POST_ARGS) return(1); } - /* - * Look up the value of `Lb' for matching predefined strings. If it has - * one, then substitute the current value for the formatted value. Note - * that the lookup may fail (we can provide arbitrary strings). - */ -/* ARGSUSED */ -static int -post_lb(POST_ARGS) -{ - const char *p; - char *buf; - size_t sz; - - assert(MDOC_TEXT == n->child->type); - p = mdoc_a2lib(n->child->string); - - if (p) { - free(n->child->string); - n->child->string = mandoc_strdup(p); - return(1); - } - - sz = strlen(n->child->string) + - 2 + strlen("\\(lqlibrary\\(rq"); - buf = mandoc_malloc(sz); - snprintf(buf, sz, "library \\(lq%s\\(rq", n->child->string); - free(n->child->string); - n->child->string = buf; - return(1); -} - - -/* * Substitute the value of `St' for the corresponding formatted string. * We're guaranteed that this exists (it's been verified during the * validation phase). @@ -392,104 +352,6 @@ post_st(POST_ARGS) /* - * Look up the standard string in a table. We know that it exists from - * the validation phase, so assert on failure. If a standard key wasn't - * supplied, supply the default ``AT&T UNIX''. - */ -static int -post_at(POST_ARGS) -{ - struct mdoc_node *nn; - const char *p, *q; - char *buf; - size_t sz; - - if (n->child) { - assert(MDOC_TEXT == n->child->type); - p = mdoc_a2att(n->child->string); - if (p) { - free(n->child->string); - n->child->string = mandoc_strdup(p); - } else { - p = "AT&T UNIX "; - q = n->child->string; - sz = strlen(p) + strlen(q) + 1; - buf = mandoc_malloc(sz); - strlcpy(buf, p, sz); - strlcat(buf, q, sz); - free(n->child->string); - n->child->string = buf; - } - return(1); - } - - nn = n; - m->next = MDOC_NEXT_CHILD; - if ( ! mdoc_word_alloc(m, nn->line, nn->pos, "AT&T UNIX")) - return(0); - m->last = nn; - return(1); -} - - -/* - * Mark the current section. The ``named'' section (lastnamed) is set - * whenever the current section isn't a custom section--we use this to - * keep track of section ordering. Also check that the section is - * allowed within the document's manual section. - */ -static int -post_sh(POST_ARGS) -{ - enum mdoc_sec sec; - char buf[BUFSIZ]; - - if (MDOC_HEAD != n->type) - return(1); - - if ( ! concat(m, buf, n->child, BUFSIZ)) - return(0); - sec = mdoc_str2sec(buf); - /* - * The first section should always make us move into a non-new - * state. - */ - 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)) { - case (SEC_RETURN_VALUES): - /* FALLTHROUGH */ - case (SEC_ERRORS): - assert(m->meta.msec); - if (*m->meta.msec == '2') - break; - if (*m->meta.msec == '3') - break; - if (*m->meta.msec == '9') - break; - return(mdoc_nmsg(m, n, MANDOCERR_SECMSEC)); - default: - break; - } - return(1); -} - - -/* * Parse out the contents of `Dt'. See in-line documentation for how we * handle the various fields of this macro. */ @@ -660,6 +522,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; @@ -782,6 +651,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; @@ -849,51 +721,6 @@ post_pa(POST_ARGS) /* - * Empty `Li' macros get an empty string to make front-ends add an extra - * space. - */ -static int -post_li(POST_ARGS) -{ - struct mdoc_node *np; - - if (n->child) - return(1); - - np = n; - m->next = MDOC_NEXT_CHILD; - if ( ! mdoc_word_alloc(m, n->line, n->pos, "")) - return(0); - m->last = np; - return(1); -} - - -/* - * The `Ar' macro defaults to two strings "file ..." if no value is - * provided as an argument. - */ -static int -post_ar(POST_ARGS) -{ - struct mdoc_node *np; - - if (n->child) - return(1); - - np = n; - m->next = MDOC_NEXT_CHILD; - /* XXX: make into macro values. */ - if ( ! mdoc_word_alloc(m, n->line, n->pos, "file")) - return(0); - if ( ! mdoc_word_alloc(m, n->line, n->pos, "...")) - return(0); - m->last = np; - return(1); -} - - -/* * Parse the date field in `Dd'. */ static int @@ -901,6 +728,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); @@ -969,69 +801,5 @@ post_display(POST_ARGS) if (MDOC_BODY == n->type) m->flags &= ~MDOC_LITERAL; - return(1); -} - - -static inline int -order_rs(enum mdoct t) -{ - int i; - - for (i = 0; i < (int)RSORD_MAX; i++) - if (rsord[i] == t) - return(i); - - abort(); - /* NOTREACHED */ -} - - -/* ARGSUSED */ -static int -post_rs(POST_ARGS) -{ - struct mdoc_node *nn, *next, *prev; - int o; - - if (MDOC_BLOCK != n->type) - return(1); - - assert(n->body->child); - for (next = NULL, nn = n->body->child->next; nn; nn = next) { - o = order_rs(nn->tok); - - /* Remove `nn' from the chain. */ - next = nn->next; - if (next) - next->prev = nn->prev; - - prev = nn->prev; - if (prev) - prev->next = nn->next; - - nn->prev = nn->next = NULL; - - /* - * Scan back until we reach a node that's ordered before - * us, then set ourselves as being the next. - */ - for ( ; prev; prev = prev->prev) - if (order_rs(prev->tok) <= o) - break; - - nn->prev = prev; - if (prev) { - if (prev->next) - prev->next->prev = nn; - nn->next = prev->next; - prev->next = nn; - continue; - } - - n->body->child->prev = nn; - nn->next = n->body->child; - n->body->child = nn; - } return(1); }