From 8d5916b51305657eb92b61f1716bda0cbaa0fb45 Mon Sep 17 00:00:00 2001 From: schwarze Date: Fri, 8 Aug 2014 15:26:28 +0000 Subject: [PATCH] Get rid of the useless FATAL error "child violates parent syntax". When finding items outside lists, simply skip them and throw an ERROR. Handle subsections before the first section instead of bailing out. --- usr.bin/mandoc/mandoc.h | 4 +-- usr.bin/mandoc/mdoc_macro.c | 20 +++++++++++- usr.bin/mandoc/mdoc_term.c | 7 ++-- usr.bin/mandoc/mdoc_validate.c | 58 +++------------------------------- usr.bin/mandoc/read.c | 4 +-- 5 files changed, 32 insertions(+), 61 deletions(-) diff --git a/usr.bin/mandoc/mandoc.h b/usr.bin/mandoc/mandoc.h index 8b0ea9bddf1..3763a33cb0b 100644 --- a/usr.bin/mandoc/mandoc.h +++ b/usr.bin/mandoc/mandoc.h @@ -1,4 +1,4 @@ -/* $Id: mandoc.h,v 1.89 2014/08/08 15:21:17 schwarze Exp $ */ +/* $Id: mandoc.h,v 1.90 2014/08/08 15:26:28 schwarze Exp $ */ /* * Copyright (c) 2010, 2011 Kristaps Dzonsons * Copyright (c) 2010-2014 Ingo Schwarze @@ -141,6 +141,7 @@ enum mandocerr { MANDOCERR_ROFFLOOP, /* input stack limit exceeded, infinite loop? */ MANDOCERR_BADCHAR, /* skipping bad character */ MANDOCERR_MACRO, /* skipping unknown macro */ + MANDOCERR_IT_STRAY, /* skipping item outside list */ MANDOCERR_TA_STRAY, /* skipping column outside column list */ MANDOCERR_BLK_NOTOPEN, /* skipping end of block that is not open */ MANDOCERR_BLK_BROKEN, /* inserting missing end of block: macro ... */ @@ -162,7 +163,6 @@ enum mandocerr { MANDOCERR_TOOLARGE, /* input too large */ MANDOCERR_COLUMNS, /* column syntax is inconsistent */ MANDOCERR_BADDISP, /* NOT IMPLEMENTED: .Bd -file */ - MANDOCERR_SYNTCHILD, /* child violates parent syntax */ MANDOCERR_SYNTARGCOUNT, /* argument count wrong, violates syntax */ MANDOCERR_SO_PATH, /* NOT IMPLEMENTED: .so with absolute path or ".." */ MANDOCERR_SO_FAIL, /* .so request failed */ diff --git a/usr.bin/mandoc/mdoc_macro.c b/usr.bin/mandoc/mdoc_macro.c index 40fdba9ba02..5767a50029a 100644 --- a/usr.bin/mandoc/mdoc_macro.c +++ b/usr.bin/mandoc/mdoc_macro.c @@ -1,4 +1,4 @@ -/* $Id: mdoc_macro.c,v 1.94 2014/07/07 21:35:42 schwarze Exp $ */ +/* $Id: mdoc_macro.c,v 1.95 2014/08/08 15:26:28 schwarze Exp $ */ /* * Copyright (c) 2008-2012 Kristaps Dzonsons * Copyright (c) 2010, 2012, 2013 Ingo Schwarze @@ -420,6 +420,8 @@ rew_dohalt(enum mdoct tok, enum mdoc_type type, return(REWIND_NONE); /* FALLTHROUGH */ case MDOC_Sh: + if (MDOC_ROOT == p->parent->type) + return(REWIND_THIS); if (MDOC_Nd == p->tok || MDOC_Ss == p->tok || MDOC_Sh == p->tok) return(REWIND_MORE); @@ -1031,6 +1033,22 @@ blk_full(MACRO_PROT_ARGS) nl = MDOC_NEWLINE & mdoc->flags; + /* Skip items outside lists. */ + + if (tok == MDOC_It) { + for (n = mdoc->last; n; n = n->parent) + if (n->tok == MDOC_Bl) + break; + if (n == NULL) { + mandoc_vmsg(MANDOCERR_IT_STRAY, mdoc->parse, + line, ppos, "It %s", buf + *pos); + if ( ! mdoc_elem_alloc(mdoc, line, ppos, + MDOC_br, NULL)) + return(0); + return(rew_elem(mdoc, MDOC_br)); + } + } + /* Close out prior implicit scope. */ if ( ! (MDOC_EXPLICIT & mdoc_macros[tok].flags)) { diff --git a/usr.bin/mandoc/mdoc_term.c b/usr.bin/mandoc/mdoc_term.c index 3247eabbfb2..85a59562187 100644 --- a/usr.bin/mandoc/mdoc_term.c +++ b/usr.bin/mandoc/mdoc_term.c @@ -1,4 +1,4 @@ -/* $Id: mdoc_term.c,v 1.175 2014/08/08 15:10:15 schwarze Exp $ */ +/* $Id: mdoc_term.c,v 1.176 2014/08/08 15:26:28 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons * Copyright (c) 2010, 2012, 2013, 2014 Ingo Schwarze @@ -1766,6 +1766,9 @@ termp_ss_pre(DECL_ARGS) term_fontpush(p, TERMFONT_BOLD); p->offset = term_len(p, (p->defindent+1)/2); break; + case MDOC_BODY: + p->offset = term_len(p, p->defindent); + break; default: break; } @@ -1777,7 +1780,7 @@ static void termp_ss_post(DECL_ARGS) { - if (MDOC_HEAD == n->type) + if (n->type == MDOC_HEAD || n->type == MDOC_BODY) term_newln(p); } diff --git a/usr.bin/mandoc/mdoc_validate.c b/usr.bin/mandoc/mdoc_validate.c index 6dc6bda5f79..19706ca03e5 100644 --- a/usr.bin/mandoc/mdoc_validate.c +++ b/usr.bin/mandoc/mdoc_validate.c @@ -1,4 +1,4 @@ -/* $Id: mdoc_validate.c,v 1.152 2014/08/08 15:21:17 schwarze Exp $ */ +/* $Id: mdoc_validate.c,v 1.153 2014/08/08 15:26:28 schwarze Exp $ */ /* * Copyright (c) 2008-2012 Kristaps Dzonsons * Copyright (c) 2010-2014 Ingo Schwarze @@ -62,7 +62,6 @@ struct valids { static int check_count(struct mdoc *, enum mdoc_type, enum check_lvl, enum check_ineq, int); -static int check_parent(PRE_ARGS, enum mdoct, enum mdoc_type); static void check_text(struct mdoc *, int, int, char *); static void check_argv(struct mdoc *, struct mdoc_node *, struct mdoc_argv *); @@ -120,13 +119,10 @@ static int pre_bl(PRE_ARGS); static int pre_dd(PRE_ARGS); static int pre_display(PRE_ARGS); static int pre_dt(PRE_ARGS); -static int pre_it(PRE_ARGS); static int pre_literal(PRE_ARGS); static int pre_obsolete(PRE_ARGS); static int pre_os(PRE_ARGS); static int pre_par(PRE_ARGS); -static int pre_sh(PRE_ARGS); -static int pre_ss(PRE_ARGS); static int pre_std(PRE_ARGS); static v_post posts_an[] = { post_an, NULL }; @@ -172,12 +168,10 @@ static v_pre pres_d1[] = { pre_display, NULL }; static v_pre pres_dl[] = { pre_literal, pre_display, NULL }; static v_pre pres_dd[] = { pre_dd, NULL }; static v_pre pres_dt[] = { pre_dt, NULL }; -static v_pre pres_it[] = { pre_it, pre_par, NULL }; +static v_pre pres_it[] = { pre_par, NULL }; static v_pre pres_obsolete[] = { pre_obsolete, NULL }; static v_pre pres_os[] = { pre_os, NULL }; static v_pre pres_pp[] = { pre_par, NULL }; -static v_pre pres_sh[] = { pre_sh, NULL }; -static v_pre pres_ss[] = { pre_ss, NULL }; static v_pre pres_std[] = { pre_std, NULL }; static const struct valids mdoc_valids[MDOC_MAX] = { @@ -185,8 +179,8 @@ static const struct valids mdoc_valids[MDOC_MAX] = { { pres_dd, posts_dd }, /* Dd */ { pres_dt, posts_dt }, /* Dt */ { pres_os, posts_os }, /* Os */ - { pres_sh, posts_sh }, /* Sh */ - { pres_ss, posts_ss }, /* Ss */ + { NULL, posts_sh }, /* Sh */ + { NULL, posts_ss }, /* Ss */ { pres_pp, posts_pp }, /* Pp */ { pres_d1, posts_d1 }, /* D1 */ { pres_dl, posts_dl }, /* Dl */ @@ -545,22 +539,6 @@ check_text(struct mdoc *mdoc, int ln, int pos, char *p) ln, pos + (int)(p - cp), NULL); } -static int -check_parent(PRE_ARGS, enum mdoct tok, enum mdoc_type t) -{ - - assert(n->parent); - if ((MDOC_ROOT == t || tok == n->parent->tok) && - (t == n->parent->type)) - return(1); - - mandoc_vmsg(MANDOCERR_SYNTCHILD, mdoc->parse, - n->line, n->pos, "want parent %s", - MDOC_ROOT == t ? "" : mdoc_macronames[tok]); - return(0); -} - - static int pre_display(PRE_ARGS) { @@ -853,34 +831,6 @@ pre_bd(PRE_ARGS) return(1); } -static int -pre_ss(PRE_ARGS) -{ - - if (MDOC_BLOCK != n->type) - return(1); - return(check_parent(mdoc, n, MDOC_Sh, MDOC_BODY)); -} - -static int -pre_sh(PRE_ARGS) -{ - - if (MDOC_BLOCK != n->type) - return(1); - return(check_parent(mdoc, n, MDOC_MAX, MDOC_ROOT)); -} - -static int -pre_it(PRE_ARGS) -{ - - if (MDOC_BLOCK != n->type) - return(1); - - return(check_parent(mdoc, n, MDOC_Bl, MDOC_BODY)); -} - static int pre_an(PRE_ARGS) { diff --git a/usr.bin/mandoc/read.c b/usr.bin/mandoc/read.c index c7d67756a51..bba7c9f3c8c 100644 --- a/usr.bin/mandoc/read.c +++ b/usr.bin/mandoc/read.c @@ -1,4 +1,4 @@ -/* $Id: read.c,v 1.50 2014/08/08 15:21:17 schwarze Exp $ */ +/* $Id: read.c,v 1.51 2014/08/08 15:26:28 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons * Copyright (c) 2010-2014 Ingo Schwarze @@ -177,6 +177,7 @@ static const char * const mandocerrs[MANDOCERR_MAX] = { "input stack limit exceeded, infinite loop?", "skipping bad character", "skipping unknown macro", + "skipping item outside list", "skipping column outside column list", "skipping end of block that is not open", "inserting missing end of block", @@ -198,7 +199,6 @@ static const char * const mandocerrs[MANDOCERR_MAX] = { "input too large", "column syntax is inconsistent", "NOT IMPLEMENTED: .Bd -file", - "child violates parent syntax", "argument count wrong, violates syntax", "NOT IMPLEMENTED: .so with absolute path or \"..\"", ".so request failed", -- 2.20.1