diff options
-rw-r--r-- | argv.c | 2 | ||||
-rw-r--r-- | macro.c | 7 | ||||
-rw-r--r-- | term.c | 29 | ||||
-rw-r--r-- | validate.c | 57 |
4 files changed, 61 insertions, 34 deletions
@@ -74,7 +74,7 @@ static int mdoc_argflags[MDOC_MAX] = { 0, /* Ed */ 0, /* Bl */ 0, /* El */ - ARGS_DELIM, /* It */ + 0, /* It */ ARGS_DELIM, /* Ad */ ARGS_DELIM, /* An */ ARGS_DELIM, /* Ar */ @@ -921,11 +921,8 @@ macro_scoped(MACRO_PROT_ARGS) if (ARGS_ERROR == c) return(0); - if (ARGS_PUNCT == c) - break; if (ARGS_EOLN == c) break; - if (ARGS_PHRASE == c) { /* if ( ! mdoc_phrase(mdoc, line, lastarg, buf)) @@ -952,10 +949,10 @@ macro_scoped(MACRO_PROT_ARGS) break; } - if ( ! rewind_subblock(MDOC_HEAD, mdoc, tok, line, ppos)) - return(0); if (1 == ppos && ! append_delims(mdoc, line, pos, buf)) return(0); + if ( ! rewind_subblock(MDOC_HEAD, mdoc, tok, line, ppos)) + return(0); if ( ! mdoc_body_alloc(mdoc, line, ppos, tok)) return(0); @@ -381,7 +381,7 @@ termp_it_pre(DECL_ARGS) /* Get our list type. */ - for (i = 0; i < (int)bl->argc; i++) + for (type = -1, i = 0; i < (int)bl->argc; i++) switch (bl->argv[i].arg) { case (MDOC_Bullet): /* FALLTHROUGH */ @@ -391,27 +391,19 @@ termp_it_pre(DECL_ARGS) /* FALLTHROUGH */ case (MDOC_Hyphen): /* FALLTHROUGH */ - case (MDOC_Item): - /* FALLTHROUGH */ case (MDOC_Tag): /* FALLTHROUGH */ case (MDOC_Ohang): type = bl->argv[i].arg; i = (int)bl->argc; break; - case (MDOC_Inset): - /* FALLTHROUGH */ - case (MDOC_Hang): - /* FALLTHROUGH */ - case (MDOC_Diag): - /* FALLTHROUGH */ - case (MDOC_Column): + default: errx(1, "list type not supported"); /* NOTREACHED */ - default: - break; } + assert(-1 != type); + /* Save our existing (inherited) margin and offset. */ pair->offset = p->offset; @@ -419,7 +411,6 @@ termp_it_pre(DECL_ARGS) /* Get list width and offset. */ - /* FIXME: auto-size. */ i = arg_getattr(MDOC_Width, bl->argc, bl->argv); width = i >= 0 ? arg_width(&bl->argv[i]) : 0; @@ -439,6 +430,7 @@ termp_it_pre(DECL_ARGS) width = width > 6 ? width : 6; break; case (MDOC_Tag): + /* FIXME: auto-size. */ if (0 == width) errx(1, "need non-zero -width"); break; @@ -465,7 +457,7 @@ termp_it_pre(DECL_ARGS) else if (MDOC_BODY == node->type) p->flags |= TERMP_NOLPAD; break; - case (MDOC_Ohang): + default: break; } @@ -475,6 +467,7 @@ termp_it_pre(DECL_ARGS) */ tp = NULL; + if (MDOC_HEAD == node->type) { if (arg_hasattr(MDOC_Bullet, bl->argc, bl->argv)) tp = "\\[bu]"; @@ -488,8 +481,6 @@ termp_it_pre(DECL_ARGS) } if (arg_hasattr(MDOC_Hyphen, bl->argc, bl->argv)) tp = "\\-"; - if (arg_hasattr(MDOC_Item, bl->argc, bl->argv)) - tp = ""; } /* Margin control. */ @@ -505,23 +496,19 @@ termp_it_pre(DECL_ARGS) /* FALLTHROUGH */ case (MDOC_Hyphen): /* FALLTHROUGH */ - case (MDOC_Item): - /* FALLTHROUGH */ case (MDOC_Tag): if (MDOC_HEAD == node->type) p->rmargin = p->offset + width; else if (MDOC_BODY == node->type) p->offset += width; break; - case (MDOC_Ohang): + default: break; } if (NULL == tp) return(1); - /* XXX - ignoring children. */ - word(p, tp); return(0); } @@ -540,7 +540,7 @@ pre_display(PRE_ARGS) static int pre_bl(PRE_ARGS) { - int type, i; + int type, i, width, offset; struct mdoc_arg *argv; size_t argc; @@ -551,8 +551,10 @@ pre_bl(PRE_ARGS) /* Make sure that only one type of list is specified. */ + type = offset = width = -1; + /* LINTED */ - for (i = 0, type = 0; i < (int)argc; i++) { + for (i = 0; i < (int)argc; i++) { argv = &n->data.block.argv[i]; switch (argv->arg) { @@ -577,18 +579,60 @@ pre_bl(PRE_ARGS) case (MDOC_Inset): /* FALLTHROUGH */ case (MDOC_Column): - if (0 == type++) + if (-1 == type) { + type = argv->arg; break; + } return(mdoc_perr(mdoc, argv->line, argv->pos, "multiple types specified")); + case (MDOC_Width): + if (-1 == width) { + width = argv->arg; + break; + } + return(mdoc_perr(mdoc, argv->line, argv->pos, + "multiple -%s arguments", + mdoc_argnames[MDOC_Width])); + case (MDOC_Offset): + if (-1 == offset) { + offset = argv->arg; + break; + } + return(mdoc_perr(mdoc, argv->line, argv->pos, + "multiple -%s arguments", + mdoc_argnames[MDOC_Offset])); default: break; } } - if (type) - return(1); - return(mdoc_err(mdoc, "no type specified")); + if (-1 == type) + return(mdoc_err(mdoc, "no type specified")); + + switch (type) { + case (MDOC_Column): + /* FALLTHROUGH */ + case (MDOC_Diag): + /* FALLTHROUGH */ + case (MDOC_Inset): + /* FALLTHROUGH */ + case (MDOC_Item): + if (-1 == width) + break; + return(mdoc_nwarn(mdoc, n, WARN_SYNTAX, + "superfluous -%s argument", + mdoc_argnames[MDOC_Width])); + case (MDOC_Tag): + if (-1 != width) + break; + return(mdoc_nwarn(mdoc, n, WARN_SYNTAX, + "suggest -%s argument", + mdoc_argnames[MDOC_Width])); + default: + break; + } + + return(1); } @@ -659,7 +703,6 @@ static int pre_it(PRE_ARGS) { - /* TODO: -width attribute must be specified for -tag. */ /* TODO: children too big for -width? */ if (MDOC_BLOCK != n->type) |