diff options
author | Kristaps Dzonsons <kristaps@bsd.lv> | 2010-11-29 16:06:46 +0000 |
---|---|---|
committer | Kristaps Dzonsons <kristaps@bsd.lv> | 2010-11-29 16:06:46 +0000 |
commit | a6ef6f0acbc127da168e4435d54d6adc1e29789f (patch) | |
tree | 67a006a8c32f796b9b38d8af215796430e56202c /mdoc_validate.c | |
parent | f723bb8c3ab45066352b08beae04fac690ddc6f3 (diff) | |
download | mandoc-a6ef6f0acbc127da168e4435d54d6adc1e29789f.tar.gz mandoc-a6ef6f0acbc127da168e4435d54d6adc1e29789f.tar.zst mandoc-a6ef6f0acbc127da168e4435d54d6adc1e29789f.zip |
Migrate `Nm' and `Pa' handling from mdoc_action.c into mdoc_validate.c.
Document that `Pa' is replaced by a tilde, just like `Mt'.
Diffstat (limited to 'mdoc_validate.c')
-rw-r--r-- | mdoc_validate.c | 45 |
1 files changed, 38 insertions, 7 deletions
diff --git a/mdoc_validate.c b/mdoc_validate.c index d2ef944a..be4d747c 100644 --- a/mdoc_validate.c +++ b/mdoc_validate.c @@ -1,4 +1,4 @@ -/* $Id: mdoc_validate.c,v 1.128 2010/11/29 15:45:15 kristaps Exp $ */ +/* $Id: mdoc_validate.c,v 1.129 2010/11/29 16:06:46 kristaps Exp $ */ /* * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv> * @@ -193,7 +193,7 @@ const struct valids mdoc_valids[MDOC_MAX] = { { NULL, posts_nm }, /* Nm */ { NULL, posts_wline }, /* Op */ { NULL, NULL }, /* Ot */ - { NULL, NULL }, /* Pa */ + { NULL, posts_defaults }, /* Pa */ { pres_rv, NULL }, /* Rv */ { NULL, posts_st }, /* St */ { NULL, NULL }, /* Va */ @@ -1154,12 +1154,41 @@ post_vt(POST_ARGS) static int post_nm(POST_ARGS) { + struct mdoc_node *nn; + char buf[BUFSIZ]; - if (mdoc->last->child) + /* If no child specified, make sure we have the meta name. */ + + if (NULL == mdoc->last->child && NULL == mdoc->meta.name) { + mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_NONAME); return(1); - if (mdoc->meta.name) + } else if (mdoc->meta.name) return(1); - return(mdoc_nmsg(mdoc, mdoc->last, MANDOCERR_NONAME)); + + /* If no meta name, set it from the child. */ + + buf[0] = '\0'; + + for (nn = mdoc->last->child; nn; nn = nn->next) { + /* XXX - copied from concat(). */ + assert(MDOC_TEXT == nn->type); + + if (strlcat(buf, nn->string, BUFSIZ) >= BUFSIZ) { + mdoc_nmsg(mdoc, nn, MANDOCERR_MEM); + return(0); + } + + if (NULL == nn->next) + continue; + + if (strlcat(buf, " ", BUFSIZ) >= BUFSIZ) { + mdoc_nmsg(mdoc, nn, MANDOCERR_MEM); + return(0); + } + } + + mdoc->meta.name = mandoc_strdup(buf); + return(1); } static int @@ -1186,8 +1215,8 @@ post_defaults(POST_ARGS) /* * The `Ar' defaults to "file ..." if no value is provided as an - * argument; the `Mt' macro uses "~"; the `Li' just gets an - * empty string. + * argument; the `Mt' and `Pa' macros use "~"; the `Li' just + * gets an empty string. */ if (mdoc->last->child) @@ -1213,6 +1242,8 @@ post_defaults(POST_ARGS) if ( ! mdoc_word_alloc(mdoc, nn->line, nn->pos, "")) return(0); break; + case (MDOC_Pa): + /* FALLTHROUGH */ case (MDOC_Mt): if ( ! mdoc_word_alloc(mdoc, nn->line, nn->pos, "~")) return(0); |