+static int argv_multi(struct mdoc *, int,
+ struct mdoc_arg *, int *, char *);
+static int pwarn(struct mdoc *, int, int, int);
+static int perr(struct mdoc *, int, int, int);
+
+/* Warning messages. */
+
+#define WQUOTPARM (0)
+#define WARGVPARM (1)
+#define WCOLEMPTY (2)
+#define WTAILWS (3)
+
+/* Error messages. */
+
+#define EQUOTTERM (0)
+#define EARGVAL (1)
+#define EARGMANY (2)
+
+/* Per-argument flags. */
+
+static int mdoc_argvflags[MDOC_ARG_MAX] = {
+ ARGV_NONE, /* MDOC_Split */
+ ARGV_NONE, /* MDOC_Nosplit */
+ ARGV_NONE, /* MDOC_Ragged */
+ ARGV_NONE, /* MDOC_Unfilled */
+ ARGV_NONE, /* MDOC_Literal */
+ ARGV_NONE, /* MDOC_File */
+ ARGV_SINGLE, /* MDOC_Offset */
+ ARGV_NONE, /* MDOC_Bullet */
+ ARGV_NONE, /* MDOC_Dash */
+ ARGV_NONE, /* MDOC_Hyphen */
+ ARGV_NONE, /* MDOC_Item */
+ ARGV_NONE, /* MDOC_Enum */
+ ARGV_NONE, /* MDOC_Tag */
+ ARGV_NONE, /* MDOC_Diag */
+ ARGV_NONE, /* MDOC_Hang */
+ ARGV_NONE, /* MDOC_Ohang */
+ ARGV_NONE, /* MDOC_Inset */
+ ARGV_MULTI, /* MDOC_Column */
+ ARGV_SINGLE, /* MDOC_Width */
+ ARGV_NONE, /* MDOC_Compact */
+ ARGV_OPT_SINGLE, /* MDOC_Std */
+ ARGV_NONE, /* MDOC_p1003_1_88 */
+ ARGV_NONE, /* MDOC_p1003_1_90 */
+ ARGV_NONE, /* MDOC_p1003_1_96 */
+ ARGV_NONE, /* MDOC_p1003_1_2001 */
+ ARGV_NONE, /* MDOC_p1003_1_2004 */
+ ARGV_NONE, /* MDOC_p1003_1 */
+ ARGV_NONE, /* MDOC_p1003_1b */
+ ARGV_NONE, /* MDOC_p1003_1b_93 */
+ ARGV_NONE, /* MDOC_p1003_1c_95 */
+ ARGV_NONE, /* MDOC_p1003_1g_2000 */
+ ARGV_NONE, /* MDOC_p1003_2_92 */
+ ARGV_NONE, /* MDOC_p1387_2_95 */
+ ARGV_NONE, /* MDOC_p1003_2 */
+ ARGV_NONE, /* MDOC_p1387_2 */
+ ARGV_NONE, /* MDOC_isoC_90 */
+ ARGV_NONE, /* MDOC_isoC_amd1 */
+ ARGV_NONE, /* MDOC_isoC_tcor1 */
+ ARGV_NONE, /* MDOC_isoC_tcor2 */
+ ARGV_NONE, /* MDOC_isoC_99 */
+ ARGV_NONE, /* MDOC_ansiC */
+ ARGV_NONE, /* MDOC_ansiC_89 */
+ ARGV_NONE, /* MDOC_ansiC_99 */
+ ARGV_NONE, /* MDOC_ieee754 */
+ ARGV_NONE, /* MDOC_iso8802_3 */
+ ARGV_NONE, /* MDOC_xpg3 */
+ ARGV_NONE, /* MDOC_xpg4 */
+ ARGV_NONE, /* MDOC_xpg4_2 */
+ ARGV_NONE, /* MDOC_xpg4_3 */
+ ARGV_NONE, /* MDOC_xbd5 */
+ ARGV_NONE, /* MDOC_xcu5 */
+ ARGV_NONE, /* MDOC_xsh5 */
+ ARGV_NONE, /* MDOC_xns5 */
+ ARGV_NONE, /* MDOC_xns5_2d2_0 */
+ ARGV_NONE, /* MDOC_xcurses4_2 */
+ ARGV_NONE, /* MDOC_susv2 */
+ ARGV_NONE, /* MDOC_susv3 */
+ ARGV_NONE, /* MDOC_svid4 */
+ ARGV_NONE, /* MDOC_Filled */
+ ARGV_NONE, /* MDOC_Words */
+ ARGV_NONE, /* MDOC_Emphasis */
+ ARGV_NONE /* MDOC_Symbolic */
+};
+
+static int mdoc_argflags[MDOC_MAX] = {
+ 0, /* \" */
+ 0, /* Dd */
+ 0, /* Dt */
+ 0, /* Os */
+ 0, /* Sh */
+ 0, /* Ss */
+ ARGS_DELIM, /* Pp */
+ ARGS_DELIM, /* D1 */
+ ARGS_DELIM, /* Dl */
+ 0, /* Bd */
+ 0, /* Ed */
+ 0, /* Bl */
+ 0, /* El */
+ 0, /* It */
+ ARGS_DELIM, /* Ad */
+ ARGS_DELIM, /* An */
+ ARGS_DELIM, /* Ar */
+ ARGS_QUOTED, /* Cd */
+ ARGS_DELIM, /* Cm */
+ ARGS_DELIM, /* Dv */
+ ARGS_DELIM, /* Er */
+ ARGS_DELIM, /* Ev */
+ 0, /* Ex */
+ ARGS_DELIM | ARGS_QUOTED, /* Fa */
+ 0, /* Fd */
+ ARGS_DELIM, /* Fl */
+ ARGS_DELIM | ARGS_QUOTED, /* Fn */
+ ARGS_DELIM | ARGS_QUOTED, /* Ft */
+ ARGS_DELIM, /* Ic */
+ 0, /* In */
+ ARGS_DELIM, /* Li */
+ 0, /* Nd */
+ ARGS_DELIM, /* Nm */
+ ARGS_DELIM, /* Op */
+ 0, /* Ot */
+ ARGS_DELIM, /* Pa */
+ 0, /* Rv */
+ ARGS_DELIM, /* St */
+ ARGS_DELIM, /* Va */
+ ARGS_DELIM, /* Vt */
+ ARGS_DELIM, /* Xr */
+ ARGS_QUOTED, /* %A */
+ ARGS_QUOTED, /* %B */
+ ARGS_QUOTED, /* %D */
+ ARGS_QUOTED, /* %I */
+ ARGS_QUOTED, /* %J */
+ ARGS_QUOTED, /* %N */
+ ARGS_QUOTED, /* %O */
+ ARGS_QUOTED, /* %P */
+ ARGS_QUOTED, /* %R */
+ ARGS_QUOTED, /* %T */
+ ARGS_QUOTED, /* %V */
+ ARGS_DELIM, /* Ac */
+ 0, /* Ao */
+ ARGS_DELIM, /* Aq */
+ ARGS_DELIM, /* At */
+ ARGS_DELIM, /* Bc */
+ 0, /* Bf */
+ 0, /* Bo */
+ ARGS_DELIM, /* Bq */
+ ARGS_DELIM, /* Bsx */
+ ARGS_DELIM, /* Bx */
+ 0, /* Db */
+ ARGS_DELIM, /* Dc */
+ 0, /* Do */
+ ARGS_DELIM, /* Dq */
+ ARGS_DELIM, /* Ec */
+ 0, /* Ef */
+ ARGS_DELIM, /* Em */
+ 0, /* Eo */
+ ARGS_DELIM, /* Fx */
+ ARGS_DELIM, /* Ms */
+ ARGS_DELIM, /* No */
+ ARGS_DELIM, /* Ns */
+ ARGS_DELIM, /* Nx */
+ ARGS_DELIM, /* Ox */
+ ARGS_DELIM, /* Pc */
+ ARGS_DELIM, /* Pf */
+ 0, /* Po */
+ ARGS_DELIM, /* Pq */
+ ARGS_DELIM, /* Qc */
+ ARGS_DELIM, /* Ql */
+ 0, /* Qo */
+ ARGS_DELIM, /* Qq */
+ 0, /* Re */
+ 0, /* Rs */
+ ARGS_DELIM, /* Sc */
+ 0, /* So */
+ ARGS_DELIM, /* Sq */
+ 0, /* Sm */
+ ARGS_DELIM, /* Sx */
+ ARGS_DELIM, /* Sy */
+ ARGS_DELIM, /* Tn */
+ ARGS_DELIM, /* Ux */
+ ARGS_DELIM, /* Xc */
+ 0, /* Xo */
+ 0, /* Fo */
+ 0, /* Fc */
+ 0, /* Oo */
+ ARGS_DELIM, /* Oc */
+ 0, /* Bk */
+ 0, /* Ek */
+ 0, /* Bt */
+ 0, /* Hf */
+ 0, /* Fr */
+ 0, /* Ud */
+};
+
+
+static int
+perr(struct mdoc *mdoc, int line, int pos, int code)
+{
+ int c;
+
+ switch (code) {
+ case (EQUOTTERM):
+ c = mdoc_perr(mdoc, line, pos,
+ "unterminated quoted parameter");
+ break;
+ case (EARGVAL):
+ c = mdoc_perr(mdoc, line, pos,
+ "argument requires a value");
+ break;
+ case (EARGMANY):
+ c = mdoc_perr(mdoc, line, pos,
+ "too many values for argument");
+ break;
+ default:
+ abort();
+ /* NOTREACHED */
+ }
+ return(c);
+}
+
+
+static int
+pwarn(struct mdoc *mdoc, int line, int pos, int code)
+{
+ int c;
+
+ switch (code) {
+ case (WQUOTPARM):
+ c = mdoc_pwarn(mdoc, line, pos, WARN_SYNTAX,
+ "unexpected quoted parameter");
+ break;
+ case (WARGVPARM):
+ c = mdoc_pwarn(mdoc, line, pos, WARN_SYNTAX,
+ "argument-like parameter");
+ break;
+ case (WCOLEMPTY):
+ c = mdoc_pwarn(mdoc, line, pos, WARN_SYNTAX,
+ "last list column is empty");
+ break;
+ case (WTAILWS):
+ c = mdoc_pwarn(mdoc, line, pos, WARN_COMPAT,
+ "trailing whitespace");
+ break;
+ default:
+ abort();
+ /* NOTREACHED */
+ }
+ return(c);
+}