-/* $Id: man_macro.c,v 1.7 2009/03/25 16:07:36 kristaps Exp $ */
+/* $Id: man_macro.c,v 1.17 2009/06/18 10:53:58 kristaps Exp $ */
/*
- * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@openbsd.org>
+ * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
*
* Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the
- * above copyright notice and this permission notice appear in all
- * copies.
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
*
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
- * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
- * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
- * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
- * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include <assert.h>
#include <ctype.h>
-#include <err.h> /* XXX */
#include <stdlib.h>
-#include <stdio.h>
#include <string.h>
#include "libman.h"
+#define FL_NLINE (1 << 0)
+#define FL_TLINE (1 << 1)
+
static int man_args(struct man *, int,
int *, char *, char **);
+static int man_flags[MAN_MAX] = {
+ 0, /* br */
+ 0, /* TH */
+ 0, /* SH */
+ 0, /* SS */
+ FL_TLINE, /* TP */
+ 0, /* LP */
+ 0, /* PP */
+ 0, /* P */
+ 0, /* IP */
+ 0, /* HP */
+ FL_NLINE, /* SM */
+ FL_NLINE, /* SB */
+ FL_NLINE, /* BI */
+ FL_NLINE, /* IB */
+ FL_NLINE, /* BR */
+ FL_NLINE, /* RB */
+ FL_NLINE, /* R */
+ FL_NLINE, /* B */
+ FL_NLINE, /* I */
+ FL_NLINE, /* IR */
+ FL_NLINE, /* RI */
+ 0, /* na */
+ FL_NLINE, /* i */
+};
int
man_macro(struct man *man, int tok, int line,
man->next = MAN_NEXT_SIBLING;
}
+ if (n == man->last && (FL_NLINE & man_flags[tok])) {
+ if (MAN_NLINE & man->flags)
+ return(man_perr(man, line, ppos, WLNSCOPE));
+ man->flags |= MAN_NLINE;
+ return(1);
+ }
+
+ if (FL_TLINE & man_flags[tok]) {
+ if (MAN_NLINE & man->flags)
+ return(man_perr(man, line, ppos, WLNSCOPE));
+ man->flags |= MAN_NLINE;
+ return(1);
+ }
+
/*
* Note that when TH is pruned, we'll be back at the root, so
* make sure that we don't clobber as its sibling.
/* ARGSUSED */
static int
-man_args(struct man *man, int line,
+man_args(struct man *m, int line,
int *pos, char *buf, char **v)
{
if (buf[*pos])
return(1);
- warnx("tail whitespace");
- return(-1);
+ if ( ! man_pwarn(m, line, *pos, WTSPACE))
+ return(-1);
+
+ return(1);
}
/*
(*pos)++;
if (0 == buf[*pos]) {
- warnx("unterminated quotation");
- return(-1);
+ if ( ! man_pwarn(m, line, *pos, WTQUOTE))
+ return(-1);
+ return(1);
}
buf[(*pos)++] = 0;
if (buf[*pos])
return(1);
- warnx("tail whitespace");
- return(-1);
+ if ( ! man_pwarn(m, line, *pos, WTSPACE))
+ return(-1);
+ return(1);
}