summaryrefslogtreecommitdiffstatshomepage
path: root/mdoc_validate.c
diff options
context:
space:
mode:
authorKristaps Dzonsons <kristaps@bsd.lv>2010-06-12 10:09:19 +0000
committerKristaps Dzonsons <kristaps@bsd.lv>2010-06-12 10:09:19 +0000
commit0b20ee1ae342d058c3e78b46ba69335c80addfda (patch)
tree2c6c3b2b5b2b24cce540a79d6cafcda7e6bce9b3 /mdoc_validate.c
parent078ee5b9efa7e35cf66a131178415a512c4a33fe (diff)
downloadmandoc-0b20ee1ae342d058c3e78b46ba69335c80addfda.tar.gz
mandoc-0b20ee1ae342d058c3e78b46ba69335c80addfda.tar.zst
mandoc-0b20ee1ae342d058c3e78b46ba69335c80addfda.zip
Added enum mdoc_disp (similar to enum mdoc_list). Display types are now
only calculated once in mdoc_validate.c. Noted that `Bd -file xxx' is not supported: it now raises a fatal warning. This is noted in mdoc.7. Empty `Bd' now defaults to LIST_ragged, which is not quite what groff does, but close enough (gross just throws away the `Bd' and gets upset when it encounters an `Ed').
Diffstat (limited to 'mdoc_validate.c')
-rw-r--r--mdoc_validate.c64
1 files changed, 43 insertions, 21 deletions
diff --git a/mdoc_validate.c b/mdoc_validate.c
index e621a2c1..a42fc118 100644
--- a/mdoc_validate.c
+++ b/mdoc_validate.c
@@ -1,4 +1,4 @@
-/* $Id: mdoc_validate.c,v 1.92 2010/06/09 19:22:56 kristaps Exp $ */
+/* $Id: mdoc_validate.c,v 1.93 2010/06/12 10:09:19 kristaps Exp $ */
/*
* Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@bsd.lv>
*
@@ -683,43 +683,65 @@ pre_bl(PRE_ARGS)
static int
pre_bd(PRE_ARGS)
{
- int i, type, err;
+ int i;
+ enum mdoc_disp dt;
- if (MDOC_BLOCK != n->type)
+ if (MDOC_BLOCK != n->type) {
+ assert(n->parent);
+ assert(MDOC_BLOCK == n->parent->type);
+ assert(MDOC_Bd == n->parent->tok);
+ assert(DISP__NONE != n->parent->data.disp);
+ n->data.disp = n->parent->data.disp;
return(1);
- if (NULL == n->args) {
- mdoc_nmsg(mdoc, n, MANDOCERR_DISPTYPE);
- return(0);
}
- /* Make sure that only one type of display is specified. */
+ assert(DISP__NONE == n->data.disp);
/* LINTED */
- for (i = 0, err = type = 0; ! err &&
- i < (int)n->args->argc; i++)
+ for (i = 0; n->args && i < (int)n->args->argc; i++) {
+ dt = DISP__NONE;
switch (n->args->argv[i].arg) {
case (MDOC_Centred):
- /* FALLTHROUGH */
+ dt = DISP_centred;
+ break;
case (MDOC_Ragged):
- /* FALLTHROUGH */
+ dt = DISP_ragged;
+ break;
case (MDOC_Unfilled):
- /* FALLTHROUGH */
+ dt = DISP_unfilled;
+ break;
case (MDOC_Filled):
- /* FALLTHROUGH */
+ dt = DISP_filled;
+ break;
case (MDOC_Literal):
- if (0 == type++)
- break;
- if ( ! mdoc_nmsg(mdoc, n, MANDOCERR_DISPREP))
- return(0);
+ dt = DISP_literal;
break;
+ case (MDOC_File):
+ mdoc_nmsg(mdoc, n, MANDOCERR_BADDISP);
+ return(0);
+ case (MDOC_Offset):
+ /* FALLTHROUGH */
+ case (MDOC_Compact):
+ /* FALLTHROUGH */
default:
break;
}
- if (type)
- return(1);
- mdoc_nmsg(mdoc, n, MANDOCERR_DISPTYPE);
- return(0);
+ if (DISP__NONE != dt && n->data.disp != DISP__NONE)
+ if ( ! mdoc_nmsg(mdoc, n, MANDOCERR_DISPREP))
+ return(0);
+
+ if (DISP__NONE != dt && n->data.disp == DISP__NONE)
+ n->data.disp = dt;
+ }
+
+ if (DISP__NONE == n->data.disp) {
+ if ( ! mdoc_nmsg(mdoc, n, MANDOCERR_DISPTYPE))
+ return(0);
+ n->data.disp = DISP_ragged;
+ }
+
+ return(1);
}