-/* $Id: argv.c,v 1.26 2009/01/22 14:56:21 kristaps Exp $ */
+/* $Id: argv.c,v 1.28 2009/02/23 15:19:47 kristaps Exp $ */
/*
* Copyright (c) 2008 Kristaps Dzonsons <kristaps@kth.se>
*
#include "private.h"
/*
- * Parse arguments and parameters of macros. Arguments follow the
- * syntax of `-arg [val [valN...]]', while parameters are free-form text
- * following arguments (if any). This file must correctly handle the
- * strange punctuation rules dictated by groff.
+ * Routines to parse arguments of macros. Arguments follow the syntax
+ * of `-arg [val [valN...]]'. Arguments come in all types: quoted
+ * arguments, multiple arguments per value, no-value arguments, etc.
*/
#define ARGS_QUOTED (1 << 0)
struct mdoc_arg *, int *, char *);
static int argv_multi(struct mdoc *, int,
struct mdoc_arg *, int *, char *);
-static int postargv(struct mdoc *, int,
- const struct mdoc_arg *, int);
static int pwarn(struct mdoc *, int, int, int);
static int perr(struct mdoc *, int, int, int);
/* Error messages. */
#define EQUOTTERM (0)
-#define EOFFSET (1)
-#define EARGVAL (2)
-#define EARGMANY (3)
+#define EARGVAL (1)
+#define EARGMANY (2)
static int mdoc_argflags[MDOC_MAX] = {
0, /* \" */
c = mdoc_perr(mdoc, line, pos,
"unterminated quoted parameter");
break;
- case (EOFFSET):
- c = mdoc_perr(mdoc, line, pos,
- "invalid value for offset argument");
- break;
case (EARGVAL):
c = mdoc_perr(mdoc, line, pos,
"argument requires a value");
}
-static int
-postargv(struct mdoc *mdoc, int line, const struct mdoc_arg *v, int pos)
-{
-
- switch (v->arg) {
- case (MDOC_Offset):
- assert(v->value);
- assert(v->value[0]);
- if (xstrcmp(v->value[0], "left"))
- break;
- if (xstrcmp(v->value[0], "right"))
- break;
- if (xstrcmp(v->value[0], "center"))
- break;
- if (xstrcmp(v->value[0], "indent"))
- break;
- if (xstrcmp(v->value[0], "indent-two"))
- break;
- return(perr(mdoc, line, pos, EOFFSET));
- default:
- break;
- }
-
- return(1);
-}
-
-
static int
argv_multi(struct mdoc *mdoc, int line,
struct mdoc_arg *v, int *pos, char *buf)
ppos = *pos;
if ( ! argv(mdoc, line, v, pos, buf))
return(ARGV_ERROR);
- if ( ! postargv(mdoc, line, v, ppos))
- return(ARGV_ERROR);
return(ARGV_ARG);
}