version 1.92, 2010/06/09 19:22:56 |
version 1.95, 2010/06/12 11:41:50 |
Line 683 pre_bl(PRE_ARGS) |
|
Line 683 pre_bl(PRE_ARGS) |
|
static int |
static int |
pre_bd(PRE_ARGS) |
pre_bd(PRE_ARGS) |
{ |
{ |
int i, type, err; |
int i, dup, comp; |
|
enum mdoc_disp dt; |
|
const char *offs; |
|
|
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.Bd.type); |
|
memcpy(&n->data.Bd, &n->parent->data.Bd, |
|
sizeof(struct mdoc_bd)); |
return(1); |
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.Bd.type); |
|
|
/* LINTED */ |
/* LINTED */ |
for (i = 0, err = type = 0; ! err && |
for (i = 0; n->args && i < (int)n->args->argc; i++) { |
i < (int)n->args->argc; i++) |
dt = DISP__NONE; |
|
dup = comp = 0; |
|
offs = NULL; |
|
|
switch (n->args->argv[i].arg) { |
switch (n->args->argv[i].arg) { |
case (MDOC_Centred): |
case (MDOC_Centred): |
/* FALLTHROUGH */ |
dt = DISP_centred; |
|
break; |
case (MDOC_Ragged): |
case (MDOC_Ragged): |
/* FALLTHROUGH */ |
dt = DISP_ragged; |
|
break; |
case (MDOC_Unfilled): |
case (MDOC_Unfilled): |
/* FALLTHROUGH */ |
dt = DISP_unfilled; |
|
break; |
case (MDOC_Filled): |
case (MDOC_Filled): |
/* FALLTHROUGH */ |
dt = DISP_filled; |
|
break; |
case (MDOC_Literal): |
case (MDOC_Literal): |
if (0 == type++) |
dt = DISP_literal; |
|
break; |
|
case (MDOC_File): |
|
mdoc_nmsg(mdoc, n, MANDOCERR_BADDISP); |
|
return(0); |
|
case (MDOC_Offset): |
|
/* NB: this can be empty! */ |
|
if (n->args->argv[i].sz) { |
|
offs = n->args->argv[i].value[0]; |
|
dup = (NULL != n->data.Bd.offs); |
break; |
break; |
if ( ! mdoc_nmsg(mdoc, n, MANDOCERR_DISPREP)) |
} |
|
if ( ! mdoc_nmsg(mdoc, n, MANDOCERR_IGNARGV)) |
return(0); |
return(0); |
break; |
break; |
default: |
case (MDOC_Compact): |
|
comp = 1; |
|
dup = n->data.Bd.comp; |
break; |
break; |
|
default: |
|
abort(); |
|
/* NOTREACHED */ |
} |
} |
|
|
if (type) |
/* Check whether we have duplicates. */ |
return(1); |
|
mdoc_nmsg(mdoc, n, MANDOCERR_DISPTYPE); |
if (dup && ! mdoc_nmsg(mdoc, n, MANDOCERR_ARGVREP)) |
return(0); |
return(0); |
|
|
|
/* Make our auxiliary assignments. */ |
|
|
|
if (offs && ! dup) |
|
n->data.Bd.offs = offs; |
|
if (comp && ! dup) |
|
n->data.Bd.comp = comp; |
|
|
|
/* Check whether a type has already been assigned. */ |
|
|
|
if (DISP__NONE != dt && n->data.Bd.type != DISP__NONE) |
|
if ( ! mdoc_nmsg(mdoc, n, MANDOCERR_DISPREP)) |
|
return(0); |
|
|
|
/* Make our type assignment. */ |
|
|
|
if (DISP__NONE != dt && n->data.Bd.type == DISP__NONE) |
|
n->data.Bd.type = dt; |
|
} |
|
|
|
if (DISP__NONE == n->data.Bd.type) { |
|
if ( ! mdoc_nmsg(mdoc, n, MANDOCERR_DISPTYPE)) |
|
return(0); |
|
n->data.Bd.type = DISP_ragged; |
|
} |
|
|
|
return(1); |
} |
} |
|
|
|
|