=================================================================== RCS file: /cvs/mandoc/Attic/argv.c,v retrieving revision 1.5 retrieving revision 1.11 diff -u -p -r1.5 -r1.11 --- mandoc/Attic/argv.c 2009/01/01 20:40:16 1.5 +++ mandoc/Attic/argv.c 2009/01/12 10:31:53 1.11 @@ -1,4 +1,4 @@ -/* $Id: argv.c,v 1.5 2009/01/01 20:40:16 kristaps Exp $ */ +/* $Id: argv.c,v 1.11 2009/01/12 10:31:53 kristaps Exp $ */ /* * Copyright (c) 2008 Kristaps Dzonsons * @@ -27,14 +27,14 @@ static int lookup(int, const char *); -static int parse(struct mdoc *, int, +static int parse(struct mdoc *, int, int, struct mdoc_arg *, int *, char *); static int postparse(struct mdoc *, int, const struct mdoc_arg *, int); int -mdoc_args(struct mdoc *mdoc, int tok, int *pos, char *buf, int fl, char **v) +mdoc_args(struct mdoc *mdoc, int line, int *pos, char *buf, int fl, char **v) { int i; @@ -42,11 +42,11 @@ mdoc_args(struct mdoc *mdoc, int tok, int *pos, char * return(ARGS_EOLN); if ('\"' == buf[*pos] && ! (fl & ARGS_QUOTED)) - if ( ! mdoc_warn(mdoc, tok, *pos, WARN_SYNTAX_QUOTED)) + if ( ! mdoc_pwarn(mdoc, line, *pos, WARN_SYNTAX_QUOTED)) return(ARGS_ERROR); if ('-' == buf[*pos]) - if ( ! mdoc_warn(mdoc, tok, *pos, WARN_SYNTAX_ARGLIKE)) + if ( ! mdoc_pwarn(mdoc, line, *pos, WARN_SYNTAX_ARGLIKE)) return(ARGS_ERROR); if ((fl & ARGS_DELIM) && mdoc_iscdelim(buf[*pos])) { @@ -89,7 +89,7 @@ mdoc_args(struct mdoc *mdoc, int tok, int *pos, char * if (buf[*pos]) return(ARGS_WORD); - if ( ! mdoc_warn(mdoc, tok, *pos, WARN_SYNTAX_WS_EOLN)) + if ( ! mdoc_pwarn(mdoc, line, *pos, WARN_SYNTAX_WS_EOLN)) return(ARGS_ERROR); return(ARGS_WORD); @@ -107,7 +107,7 @@ mdoc_args(struct mdoc *mdoc, int tok, int *pos, char * (*pos)++; if (0 == buf[*pos]) { - (void)mdoc_err(mdoc, tok, *pos, ERR_SYNTAX_UNQUOTE); + (void)mdoc_perr(mdoc, line, *pos, ERR_SYNTAX_UNQUOTE); return(ARGS_ERROR); } @@ -121,7 +121,7 @@ mdoc_args(struct mdoc *mdoc, int tok, int *pos, char * if (buf[*pos]) return(ARGS_WORD); - if ( ! mdoc_warn(mdoc, tok, *pos, WARN_SYNTAX_WS_EOLN)) + if ( ! mdoc_pwarn(mdoc, line, *pos, WARN_SYNTAX_WS_EOLN)) return(ARGS_ERROR); return(ARGS_WORD); @@ -133,6 +133,13 @@ lookup(int tok, const char *argv) { switch (tok) { + case (MDOC_An): + if (xstrcmp(argv, "split")) + return(MDOC_Split); + else if (xstrcmp(argv, "nosplit")) + return(MDOC_Nosplit); + break; + case (MDOC_Bd): if (xstrcmp(argv, "ragged")) return(MDOC_Ragged); @@ -146,6 +153,20 @@ lookup(int tok, const char *argv) return(MDOC_Offset); break; + case (MDOC_Bf): + if (xstrcmp(argv, "emphasis")) + return(MDOC_Emphasis); + else if (xstrcmp(argv, "literal")) + return(MDOC_Literal); + else if (xstrcmp(argv, "symbolic")) + return(MDOC_Symbolic); + break; + + case (MDOC_Bk): + if (xstrcmp(argv, "words")) + return(MDOC_Words); + break; + case (MDOC_Bl): if (xstrcmp(argv, "bullet")) return(MDOC_Bullet); @@ -262,8 +283,7 @@ lookup(int tok, const char *argv) break; default: - abort(); - /* NOTREACHED */ + break; } return(MDOC_ARG_MAX); @@ -271,7 +291,7 @@ lookup(int tok, const char *argv) static int -postparse(struct mdoc *mdoc, int tok, const struct mdoc_arg *v, int pos) +postparse(struct mdoc *mdoc, int line, const struct mdoc_arg *v, int pos) { switch (v->arg) { @@ -288,7 +308,7 @@ postparse(struct mdoc *mdoc, int tok, const struct mdo break; if (xstrcmp(v->value[0], "indent-two")) break; - return(mdoc_err(mdoc, tok, pos, ERR_SYNTAX_ARGBAD)); + return(mdoc_perr(mdoc, line, pos, ERR_SYNTAX_ARGBAD)); default: break; } @@ -298,7 +318,7 @@ postparse(struct mdoc *mdoc, int tok, const struct mdo static int -parse(struct mdoc *mdoc, int tok, +parse(struct mdoc *mdoc, int line, int tok, struct mdoc_arg *v, int *pos, char *buf) { char *p; @@ -307,39 +327,6 @@ parse(struct mdoc *mdoc, int tok, ppos = *pos; switch (v->arg) { - case(MDOC_Compact): - /* FALLTHROUGH */ - case(MDOC_Ragged): - /* FALLTHROUGH */ - case(MDOC_Unfilled): - /* FALLTHROUGH */ - case(MDOC_Literal): - /* FALLTHROUGH */ - case(MDOC_File): - /* FALLTHROUGH */ - case(MDOC_Bullet): - /* FALLTHROUGH */ - case(MDOC_Dash): - /* FALLTHROUGH */ - case(MDOC_Hyphen): - /* FALLTHROUGH */ - case(MDOC_Item): - /* FALLTHROUGH */ - case(MDOC_Enum): - /* FALLTHROUGH */ - case(MDOC_Tag): - /* FALLTHROUGH */ - case(MDOC_Diag): - /* FALLTHROUGH */ - case(MDOC_Hang): - /* FALLTHROUGH */ - case(MDOC_Ohang): - /* FALLTHROUGH */ - case(MDOC_Inset): - v->sz = 0; - v->value = NULL; - break; - case(MDOC_Std): /* FALLTHROUGH */ case(MDOC_Width): @@ -348,16 +335,16 @@ parse(struct mdoc *mdoc, int tok, /* * This has a single value for an argument. */ - c = mdoc_args(mdoc, tok, pos, buf, ARGS_QUOTED, &p); + c = mdoc_args(mdoc, line, pos, buf, ARGS_QUOTED, &p); if (ARGS_ERROR == c) return(0); - else if (ARGS_EOLN == c) - return(mdoc_err(mdoc, tok, ppos, ERR_SYNTAX_ARGVAL)); - - v->sz = 1; - v->value = xcalloc(1, sizeof(char *)); - v->value[0] = p; - break; + else if (ARGS_EOLN != c) { + v->sz = 1; + v->value = xcalloc(1, sizeof(char *)); + v->value[0] = p; + break; + } + return(mdoc_perr(mdoc, line, ppos, ERR_SYNTAX_ARGVAL)); case(MDOC_Column): /* @@ -368,7 +355,7 @@ parse(struct mdoc *mdoc, int tok, v->sz = 0; v->value = xcalloc(MDOC_LINEARG_MAX, sizeof(char *)); for (i = 0; i < MDOC_LINEARG_MAX; i++) { - c = mdoc_args(mdoc, tok, pos, buf, ARGS_QUOTED, &p); + c = mdoc_args(mdoc, line, pos, buf, ARGS_QUOTED, &p); if (ARGS_ERROR == c) { free(v->value); return(0); @@ -378,15 +365,19 @@ parse(struct mdoc *mdoc, int tok, } if (0 == i) { free(v->value); - return(mdoc_err(mdoc, tok, ppos, ERR_SYNTAX_ARGVAL)); + return(mdoc_perr(mdoc, line, ppos, + ERR_SYNTAX_ARGVAL)); } else if (MDOC_LINEARG_MAX == i) - return(mdoc_err(mdoc, tok, ppos, ERR_SYNTAX_ARGMANY)); + return(mdoc_perr(mdoc, line, ppos, + ERR_SYNTAX_ARGMANY)); v->sz = i; break; + default: - abort(); - /* NOTREACHED */ + v->sz = 0; + v->value = NULL; + break; } return(1); @@ -394,7 +385,7 @@ parse(struct mdoc *mdoc, int tok, int -mdoc_argv(struct mdoc *mdoc, int tok, +mdoc_argv(struct mdoc *mdoc, int line, int tok, struct mdoc_arg *v, int *pos, char *buf) { int i, ppos; @@ -413,6 +404,9 @@ mdoc_argv(struct mdoc *mdoc, int tok, i = *pos; argv = &buf[++(*pos)]; + v->line = line; + v->pos = *pos; + while (buf[*pos] && ! isspace(buf[*pos])) (*pos)++; @@ -420,8 +414,8 @@ mdoc_argv(struct mdoc *mdoc, int tok, buf[(*pos)++] = 0; if (MDOC_ARG_MAX == (v->arg = lookup(tok, argv))) { - (void)mdoc_err(mdoc, tok, i, ERR_SYNTAX_ARG); - return(ARGV_ERROR); + (void)mdoc_pwarn(mdoc, line, i, WARN_SYNTAX_ARGLIKE); + return(ARGV_WORD); } while (buf[*pos] && isspace(buf[*pos])) @@ -430,9 +424,9 @@ mdoc_argv(struct mdoc *mdoc, int tok, /* FIXME: whitespace if no value. */ ppos = *pos; - if ( ! parse(mdoc, tok, v, pos, buf)) + if ( ! parse(mdoc, line, tok, v, pos, buf)) return(ARGV_ERROR); - if ( ! postparse(mdoc, tok, v, ppos)) + if ( ! postparse(mdoc, line, v, ppos)) return(ARGV_ERROR); return(ARGV_ARG);