From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from krisdoz.my.domain (schwarze@localhost [127.0.0.1]) by krisdoz.my.domain (8.14.5/8.14.5) with ESMTP id s8BNrVYM031329 for ; Thu, 11 Sep 2014 19:53:31 -0400 (EDT) Received: (from schwarze@localhost) by krisdoz.my.domain (8.14.5/8.14.3/Submit) id s8BNrU5Q000464; Thu, 11 Sep 2014 19:53:30 -0400 (EDT) Date: Thu, 11 Sep 2014 19:53:30 -0400 (EDT) Message-Id: <201409112353.s8BNrU5Q000464@krisdoz.my.domain> X-Mailinglist: mdocml-source Reply-To: source@mdocml.bsd.lv MIME-Version: 1.0 From: schwarze@mdocml.bsd.lv To: source@mdocml.bsd.lv Subject: mdocml: warn about botched .Xr ordering and punctuation below SEE ALSO; X-Mailer: activitymail 1.26, http://search.cpan.org/dist/activitymail/ Content-Type: text/plain; charset=utf-8 Log Message: ----------- warn about botched .Xr ordering and punctuation below SEE ALSO; inspired by mdoclint(1) Modified Files: -------------- mdocml: mandoc.h mdoc_validate.c read.c Revision Data ------------- Index: mdoc_validate.c =================================================================== RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/mdoc_validate.c,v retrieving revision 1.247 retrieving revision 1.248 diff -Lmdoc_validate.c -Lmdoc_validate.c -u -p -r1.247 -r1.248 --- mdoc_validate.c +++ mdoc_validate.c @@ -117,6 +117,7 @@ static int post_rs(POST_ARGS); static int post_sh(POST_ARGS); static int post_sh_head(POST_ARGS); static int post_sh_name(POST_ARGS); +static int post_sh_see_also(POST_ARGS); static int post_sh_authors(POST_ARGS); static int post_st(POST_ARGS); static int post_vt(POST_ARGS); @@ -1856,6 +1857,8 @@ post_sh(POST_ARGS) switch (mdoc->lastsec) { case SEC_NAME: return(post_sh_name(mdoc)); + case SEC_SEE_ALSO: + return(post_sh_see_also(mdoc)); case SEC_AUTHORS: return(post_sh_authors(mdoc)); default: @@ -1901,6 +1904,68 @@ post_sh_name(POST_ARGS) mandoc_msg(MANDOCERR_NAMESEC_BAD, mdoc->parse, n->line, n->pos, mdoc_macronames[n->tok]); + return(1); +} + +static int +post_sh_see_also(POST_ARGS) +{ + const struct mdoc_node *n; + const char *name, *sec; + const char *lastname, *lastsec, *lastpunct; + int cmp; + + n = mdoc->last->child; + lastname = lastsec = lastpunct = NULL; + while (n != NULL) { + if (n->tok != MDOC_Xr || n->nchild < 2) + break; + + /* Process one .Xr node. */ + + name = n->child->string; + sec = n->child->next->string; + if (lastsec != NULL) { + if (lastpunct[0] != ',' || lastpunct[1] != '\0') + mandoc_vmsg(MANDOCERR_XR_PUNCT, + mdoc->parse, n->line, n->pos, + "%s before %s(%s)", lastpunct, + name, sec); + cmp = strcmp(lastsec, sec); + if (cmp > 0) + mandoc_vmsg(MANDOCERR_XR_ORDER, + mdoc->parse, n->line, n->pos, + "%s(%s) after %s(%s)", name, + sec, lastname, lastsec); + else if (cmp == 0 && strcmp(lastname, name) > 0) + mandoc_vmsg(MANDOCERR_XR_ORDER, + mdoc->parse, n->line, n->pos, + "%s after %s", name, lastname); + } + lastname = name; + lastsec = sec; + + /* Process the following node. */ + + n = n->next; + if (n == NULL) + break; + if (n->tok == MDOC_Xr) { + lastpunct = "none"; + continue; + } + if (n->type != MDOC_TEXT) + break; + for (name = n->string; *name != '\0'; name++) + if (isalpha((const unsigned char)*name)) + return(1); + lastpunct = n->string; + if (n->next == NULL) + mandoc_vmsg(MANDOCERR_XR_PUNCT, mdoc->parse, + n->line, n->pos, "%s after %s(%s)", + lastpunct, lastname, lastsec); + n = n->next; + } return(1); } Index: mandoc.h =================================================================== RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/mandoc.h,v retrieving revision 1.154 retrieving revision 1.155 diff -Lmandoc.h -Lmandoc.h -u -p -r1.154 -r1.155 --- mandoc.h +++ mandoc.h @@ -72,6 +72,8 @@ enum mandocerr { MANDOCERR_SEC_ORDER, /* sections out of conventional order: Sh title */ MANDOCERR_SEC_REP, /* duplicate section title: Sh title */ MANDOCERR_SEC_MSEC, /* unexpected section: Sh title for ... only */ + MANDOCERR_XR_ORDER, /* unusual Xr order: ... after ... */ + MANDOCERR_XR_PUNCT, /* unusual Xr punctuation: ... after ... */ MANDOCERR_AN_MISSING, /* AUTHORS section without An macro */ /* related to macros and nesting */ Index: read.c =================================================================== RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/read.c,v retrieving revision 1.86 retrieving revision 1.87 diff -Lread.c -Lread.c -u -p -r1.86 -r1.87 --- read.c +++ read.c @@ -117,6 +117,8 @@ static const char * const mandocerrs[MAN "sections out of conventional order", "duplicate section title", "unexpected section", + "unusual Xr order", + "unusual Xr punctuation", "AUTHORS section without An macro", /* related to macros and nesting */ -- To unsubscribe send an email to source+unsubscribe@mdocml.bsd.lv