From 81280424219ca468fec2fafeedd0eaaf6938c2fc Mon Sep 17 00:00:00 2001 From: Kristaps Dzonsons Date: Mon, 29 Nov 2010 14:50:33 +0000 Subject: Move `At' handling from mdoc_action.c into mdoc_validate.c. --- mdoc_action.c | 44 +------------------------------------------- mdoc_validate.c | 40 +++++++++++++++++++++++++++++++++++----- 2 files changed, 36 insertions(+), 48 deletions(-) diff --git a/mdoc_action.c b/mdoc_action.c index 53333171..9ae5a9e9 100644 --- a/mdoc_action.c +++ b/mdoc_action.c @@ -51,7 +51,6 @@ struct actions { static int concat(struct mdoc *, char *, const struct mdoc_node *, size_t); -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); @@ -126,7 +125,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 */ @@ -386,47 +385,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); -} - - /* * Parse out the contents of `Dt'. See in-line documentation for how we * handle the various fields of this macro. diff --git a/mdoc_validate.c b/mdoc_validate.c index f5ed9987..21db9889 100644 --- a/mdoc_validate.c +++ b/mdoc_validate.c @@ -112,7 +112,7 @@ static int pre_sh(PRE_ARGS); static int pre_ss(PRE_ARGS); static v_post posts_an[] = { post_an, NULL }; -static v_post posts_at[] = { post_at, NULL }; +static v_post posts_at[] = { post_at, post_defaults, NULL }; static v_post posts_bd_bk[] = { hwarn_eq0, bwarn_ge1, NULL }; static v_post posts_bf[] = { hwarn_le1, post_bf, NULL }; static v_post posts_bl[] = { bwarn_ge1, post_bl, NULL }; @@ -1159,6 +1159,12 @@ post_defaults(POST_ARGS) if ( ! mdoc_word_alloc(mdoc, nn->line, nn->pos, "...")) return(0); break; + case (MDOC_At): + if ( ! mdoc_word_alloc(mdoc, nn->line, nn->pos, "AT&T")) + return(0); + if ( ! mdoc_word_alloc(mdoc, nn->line, nn->pos, "UNIX")) + return(0); + break; case (MDOC_Li): if ( ! mdoc_word_alloc(mdoc, nn->line, nn->pos, "")) return(0); @@ -1179,15 +1185,39 @@ post_defaults(POST_ARGS) static int post_at(POST_ARGS) { + const char *p, *q; + char *buf; + size_t sz; + /* + * If we have a child, look it up in the standard keys. If a + * key exist, use that instead of the child; if it doesn't, + * prefix "AT&T UNIX " to the existing data. + */ + if (NULL == mdoc->last->child) return(1); + assert(MDOC_TEXT == mdoc->last->child->type); - if (mdoc_a2att(mdoc->last->child->string)) - return(1); - return(mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_BADATT)); -} + p = mdoc_a2att(mdoc->last->child->string); + + if (p) { + free(mdoc->last->child->string); + mdoc->last->child->string = mandoc_strdup(p); + } else { + mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_BADATT); + p = "AT&T UNIX "; + q = mdoc->last->child->string; + sz = strlen(p) + strlen(q) + 1; + buf = mandoc_malloc(sz); + strlcpy(buf, p, sz); + strlcat(buf, q, sz); + free(mdoc->last->child->string); + mdoc->last->child->string = buf; + } + return(1); +} static int post_an(POST_ARGS) -- cgit