From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp1.rz.uni-karlsruhe.de (Debian-exim@smtp1.rz.uni-karlsruhe.de [129.13.185.217]) by krisdoz.my.domain (8.14.3/8.14.3) with ESMTP id o9ND64c1018185 for ; Sat, 23 Oct 2010 09:06:07 -0400 (EDT) Received: from hekate.usta.de (asta-nat.asta.uni-karlsruhe.de [172.22.63.82]) by smtp1.rz.uni-karlsruhe.de with esmtp (Exim 4.63 #1) id 1P9dnO-00080u-QL; Sat, 23 Oct 2010 15:06:02 +0200 Received: from donnerwolke.usta.de ([172.24.96.3]) by hekate.usta.de with esmtp (Exim 4.71) (envelope-from ) id 1P9dnO-0001UK-Om for tech@mdocml.bsd.lv; Sat, 23 Oct 2010 15:06:02 +0200 Received: from iris.usta.de ([172.24.96.5] helo=usta.de) by donnerwolke.usta.de with esmtp (Exim 4.69) (envelope-from ) id 1P9dnO-0002X2-Mv for tech@mdocml.bsd.lv; Sat, 23 Oct 2010 15:06:02 +0200 Received: from schwarze by usta.de with local (Exim 4.71) (envelope-from ) id 1P9dnO-0002dY-MO for tech@mdocml.bsd.lv; Sat, 23 Oct 2010 15:06:02 +0200 Date: Sat, 23 Oct 2010 15:06:02 +0200 From: Ingo Schwarze To: tech@mdocml.bsd.lv Subject: more FATAL cleanup Message-ID: <20101023130602.GB24251@iris.usta.de> X-Mailinglist: mdocml-tech Reply-To: tech@mdocml.bsd.lv MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.20 (2009-06-14) Hi, we really do not want to error out when we can at least render part of the input in a sane way. In that spirit, here is a patch (against OpenBSD) to downgrade a few FATALs to ERRORs, in one case even to a WARNING,hacked up yesterday on the train to p2k10. Im planning to put this into the OpenBSD tree after merging Kristaps' latest changes from bsd.lv. Rationale: * Nested displays render correctly with mandoc and new groff, so they do not even warrant an ERROR. On the other hand, old groff has an issue with -filled displays inside -literal displays; it fails to switch back to literal mode after the end of the embedded display. Thus, i do think a warning about questionable portability does make sense. While here, drop a useless /* LINTED */. * No need to die just because we don't know the opearting system. While there, - The system call is called uname(3), not utsname(3). - No need to test pointers for non-NULL before free. - Better test for success than for a specific mode of failure; failure to conform to the specification is not success. - Always use the correct size of the static buffer. * Getting rid of the remaining "bad nesting" FATALs is surprisingly simple. The only finer point about is that make_pending can now fail, when the breaking block does not exist. In two out of the three use cases, that cannot happen, so discard the return value: We already know the breaking block does exist. Yours, Ingo Index: main.c =================================================================== RCS file: /cvs/src/usr.bin/mandoc/main.c,v retrieving revision 1.49 diff -u -p -r1.49 main.c --- main.c 16 Oct 2010 20:49:37 -0000 1.49 +++ main.c 23 Oct 2010 12:15:27 -0000 @@ -121,6 +121,7 @@ static const char * const mandocerrs[MAN "bad date argument", "bad width argument", "unknown manual section", + "nested displays are not portable", "section not in conventional manual section", "end of line whitespace", "blocks badly nested", @@ -148,8 +149,10 @@ static const char * const mandocerrs[MAN "line scope broken", "argument count wrong", "request scope close w/none open", + "missing end of block", "scope already open", "scope open on exit", + "uname(3) system call failed", "macro requires line argument(s)", "macro requires body argument(s)", "macro requires argument(s)", @@ -165,17 +168,13 @@ static const char * const mandocerrs[MAN "generic fatal error", "column syntax is inconsistent", - "displays may not be nested", "unsupported display type", - "blocks badly nested", - "no such block is open", "line scope broken, syntax violated", "argument count wrong, violates syntax", "child violates parent syntax", "argument count wrong, violates syntax", "no document body", "no document prologue", - "utsname system call failed", "static buffer exhausted", }; Index: mandoc.h =================================================================== RCS file: /cvs/src/usr.bin/mandoc/mandoc.h,v retrieving revision 1.15 diff -u -p -r1.15 mandoc.h --- mandoc.h 16 Oct 2010 20:49:37 -0000 1.15 +++ mandoc.h 23 Oct 2010 12:15:27 -0000 @@ -60,6 +60,7 @@ enum mandocerr { MANDOCERR_BADDATE, /* bad date argument */ MANDOCERR_BADWIDTH, /* bad width argument */ MANDOCERR_BADMSEC, /* unknown manual section */ + MANDOCERR_NESTEDDISP, /* nested displays are not portable */ MANDOCERR_SECMSEC, /* section not in conventional manual section */ MANDOCERR_EOLNSPACE, /* end of line whitespace */ MANDOCERR_SCOPENEST, /* blocks badly nested */ @@ -87,8 +88,10 @@ enum mandocerr { MANDOCERR_LINESCOPE, /* line scope broken */ MANDOCERR_ARGCOUNT, /* argument count wrong */ MANDOCERR_NOSCOPE, /* no such block is open */ + MANDOCERR_SCOPEBROKEN, /* missing end of block */ MANDOCERR_SCOPEREP, /* scope already open */ MANDOCERR_SCOPEEXIT, /* scope open on exit */ + MANDOCERR_UNAME, /* uname(3) system call failed */ /* FIXME: merge following with MANDOCERR_ARGCOUNT */ MANDOCERR_NOARGS, /* macro requires line argument(s) */ MANDOCERR_NOBODY, /* macro requires body argument(s) */ @@ -105,18 +108,13 @@ enum mandocerr { MANDOCERR_FATAL, /* ===== end of fatal errors ===== */ MANDOCERR_COLUMNS, /* column syntax is inconsistent */ - /* FIXME: this should be a MANDOCERR_ERROR */ - MANDOCERR_NESTEDDISP, /* displays may not be nested */ MANDOCERR_BADDISP, /* unsupported display type */ - MANDOCERR_SCOPEFATAL, /* blocks badly nested */ - MANDOCERR_SYNTNOSCOPE, /* no scope to rewind: syntax violated */ MANDOCERR_SYNTLINESCOPE, /* line scope broken, syntax violated */ MANDOCERR_SYNTARGVCOUNT, /* argument count wrong, violates syntax */ MANDOCERR_SYNTCHILD, /* child violates parent syntax */ MANDOCERR_SYNTARGCOUNT, /* argument count wrong, violates syntax */ MANDOCERR_NODOCBODY, /* no document body */ MANDOCERR_NODOCPROLOG, /* no document prologue */ - MANDOCERR_UTSNAME, /* utsname system call failed */ MANDOCERR_MEM, /* static buffer exhausted */ MANDOCERR_MAX Index: mdoc_action.c =================================================================== RCS file: /cvs/src/usr.bin/mandoc/mdoc_action.c,v retrieving revision 1.45 diff -u -p -r1.45 mdoc_action.c --- mdoc_action.c 16 Oct 2010 13:38:29 -0000 1.45 +++ mdoc_action.c 23 Oct 2010 12:15:27 -0000 @@ -600,8 +600,7 @@ post_os(POST_ARGS) struct utsname utsname; #endif - if (m->meta.os) - free(m->meta.os); + free(m->meta.os); if ( ! concat(m, buf, n->child, BUFSIZ)) return(0); @@ -617,14 +616,17 @@ post_os(POST_ARGS) return(0); } #else /*!OSNAME */ - if (-1 == uname(&utsname)) - return(mdoc_nmsg(m, n, MANDOCERR_UTSNAME)); + if (uname(&utsname)) { + mdoc_nmsg(m, n, MANDOCERR_UNAME); + m->meta.os = mandoc_strdup("UNKNOWN"); + return(post_prol(m, n)); + } if (strlcat(buf, utsname.sysname, BUFSIZ) >= BUFSIZ) { mdoc_nmsg(m, n, MANDOCERR_MEM); return(0); } - if (strlcat(buf, " ", 64) >= BUFSIZ) { + if (strlcat(buf, " ", BUFSIZ) >= BUFSIZ) { mdoc_nmsg(m, n, MANDOCERR_MEM); return(0); } Index: mdoc_macro.c =================================================================== RCS file: /cvs/src/usr.bin/mandoc/mdoc_macro.c,v retrieving revision 1.58 diff -u -p -r1.58 mdoc_macro.c --- mdoc_macro.c 16 Oct 2010 13:38:29 -0000 1.58 +++ mdoc_macro.c 23 Oct 2010 12:15:27 -0000 @@ -30,6 +30,7 @@ enum rew { /* see rew_dohalt() */ REWIND_NONE, REWIND_THIS, REWIND_MORE, + REWIND_FORCE, REWIND_LATER, REWIND_ERROR }; @@ -324,6 +325,7 @@ rew_alt(enum mdoct tok) * inside *p, so there is no need to rewind anything at all. * REWIND_THIS: *p matches tok, so rewind *p and nothing else. * REWIND_MORE: *p is implicit, rewind it and keep searching for tok. + * REWIND_FORCE: *p is explicit, but tok is full, force rewinding *p. * REWIND_LATER: *p is explicit and still open, postpone rewinding. * REWIND_ERROR: No tok block is open at all. */ @@ -417,16 +419,13 @@ rew_dohalt(enum mdoct tok, enum mdoc_typ return(REWIND_MORE); /* - * Partial blocks allow delayed rewinding by default. + * By default, closing out full blocks + * forces closing of broken explicit blocks, + * while closing out partial blocks + * allows delayed rewinding by default. */ - if (&blk_full != mdoc_macros[tok].fp) - return (REWIND_LATER); - - /* - * Full blocks can only be rewound when matching - * or when there is an explicit rule. - */ - return(REWIND_ERROR); + return (&blk_full == mdoc_macros[tok].fp ? + REWIND_FORCE : REWIND_LATER); } @@ -517,9 +516,7 @@ make_pending(struct mdoc_node *broken, e /* * Found no matching block for tok. * Are you trying to close a block that is not open? - * XXX Make this non-fatal. */ - mdoc_pmsg(m, line, ppos, MANDOCERR_SYNTNOSCOPE); return(0); } @@ -537,17 +534,22 @@ rew_sub(enum mdoc_type t, struct mdoc *m return(1); case (REWIND_THIS): break; + case (REWIND_FORCE): + mdoc_vmsg(m, MANDOCERR_SCOPEBROKEN, line, ppos, + "%s breaks %s", mdoc_macronames[tok], + mdoc_macronames[n->tok]); + /* FALLTHROUGH */ case (REWIND_MORE): n = n->parent; continue; case (REWIND_LATER): - return(make_pending(n, tok, m, line, ppos)); + if (make_pending(n, tok, m, line, ppos) || + MDOC_BLOCK != t) + return(1); + /* FALLTHROUGH */ case (REWIND_ERROR): - /* XXX Make this non-fatal. */ - mdoc_vmsg(m, MANDOCERR_SCOPEFATAL, line, ppos, - "%s cannot break %s", mdoc_macronames[tok], - mdoc_macronames[n->tok]); - return 0; + mdoc_pmsg(m, line, ppos, MANDOCERR_NOSCOPE); + return(1); } break; } @@ -675,8 +677,7 @@ blk_exp_close(MACRO_PROT_ARGS) * postpone closing out the current block * until the rew_sub() closing out the sub-block. */ - if ( ! make_pending(later, tok, m, line, ppos)) - return(0); + make_pending(later, tok, m, line, ppos); /* * Mark the place where the formatting - but not @@ -1282,8 +1283,7 @@ blk_part_imp(MACRO_PROT_ARGS) MDOC_EXPLICIT & mdoc_macros[n->tok].flags && ! (MDOC_VALID & n->flags)) { assert( ! (MDOC_ACTED & n->flags)); - if ( ! make_pending(n, tok, m, line, ppos)) - return(0); + make_pending(n, tok, m, line, ppos); if ( ! mdoc_endbody_alloc(m, line, ppos, tok, body, ENDBODY_NOSPACE)) return(0); Index: mdoc_validate.c =================================================================== RCS file: /cvs/src/usr.bin/mandoc/mdoc_validate.c,v retrieving revision 1.71 diff -u -p -r1.71 mdoc_validate.c --- mdoc_validate.c 16 Oct 2010 13:38:29 -0000 1.71 +++ mdoc_validate.c 23 Oct 2010 12:15:27 -0000 @@ -511,21 +511,17 @@ pre_display(PRE_ARGS) { struct mdoc_node *node; - /* Display elements (`Bd', `D1'...) cannot be nested. */ - if (MDOC_BLOCK != n->type) return(1); - /* LINTED */ for (node = mdoc->last->parent; node; node = node->parent) if (MDOC_BLOCK == node->type) if (MDOC_Bd == node->tok) break; - if (NULL == node) - return(1); + if (node) + mdoc_nmsg(mdoc, n, MANDOCERR_NESTEDDISP); - mdoc_nmsg(mdoc, n, MANDOCERR_NESTEDDISP); - return(0); + return(1); } -- To unsubscribe send an email to tech+unsubscribe@mdocml.bsd.lv