summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--regress/usr.bin/mandoc/roff/Makefile4
-rw-r--r--regress/usr.bin/mandoc/roff/it/Makefile5
-rw-r--r--regress/usr.bin/mandoc/roff/it/double.in16
-rw-r--r--regress/usr.bin/mandoc/roff/it/double.out_ascii13
-rw-r--r--regress/usr.bin/mandoc/roff/it/text.in18
-rw-r--r--regress/usr.bin/mandoc/roff/it/text.out_ascii11
-rw-r--r--usr.bin/mandoc/mandoc.h5
-rw-r--r--usr.bin/mandoc/read.c3
-rw-r--r--usr.bin/mandoc/roff.c69
9 files changed, 128 insertions, 16 deletions
diff --git a/regress/usr.bin/mandoc/roff/Makefile b/regress/usr.bin/mandoc/roff/Makefile
index 28a1dc82a47..9bda8849053 100644
--- a/regress/usr.bin/mandoc/roff/Makefile
+++ b/regress/usr.bin/mandoc/roff/Makefile
@@ -1,7 +1,7 @@
-# $OpenBSD: Makefile,v 1.12 2012/07/18 16:55:54 schwarze Exp $
+# $OpenBSD: Makefile,v 1.13 2013/07/13 12:51:38 schwarze Exp $
SUBDIR = args cond esc string
-SUBDIR += br cc de ds na ps rm sp
+SUBDIR += br cc de ds it na ps rm sp
ascii groff groff-clean obj-clean tman: _SUBDIRUSE
diff --git a/regress/usr.bin/mandoc/roff/it/Makefile b/regress/usr.bin/mandoc/roff/it/Makefile
new file mode 100644
index 00000000000..351d1cde730
--- /dev/null
+++ b/regress/usr.bin/mandoc/roff/it/Makefile
@@ -0,0 +1,5 @@
+# $OpenBSD: Makefile,v 1.1 2013/07/13 12:51:38 schwarze Exp $
+
+REGRESS_TARGETS = text double
+
+.include <bsd.regress.mk>
diff --git a/regress/usr.bin/mandoc/roff/it/double.in b/regress/usr.bin/mandoc/roff/it/double.in
new file mode 100644
index 00000000000..d0a93e1ebac
--- /dev/null
+++ b/regress/usr.bin/mandoc/roff/it/double.in
@@ -0,0 +1,16 @@
+.TH IT-DOUBLE 1 2013-07-13 OpenBSD
+.SH NAME
+it-double \- double input line trap
+.SH DESCRIPTION
+.de firstmacro
+firstmacro
+..
+.de secondmacro
+secondmacro
+..
+initial text
+.it 1 firstmacro
+.it 2 secondmacro
+first line
+second line
+third line
diff --git a/regress/usr.bin/mandoc/roff/it/double.out_ascii b/regress/usr.bin/mandoc/roff/it/double.out_ascii
new file mode 100644
index 00000000000..c8c285da8fc
--- /dev/null
+++ b/regress/usr.bin/mandoc/roff/it/double.out_ascii
@@ -0,0 +1,13 @@
+IT-DOUBLE(1) OpenBSD Reference Manual IT-DOUBLE(1)
+
+
+
+NNAAMMEE
+ it-double - double input line trap
+
+DDEESSCCRRIIPPTTIIOONN
+ initial text first line second line secondmacro third line
+
+
+
+OpenBSD 2013-07-13 IT-DOUBLE(1)
diff --git a/regress/usr.bin/mandoc/roff/it/text.in b/regress/usr.bin/mandoc/roff/it/text.in
new file mode 100644
index 00000000000..4eeac2bdf44
--- /dev/null
+++ b/regress/usr.bin/mandoc/roff/it/text.in
@@ -0,0 +1,18 @@
+.Dd $Mdocdate: July 13 2013 $
+.Dt IT-TEXT 1
+.Os OpenBSD
+.Sh NAME
+.Nm it-text
+.Nd what an input line trap counts as text
+.Sh DESCRIPTION
+.de mytrap
+traptext
+..
+initial text
+.it 1 mytrap
+plain text line
+another plain text line
+.it 1 mytrap
+.Pp
+first line after .Pp
+second line after .Pp
diff --git a/regress/usr.bin/mandoc/roff/it/text.out_ascii b/regress/usr.bin/mandoc/roff/it/text.out_ascii
new file mode 100644
index 00000000000..3eab2c4efc5
--- /dev/null
+++ b/regress/usr.bin/mandoc/roff/it/text.out_ascii
@@ -0,0 +1,11 @@
+IT-TEXT(1) OpenBSD Reference Manual IT-TEXT(1)
+
+NNAAMMEE
+ iitt--tteexxtt - what an input line trap counts as text
+
+DDEESSCCRRIIPPTTIIOONN
+ initial text plain text line traptext another plain text line
+
+ first line after .Pp traptext second line after .Pp
+
+OpenBSD July 13, 2013 OpenBSD
diff --git a/usr.bin/mandoc/mandoc.h b/usr.bin/mandoc/mandoc.h
index 32b56ce5670..f1e8ef80c0e 100644
--- a/usr.bin/mandoc/mandoc.h
+++ b/usr.bin/mandoc/mandoc.h
@@ -1,7 +1,7 @@
-/* $Id: mandoc.h,v 1.51 2013/05/31 21:37:08 schwarze Exp $ */
+/* $Id: mandoc.h,v 1.52 2013/07/13 12:51:37 schwarze Exp $ */
/*
* Copyright (c) 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
- * Copyright (c) 2012 Ingo Schwarze <schwarze@openbsd.org>
+ * Copyright (c) 2012, 2013 Ingo Schwarze <schwarze@openbsd.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -145,6 +145,7 @@ enum mandocerr {
MANDOCERR_NOARGS, /* macro requires line argument(s) */
MANDOCERR_NOBODY, /* macro requires body argument(s) */
MANDOCERR_NOARGV, /* macro requires argument(s) */
+ MANDOCERR_NUMERIC, /* request requires a numeric argument */
MANDOCERR_LISTTYPE, /* missing list type */
MANDOCERR_ARGSLOST, /* line argument(s) will be lost */
MANDOCERR_BODYLOST, /* body argument(s) will be lost */
diff --git a/usr.bin/mandoc/read.c b/usr.bin/mandoc/read.c
index f2e03cf11bf..bb85374e636 100644
--- a/usr.bin/mandoc/read.c
+++ b/usr.bin/mandoc/read.c
@@ -1,4 +1,4 @@
-/* $Id: read.c,v 1.15 2013/06/02 03:35:21 schwarze Exp $ */
+/* $Id: read.c,v 1.16 2013/07/13 12:51:38 schwarze Exp $ */
/*
* Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2010, 2011, 2012, 2013 Ingo Schwarze <schwarze@openbsd.org>
@@ -177,6 +177,7 @@ static const char * const mandocerrs[MANDOCERR_MAX] = {
"macro requires line argument(s)",
"macro requires body argument(s)",
"macro requires argument(s)",
+ "request requires a numeric argument",
"missing list type",
"line argument(s) will be lost",
"body argument(s) will be lost",
diff --git a/usr.bin/mandoc/roff.c b/usr.bin/mandoc/roff.c
index c6341b52fa4..c5fb1043eb1 100644
--- a/usr.bin/mandoc/roff.c
+++ b/usr.bin/mandoc/roff.c
@@ -1,4 +1,4 @@
-/* $Id: roff.c,v 1.50 2013/06/27 09:48:22 schwarze Exp $ */
+/* $Id: roff.c,v 1.51 2013/07/13 12:51:38 schwarze Exp $ */
/*
* Copyright (c) 2010, 2011, 2012 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2010, 2011, 2012, 2013 Ingo Schwarze <schwarze@openbsd.org>
@@ -17,6 +17,7 @@
*/
#include <assert.h>
#include <ctype.h>
+#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -182,12 +183,13 @@ static void roff_freestr(struct roffkv *);
static char *roff_getname(struct roff *, char **, int, int);
static const char *roff_getstrn(const struct roff *,
const char *, size_t);
+static enum rofferr roff_it(ROFF_ARGS);
static enum rofferr roff_line_ignore(ROFF_ARGS);
static enum rofferr roff_nr(ROFF_ARGS);
static void roff_openeqn(struct roff *, const char *,
int, int, const char *);
static enum rofft roff_parse(struct roff *, const char *, int *);
-static enum rofferr roff_parsetext(char *);
+static enum rofferr roff_parsetext(char **, size_t *, int, int *);
static enum rofferr roff_res(struct roff *,
char **, size_t *, int, int);
static enum rofferr roff_rm(ROFF_ARGS);
@@ -229,7 +231,7 @@ static struct roffmac roffs[ROFF_MAX] = {
{ "ie", roff_cond, roff_cond_text, roff_cond_sub, ROFFMAC_STRUCT, NULL },
{ "if", roff_cond, roff_cond_text, roff_cond_sub, ROFFMAC_STRUCT, NULL },
{ "ig", roff_block, roff_block_text, roff_block_sub, 0, NULL },
- { "it", roff_line_ignore, NULL, NULL, 0, NULL },
+ { "it", roff_it, NULL, NULL, 0, NULL },
{ "ne", roff_line_ignore, NULL, NULL, 0, NULL },
{ "nh", roff_line_ignore, NULL, NULL, 0, NULL },
{ "nr", roff_nr, NULL, NULL, 0, NULL },
@@ -291,6 +293,9 @@ static const struct predef predefs[PREDEFS_MAX] = {
/* See roffhash_find() */
#define ROFF_HASH(p) (p[0] - ASCII_LO)
+static int roffit_lines; /* number of lines to delay */
+static char *roffit_macro; /* nil-terminated macro line */
+
static void
roffhash_init(void)
{
@@ -592,16 +597,20 @@ again:
}
/*
- * Process text streams: convert all breakable hyphens into ASCII_HYPH.
+ * Process text streams:
+ * Convert all breakable hyphens into ASCII_HYPH.
+ * Decrement and spring input line trap.
*/
static enum rofferr
-roff_parsetext(char *p)
+roff_parsetext(char **bufp, size_t *szp, int pos, int *offs)
{
size_t sz;
const char *start;
+ char *p;
+ int isz;
enum mandoc_esc esc;
- start = p;
+ start = p = *bufp + pos;
while ('\0' != *p) {
sz = strcspn(p, "-\\");
@@ -629,6 +638,22 @@ roff_parsetext(char *p)
p++;
}
+ /* Spring the input line trap. */
+ if (1 == roffit_lines) {
+ isz = asprintf(&p, "%s\n.%s", *bufp, roffit_macro);
+ if (-1 == isz) {
+ perror(NULL);
+ exit((int)MANDOCLEVEL_SYSERR);
+ }
+ free(*bufp);
+ *bufp = p;
+ *szp = isz + 1;
+ *offs = 0;
+ free(roffit_macro);
+ roffit_lines = 0;
+ return(ROFF_REPARSE);
+ } else if (1 < roffit_lines)
+ --roffit_lines;
return(ROFF_CONT);
}
@@ -673,13 +698,13 @@ roff_parseln(struct roff *r, int ln, char **bufp,
return(eqn_read(&r->eqn, ln, *bufp, pos, offs));
if (r->tbl)
return(tbl_read(r->tbl, ln, *bufp, pos));
- return(roff_parsetext(*bufp + pos));
+ return(roff_parsetext(bufp, szp, pos, offs));
} else if ( ! ctl) {
if (r->eqn)
return(eqn_read(&r->eqn, ln, *bufp, pos, offs));
if (r->tbl)
return(tbl_read(r->tbl, ln, *bufp, pos));
- return(roff_parsetext(*bufp + pos));
+ return(roff_parsetext(bufp, szp, pos, offs));
} else if (r->eqn)
return(eqn_read(&r->eqn, ln, *bufp, ppos, offs));
@@ -1116,9 +1141,6 @@ static enum rofferr
roff_line_ignore(ROFF_ARGS)
{
- if (ROFF_it == tok)
- mandoc_msg(MANDOCERR_REQUEST, r->parse, ln, ppos, "it");
-
return(ROFF_IGN);
}
@@ -1293,6 +1315,31 @@ roff_rm(ROFF_ARGS)
/* ARGSUSED */
static enum rofferr
+roff_it(ROFF_ARGS)
+{
+ char *cp;
+ size_t len;
+ int iv;
+
+ /* Parse the number of lines. */
+ cp = *bufp + pos;
+ len = strcspn(cp, " \t");
+ cp[len] = '\0';
+ if ((iv = mandoc_strntoi(cp, len, 10)) <= 0) {
+ mandoc_msg(MANDOCERR_NUMERIC, r->parse,
+ ln, ppos, *bufp + 1);
+ return(ROFF_IGN);
+ }
+ cp += len + 1;
+
+ /* Arm the input line trap. */
+ roffit_lines = iv;
+ roffit_macro = mandoc_strdup(cp);
+ return(ROFF_IGN);
+}
+
+/* ARGSUSED */
+static enum rofferr
roff_Dd(ROFF_ARGS)
{
const char *const *cp;