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 s76F96Ph005215 for ; Wed, 6 Aug 2014 11:09:06 -0400 (EDT) Received: (from schwarze@localhost) by krisdoz.my.domain (8.14.5/8.14.3/Submit) id s76F95bL005506; Wed, 6 Aug 2014 11:09:05 -0400 (EDT) Date: Wed, 6 Aug 2014 11:09:05 -0400 (EDT) Message-Id: <201408061509.s76F95bL005506@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: Bring the handling of defective prologues even closer to groff, X-Mailer: activitymail 1.26, http://search.cpan.org/dist/activitymail/ Content-Type: text/plain; charset=utf-8 Log Message: ----------- Bring the handling of defective prologues even closer to groff, in particular relaxing the distinction between prologue and body and further improving messages. * The last .Dd wins and the last .Os wins, even in the body. * The last .Dt before the first body macro wins. * Missing title in .Dt defaults to UNTITLED. Warn about it. * Missing section in .Dt does not default to 1. But warn about it. * Do not warn multiple times about the same mdoc(7) prologue macro. * Warn about missing .Os. * Incomplete .TH defaults to empty strings. Warn about it. Modified Files: -------------- mdocml: man_validate.c mandoc.h mandocdb.c mdoc.c mdoc_html.c mdoc_man.c mdoc_term.c mdoc_validate.c read.c Revision Data ------------- Index: mdoc_man.c =================================================================== RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/mdoc_man.c,v retrieving revision 1.67 retrieving revision 1.68 diff -Lmdoc_man.c -Lmdoc_man.c -u -p -r1.67 -r1.68 --- mdoc_man.c +++ mdoc_man.c @@ -548,8 +548,9 @@ man_mdoc(void *arg, const struct mdoc *m n = mdoc_node(mdoc); printf(".TH \"%s\" \"%s\" \"%s\" \"%s\" \"%s\"\n", - meta->title, meta->msec, meta->date, - meta->os, meta->vol); + meta->title, + (meta->msec == NULL ? "" : meta->msec), + meta->date, meta->os, meta->vol); /* Disable hyphenation and if nroff, disable justification. */ printf(".nh\n.if n .ad l"); Index: mdoc_html.c =================================================================== RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/mdoc_html.c,v retrieving revision 1.194 retrieving revision 1.195 diff -Lmdoc_html.c -Lmdoc_html.c -u -p -r1.194 -r1.195 --- mdoc_html.c +++ mdoc_html.c @@ -380,8 +380,9 @@ print_mdoc_head(MDOC_ARGS) print_gen_head(h); bufinit(h); - bufcat_fmt(h, "%s(%s)", meta->title, meta->msec); - + bufcat(h, meta->title); + if (meta->msec) + bufcat_fmt(h, "(%s)", meta->msec); if (meta->arch) bufcat_fmt(h, " (%s)", meta->arch); @@ -525,7 +526,11 @@ mdoc_root_pre(MDOC_ARGS) mandoc_asprintf(&volume, "%s (%s)", meta->vol, meta->arch); - mandoc_asprintf(&title, "%s(%s)", meta->title, meta->msec); + if (NULL == meta->msec) + title = mandoc_strdup(meta->title); + else + mandoc_asprintf(&title, "%s(%s)", + meta->title, meta->msec); PAIR_SUMMARY_INIT(&tag[0], "Document Header"); PAIR_CLASS_INIT(&tag[1], "head"); Index: mdoc.c =================================================================== RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/mdoc.c,v retrieving revision 1.222 retrieving revision 1.223 diff -Lmdoc.c -Lmdoc.c -u -p -r1.222 -r1.223 --- mdoc.c +++ mdoc.c @@ -123,20 +123,13 @@ mdoc_free1(struct mdoc *mdoc) if (mdoc->first) mdoc_node_delete(mdoc, mdoc->first); - if (mdoc->meta.title) - free(mdoc->meta.title); - if (mdoc->meta.os) - free(mdoc->meta.os); - if (mdoc->meta.name) - free(mdoc->meta.name); - if (mdoc->meta.arch) - free(mdoc->meta.arch); - if (mdoc->meta.vol) - free(mdoc->meta.vol); - if (mdoc->meta.msec) - free(mdoc->meta.msec); - if (mdoc->meta.date) - free(mdoc->meta.date); + free(mdoc->meta.msec); + free(mdoc->meta.vol); + free(mdoc->meta.arch); + free(mdoc->meta.date); + free(mdoc->meta.title); + free(mdoc->meta.os); + free(mdoc->meta.name); } /* @@ -271,32 +264,22 @@ mdoc_macro(MACRO_PROT_ARGS) { assert(tok < MDOC_MAX); - /* If we're in the body, deny prologue calls. */ - - if (MDOC_PROLOGUE & mdoc_macros[tok].flags && - MDOC_PBODY & mdoc->flags) { - mandoc_vmsg(MANDOCERR_PROLOG_ONLY, mdoc->parse, - line, ppos, "%s", mdoc_macronames[tok]); - return(1); - } - - /* If we're in the prologue, deny "body" macros. */ - - if ( ! (MDOC_PROLOGUE & mdoc_macros[tok].flags) && - ! (MDOC_PBODY & mdoc->flags)) { - mandoc_vmsg(MANDOCERR_PROLOG_BAD, mdoc->parse, - line, ppos, "%s", mdoc_macronames[tok]); - if (NULL == mdoc->meta.msec) - mdoc->meta.msec = mandoc_strdup("1"); - if (NULL == mdoc->meta.title) - mdoc->meta.title = mandoc_strdup("UNKNOWN"); + if (mdoc->flags & MDOC_PBODY) { + if (tok == MDOC_Dt) { + mandoc_vmsg(MANDOCERR_DT_LATE, + mdoc->parse, line, ppos, + "Dt %s", buf + *pos); + return(1); + } + } else if ( ! (mdoc_macros[tok].flags & MDOC_PROLOGUE)) { + if (mdoc->meta.title == NULL) { + mandoc_vmsg(MANDOCERR_DT_NOTITLE, + mdoc->parse, line, ppos, "%s %s", + mdoc_macronames[tok], buf + *pos); + mdoc->meta.title = mandoc_strdup("UNTITLED"); + } if (NULL == mdoc->meta.vol) mdoc->meta.vol = mandoc_strdup("LOCAL"); - if (NULL == mdoc->meta.os) - mdoc->meta.os = mandoc_strdup("LOCAL"); - if (NULL == mdoc->meta.date) - mdoc->meta.date = mandoc_normdate - (mdoc->parse, NULL, line, ppos); mdoc->flags |= MDOC_PBODY; } Index: mandoc.h =================================================================== RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/mandoc.h,v retrieving revision 1.151 retrieving revision 1.152 diff -Lmandoc.h -Lmandoc.h -u -p -r1.151 -r1.152 --- mandoc.h +++ mandoc.h @@ -49,16 +49,19 @@ enum mandocerr { MANDOCERR_WARNING, /* ===== start of warnings ===== */ /* related to the prologue */ - MANDOCERR_TH_MISSING, /* missing .TH macro, using "unknown 1" */ + MANDOCERR_DT_NOTITLE, /* missing manual title, using UNTITLED: line */ + MANDOCERR_TH_NOTITLE, /* missing manual title, using "": [macro] */ MANDOCERR_TITLE_CASE, /* lower case character in document title */ + MANDOCERR_MSEC_MISSING, /* missing manual section, using "": macro */ MANDOCERR_MSEC_BAD, /* unknown manual section: Dt ... section */ MANDOCERR_ARCH_BAD, /* unknown manual volume or arch: Dt ... volume */ MANDOCERR_DATE_MISSING, /* missing date, using today's date */ MANDOCERR_DATE_BAD, /* cannot parse date, using it verbatim: date */ - MANDOCERR_PROLOG_ORDER, /* prologue macros out of order: macro */ + MANDOCERR_OS_MISSING, /* missing Os macro, using "" */ MANDOCERR_PROLOG_REP, /* duplicate prologue macro: macro */ - MANDOCERR_PROLOG_BAD, /* incomplete prologue, terminated by: macro */ - MANDOCERR_PROLOG_ONLY, /* skipping prologue macro in body: macro */ + MANDOCERR_PROLOG_LATE, /* late prologue macro: macro */ + MANDOCERR_DT_LATE, /* skipping late title macro: Dt args */ + MANDOCERR_PROLOG_ORDER, /* prologue macros out of order: macros */ /* related to document structure */ MANDOCERR_SO, /* .so is fragile, better use ln(1): so path */ Index: mdoc_validate.c =================================================================== RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/mdoc_validate.c,v retrieving revision 1.242 retrieving revision 1.243 diff -Lmdoc_validate.c -Lmdoc_validate.c -u -p -r1.242 -r1.243 --- mdoc_validate.c +++ mdoc_validate.c @@ -114,7 +114,6 @@ static int post_nm(POST_ARGS); static int post_ns(POST_ARGS); static int post_os(POST_ARGS); static int post_par(POST_ARGS); -static int post_prol(POST_ARGS); static int post_root(POST_ARGS); static int post_rs(POST_ARGS); static int post_sh(POST_ARGS); @@ -843,14 +842,12 @@ static int pre_dt(PRE_ARGS) { - if (NULL == mdoc->meta.date || mdoc->meta.os) - mandoc_msg(MANDOCERR_PROLOG_ORDER, mdoc->parse, - n->line, n->pos, "Dt"); - - if (mdoc->meta.title) + if (mdoc->meta.title != NULL) mandoc_msg(MANDOCERR_PROLOG_REP, mdoc->parse, n->line, n->pos, "Dt"); - + else if (mdoc->meta.os != NULL) + mandoc_msg(MANDOCERR_PROLOG_ORDER, mdoc->parse, + n->line, n->pos, "Dt after Os"); return(1); } @@ -858,14 +855,12 @@ static int pre_os(PRE_ARGS) { - if (NULL == mdoc->meta.title || NULL == mdoc->meta.date) - mandoc_msg(MANDOCERR_PROLOG_ORDER, mdoc->parse, - n->line, n->pos, "Os"); - - if (mdoc->meta.os) + if (mdoc->meta.os != NULL) mandoc_msg(MANDOCERR_PROLOG_REP, mdoc->parse, n->line, n->pos, "Os"); - + else if (mdoc->flags & MDOC_PBODY) + mandoc_msg(MANDOCERR_PROLOG_LATE, mdoc->parse, + n->line, n->pos, "Os"); return(1); } @@ -873,14 +868,18 @@ static int pre_dd(PRE_ARGS) { - if (mdoc->meta.title || mdoc->meta.os) - mandoc_msg(MANDOCERR_PROLOG_ORDER, mdoc->parse, - n->line, n->pos, "Dd"); - - if (mdoc->meta.date) + if (mdoc->meta.date != NULL) mandoc_msg(MANDOCERR_PROLOG_REP, mdoc->parse, n->line, n->pos, "Dd"); - + else if (mdoc->flags & MDOC_PBODY) + mandoc_msg(MANDOCERR_PROLOG_LATE, mdoc->parse, + n->line, n->pos, "Dd"); + else if (mdoc->meta.title != NULL) + mandoc_msg(MANDOCERR_PROLOG_ORDER, mdoc->parse, + n->line, n->pos, "Dd after Dt"); + else if (mdoc->meta.os != NULL) + mandoc_msg(MANDOCERR_PROLOG_ORDER, mdoc->parse, + n->line, n->pos, "Dd after Os"); return(1); } @@ -1627,20 +1626,24 @@ post_root(POST_ARGS) /* Add missing prologue data. */ - if ( ! (MDOC_PBODY & mdoc->flags)) { - mandoc_msg(MANDOCERR_PROLOG_BAD, mdoc->parse, 0, 0, "EOF"); - if (mdoc->meta.date == NULL) - mdoc->meta.date = mdoc->quick ? - mandoc_strdup("") : - mandoc_normdate(mdoc->parse, NULL, 0, 0); - if (mdoc->meta.title == NULL) - mdoc->meta.title = mandoc_strdup("UNKNOWN"); - if (mdoc->meta.vol == NULL) - mdoc->meta.vol = mandoc_strdup("LOCAL"); - if (mdoc->meta.arch == NULL) - mdoc->meta.msec = mandoc_strdup("1"); - if (mdoc->meta.os == NULL) - mdoc->meta.os = mandoc_strdup("UNKNOWN"); + if (mdoc->meta.date == NULL) + mdoc->meta.date = mdoc->quick ? + mandoc_strdup("") : + mandoc_normdate(mdoc->parse, NULL, 0, 0); + + if (mdoc->meta.title == NULL) { + mandoc_msg(MANDOCERR_DT_NOTITLE, + mdoc->parse, 0, 0, "EOF"); + mdoc->meta.title = mandoc_strdup("UNTITLED"); + } + + if (mdoc->meta.vol == NULL) + mdoc->meta.vol = mandoc_strdup("LOCAL"); + + if (mdoc->meta.os == NULL) { + mandoc_msg(MANDOCERR_OS_MISSING, + mdoc->parse, 0, 0, NULL); + mdoc->meta.os = mandoc_strdup(""); } n = mdoc->first; @@ -1977,7 +1980,10 @@ post_sh_head(POST_ARGS) /* Check particular section/manual conventions. */ - assert(mdoc->meta.msec); + if (mdoc->meta.msec == NULL) { + free(secname); + return(1); + } goodsec = NULL; switch (sec) { @@ -2156,7 +2162,7 @@ post_dd(POST_ARGS) if (NULL == n->child || '\0' == n->child->string[0]) { mdoc->meta.date = mdoc->quick ? mandoc_strdup("") : mandoc_normdate(mdoc->parse, NULL, n->line, n->pos); - return(post_prol(mdoc)); + goto out; } datestr = NULL; @@ -2168,7 +2174,9 @@ post_dd(POST_ARGS) datestr, n->line, n->pos); free(datestr); } - return(post_prol(mdoc)); +out: + mdoc_node_delete(mdoc, n); + return(1); } static int @@ -2180,14 +2188,15 @@ post_dt(POST_ARGS) n = mdoc->last; - if (mdoc->meta.title) - free(mdoc->meta.title); - if (mdoc->meta.vol) - free(mdoc->meta.vol); - if (mdoc->meta.arch) - free(mdoc->meta.arch); - - mdoc->meta.title = mdoc->meta.vol = mdoc->meta.arch = NULL; + free(mdoc->meta.title); + free(mdoc->meta.msec); + free(mdoc->meta.vol); + free(mdoc->meta.arch); + + mdoc->meta.title = NULL; + mdoc->meta.msec = NULL; + mdoc->meta.vol = NULL; + mdoc->meta.arch = NULL; /* First check that all characters are uppercase. */ @@ -2202,32 +2211,27 @@ post_dt(POST_ARGS) break; } - /* Handles: `.Dt' - * title = unknown, volume = local, msec = 0, arch = NULL - */ + /* No argument: msec and arch remain NULL. */ if (NULL == (nn = n->child)) { - /* XXX: make these macro values. */ - /* FIXME: warn about missing values. */ - mdoc->meta.title = mandoc_strdup("UNKNOWN"); + mandoc_msg(MANDOCERR_DT_NOTITLE, + mdoc->parse, n->line, n->pos, "Dt"); + mdoc->meta.title = mandoc_strdup("UNTITLED"); mdoc->meta.vol = mandoc_strdup("LOCAL"); - mdoc->meta.msec = mandoc_strdup("1"); - return(post_prol(mdoc)); + goto out; } - /* Handles: `.Dt TITLE' - * title = TITLE, volume = local, msec = 0, arch = NULL - */ + /* One argument: msec and arch remain NULL. */ mdoc->meta.title = mandoc_strdup( - '\0' == nn->string[0] ? "UNKNOWN" : nn->string); + '\0' == nn->string[0] ? "UNTITLED" : nn->string); if (NULL == (nn = nn->next)) { - /* FIXME: warn about missing msec. */ - /* XXX: make this a macro value. */ + mandoc_vmsg(MANDOCERR_MSEC_MISSING, + mdoc->parse, n->line, n->pos, + "Dt %s", mdoc->meta.title); mdoc->meta.vol = mandoc_strdup("LOCAL"); - mdoc->meta.msec = mandoc_strdup("1"); - return(post_prol(mdoc)); + goto out; } /* Handles: `.Dt TITLE SEC' @@ -2249,7 +2253,7 @@ post_dt(POST_ARGS) } if (NULL == (nn = nn->next)) - return(post_prol(mdoc)); + goto out; /* Handles: `.Dt TITLE SEC VOL' * title = TITLE, @@ -2275,23 +2279,8 @@ post_dt(POST_ARGS) /* Ignore any subsequent parameters... */ /* FIXME: warn about subsequent parameters. */ - - return(post_prol(mdoc)); -} - -static int -post_prol(POST_ARGS) -{ - /* - * Remove prologue macros from the document after they're - * processed. The final document uses mdoc_meta for these - * values and discards the originals. - */ - - mdoc_node_delete(mdoc, mdoc->last); - if (mdoc->meta.title && mdoc->meta.date && mdoc->meta.os) - mdoc->flags |= MDOC_PBODY; - +out: + mdoc_node_delete(mdoc, n); return(1); } @@ -2337,11 +2326,11 @@ post_os(POST_ARGS) mdoc->meta.os = NULL; mdoc_deroff(&mdoc->meta.os, n); if (mdoc->meta.os) - return(post_prol(mdoc)); + goto out; if (mdoc->defos) { mdoc->meta.os = mandoc_strdup(mdoc->defos); - return(post_prol(mdoc)); + goto out; } #ifdef OSNAME @@ -2358,7 +2347,10 @@ post_os(POST_ARGS) } mdoc->meta.os = mandoc_strdup(defbuf); #endif /*!OSNAME*/ - return(post_prol(mdoc)); + +out: + mdoc_node_delete(mdoc, n); + return(1); } /* Index: mandocdb.c =================================================================== RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/mandocdb.c,v retrieving revision 1.154 retrieving revision 1.155 diff -Lmandocdb.c -Lmandocdb.c -u -p -r1.154 -r1.155 --- mandocdb.c +++ mandocdb.c @@ -1198,8 +1198,9 @@ mpages_merge(struct mchars *mc, struct m goto nextpage; } else if (NULL != mdoc) { mpage->form = FORM_SRC; - mpage->sec = - mandoc_strdup(mdoc_meta(mdoc)->msec); + mpage->sec = mdoc_meta(mdoc)->msec; + mpage->sec = mandoc_strdup( + NULL == mpage->sec ? "" : mpage->sec); mpage->arch = mdoc_meta(mdoc)->arch; mpage->arch = mandoc_strdup( NULL == mpage->arch ? "" : mpage->arch); Index: mdoc_term.c =================================================================== RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/mdoc_term.c,v retrieving revision 1.274 retrieving revision 1.275 diff -Lmdoc_term.c -Lmdoc_term.c -u -p -r1.274 -r1.275 --- mdoc_term.c +++ mdoc_term.c @@ -476,7 +476,11 @@ print_mdoc_head(struct termp *p, const v meta->vol, meta->arch); vollen = term_strlen(p, volume); - mandoc_asprintf(&title, "%s(%s)", meta->title, meta->msec); + if (NULL == meta->msec) + title = mandoc_strdup(meta->title); + else + mandoc_asprintf(&title, "%s(%s)", + meta->title, meta->msec); titlen = term_strlen(p, title); p->flags |= TERMP_NOBREAK | TERMP_NOSPACE; Index: man_validate.c =================================================================== RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/man_validate.c,v retrieving revision 1.104 retrieving revision 1.105 diff -Lman_validate.c -Lman_validate.c -u -p -r1.104 -r1.105 --- man_validate.c +++ man_validate.c @@ -43,7 +43,6 @@ typedef int (*v_check)(CHKARGS); static int check_eq0(CHKARGS); static int check_eq2(CHKARGS); static int check_le1(CHKARGS); -static int check_ge2(CHKARGS); static int check_le5(CHKARGS); static int check_par(CHKARGS); static int check_part(CHKARGS); @@ -142,7 +141,7 @@ check_root(CHKARGS) man->meta.hasbody = 1; if (NULL == man->meta.title) { - mandoc_msg(MANDOCERR_TH_MISSING, man->parse, + mandoc_msg(MANDOCERR_TH_NOTITLE, man->parse, n->line, n->pos, NULL); /* @@ -150,8 +149,8 @@ check_root(CHKARGS) * implication, date and section also aren't set). */ - man->meta.title = mandoc_strdup("unknown"); - man->meta.msec = mandoc_strdup("1"); + man->meta.title = mandoc_strdup(""); + man->meta.msec = mandoc_strdup(""); man->meta.date = man->quick ? mandoc_strdup("") : mandoc_normdate(man->parse, NULL, n->line, n->pos); } @@ -189,7 +188,6 @@ check_##name(CHKARGS) \ INEQ_DEFINE(0, ==, eq0) INEQ_DEFINE(2, ==, eq2) INEQ_DEFINE(1, <=, le1) -INEQ_DEFINE(2, >=, ge2) INEQ_DEFINE(5, <=, le5) static int @@ -324,7 +322,6 @@ post_TH(CHKARGS) struct man_node *nb; const char *p; - check_ge2(man, n); check_le5(man, n); free(man->meta.title); @@ -354,8 +351,11 @@ post_TH(CHKARGS) } } man->meta.title = mandoc_strdup(n->string); - } else + } else { man->meta.title = mandoc_strdup(""); + mandoc_msg(MANDOCERR_TH_NOTITLE, man->parse, + nb->line, nb->pos, "TH"); + } /* TITLE ->MSEC<- DATE SOURCE VOL */ @@ -363,8 +363,11 @@ post_TH(CHKARGS) n = n->next; if (n && n->string) man->meta.msec = mandoc_strdup(n->string); - else + else { man->meta.msec = mandoc_strdup(""); + mandoc_vmsg(MANDOCERR_MSEC_MISSING, man->parse, + nb->line, nb->pos, "TH %s", man->meta.title); + } /* TITLE MSEC ->DATE<- SOURCE VOL */ Index: read.c =================================================================== RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/read.c,v retrieving revision 1.78 retrieving revision 1.79 diff -Lread.c -Lread.c -u -p -r1.78 -r1.79 --- read.c +++ read.c @@ -93,16 +93,19 @@ static const char * const mandocerrs[MAN "generic warning", /* related to the prologue */ - "missing .TH macro, using \"unknown 1\"", + "missing manual title, using UNTITLED", + "missing manual title, using \"\"", "lower case character in document title", + "missing manual section, using \"\"", "unknown manual section", "unknown manual volume or arch", "missing date, using today's date", "cannot parse date, using it verbatim", - "prologue macros out of order", + "missing Os macro, using \"\"", "duplicate prologue macro", - "incomplete prologue, terminated by", - "skipping prologue macro in body", + "late prologue macro", + "skipping late title macro", + "prologue macros out of order", /* related to document structure */ ".so is fragile, better use ln(1)", -- To unsubscribe send an email to source+unsubscribe@mdocml.bsd.lv