summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorschwarze <schwarze@openbsd.org>2018-04-09 22:26:25 +0000
committerschwarze <schwarze@openbsd.org>2018-04-09 22:26:25 +0000
commit9f6d70bc16c4925437e8bbe1d678fa1b8df9b4a5 (patch)
tree76f466337f94bde25300e4f8a6df7ff4dc5870ae
parentSet trapframe pointer early on in do_el0_sync. This allows the use of (diff)
downloadwireguard-openbsd-9f6d70bc16c4925437e8bbe1d678fa1b8df9b4a5.tar.xz
wireguard-openbsd-9f6d70bc16c4925437e8bbe1d678fa1b8df9b4a5.zip
When accessing an undefined number register, define it to be zero, like
the previous commit for strings and macros, only technically simpler. Desired behaviour also mentioned by Werner Lemberg in 2011. This diff adds functionality but is -21 +19 LOC. :-)
-rw-r--r--regress/usr.bin/mandoc/roff/nr/Makefile4
-rw-r--r--regress/usr.bin/mandoc/roff/nr/undef.in24
-rw-r--r--regress/usr.bin/mandoc/roff/nr/undef.out_ascii21
-rw-r--r--usr.bin/mandoc/libmandoc.h4
-rw-r--r--usr.bin/mandoc/roff.c44
5 files changed, 69 insertions, 28 deletions
diff --git a/regress/usr.bin/mandoc/roff/nr/Makefile b/regress/usr.bin/mandoc/roff/nr/Makefile
index 8da6887869c..74f1c296207 100644
--- a/regress/usr.bin/mandoc/roff/nr/Makefile
+++ b/regress/usr.bin/mandoc/roff/nr/Makefile
@@ -1,6 +1,6 @@
-# $OpenBSD: Makefile,v 1.9 2015/01/23 00:38:43 schwarze Exp $
+# $OpenBSD: Makefile,v 1.10 2018/04/09 22:26:25 schwarze Exp $
-REGRESS_TARGETS = argc divzero eval escname int predef rr scale
+REGRESS_TARGETS = argc divzero escname eval int predef rr scale undef
LINT_TARGETS = divzero escname
.include <bsd.regress.mk>
diff --git a/regress/usr.bin/mandoc/roff/nr/undef.in b/regress/usr.bin/mandoc/roff/nr/undef.in
new file mode 100644
index 00000000000..74cb6afea3a
--- /dev/null
+++ b/regress/usr.bin/mandoc/roff/nr/undef.in
@@ -0,0 +1,24 @@
+.\" $OpenBSD: undef.in,v 1.1 2018/04/09 22:26:25 schwarze Exp $
+.TH NR-UNDEF 1 "April 9, 2018"
+.SH NAME
+nr-undef \- using an undefined number register
+.SH DESCRIPTION
+The myr register is initially
+.ie rmyr defined.
+.el undefined.
+.PP
+Its initial value is \n[myr].
+.PP
+After interpolating it, is is now
+.ie rmyr defined.
+.el undefined.
+.PP
+.nr myr 1
+After defining it to \n[myr], it is of course still
+.ie rmyr defined.
+.el undefined.
+.PP
+.rr myr
+After removing it, it is again
+.ie rmyr defined.
+.el undefined.
diff --git a/regress/usr.bin/mandoc/roff/nr/undef.out_ascii b/regress/usr.bin/mandoc/roff/nr/undef.out_ascii
new file mode 100644
index 00000000000..e7649ecaaa6
--- /dev/null
+++ b/regress/usr.bin/mandoc/roff/nr/undef.out_ascii
@@ -0,0 +1,21 @@
+NR-UNDEF(1) General Commands Manual NR-UNDEF(1)
+
+
+
+NNAAMMEE
+ nr-undef - using an undefined number register
+
+DDEESSCCRRIIPPTTIIOONN
+ The myr register is initially undefined.
+
+ Its initial value is 0.
+
+ After interpolating it, is is now defined.
+
+ After defining it to 1, it is of course still defined.
+
+ After removing it, it is again undefined.
+
+
+
+OpenBSD April 9, 2018 NR-UNDEF(1)
diff --git a/usr.bin/mandoc/libmandoc.h b/usr.bin/mandoc/libmandoc.h
index 045a8dee20f..bee6afdeb8a 100644
--- a/usr.bin/mandoc/libmandoc.h
+++ b/usr.bin/mandoc/libmandoc.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: libmandoc.h,v 1.55 2017/07/08 17:52:42 schwarze Exp $ */
+/* $OpenBSD: libmandoc.h,v 1.56 2018/04/09 22:26:25 schwarze Exp $ */
/*
* Copyright (c) 2009, 2010, 2011, 2012 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2013, 2014, 2015, 2017 Ingo Schwarze <schwarze@openbsd.org>
@@ -66,7 +66,7 @@ void roff_man_reset(struct roff_man *);
enum rofferr roff_parseln(struct roff *, int, struct buf *, int *);
void roff_endparse(struct roff *);
void roff_setreg(struct roff *, const char *, int, char sign);
-int roff_getreg(const struct roff *, const char *);
+int roff_getreg(struct roff *, const char *);
char *roff_strdup(const struct roff *, const char *);
int roff_getcontrol(const struct roff *,
const char *, int *);
diff --git a/usr.bin/mandoc/roff.c b/usr.bin/mandoc/roff.c
index ab371c9d8d0..a191d34a49c 100644
--- a/usr.bin/mandoc/roff.c
+++ b/usr.bin/mandoc/roff.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: roff.c,v 1.197 2018/04/09 02:31:37 schwarze Exp $ */
+/* $OpenBSD: roff.c,v 1.198 2018/04/09 22:26:25 schwarze Exp $ */
/*
* Copyright (c) 2008-2012, 2014 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) 2010-2015, 2017, 2018 Ingo Schwarze <schwarze@openbsd.org>
@@ -180,8 +180,7 @@ static void roff_freestr(struct roffkv *);
static size_t roff_getname(struct roff *, char **, int, int);
static int roff_getnum(const char *, int *, int *, int);
static int roff_getop(const char *, int *, char *);
-static int roff_getregn(const struct roff *,
- const char *, size_t);
+static int roff_getregn(struct roff *, const char *, size_t);
static int roff_getregro(const struct roff *,
const char *name);
static const char *roff_getstrn(struct roff *,
@@ -205,6 +204,8 @@ static enum rofferr roff_res(struct roff *, struct buf *, int, int);
static enum rofferr roff_rm(ROFF_ARGS);
static enum rofferr roff_rn(ROFF_ARGS);
static enum rofferr roff_rr(ROFF_ARGS);
+static void roff_setregn(struct roff *, const char *,
+ size_t, int, char);
static void roff_setstr(struct roff *,
const char *, const char *, int);
static void roff_setstrn(struct roffkv **, const char *,
@@ -2519,19 +2520,27 @@ roff_evalnum(struct roff *r, int ln, const char *v,
void
roff_setreg(struct roff *r, const char *name, int val, char sign)
{
+ roff_setregn(r, name, strlen(name), val, sign);
+}
+
+static void
+roff_setregn(struct roff *r, const char *name, size_t len,
+ int val, char sign)
+{
struct roffreg *reg;
/* Search for an existing register with the same name. */
reg = r->regtab;
- while (reg && strcmp(name, reg->key.p))
+ while (reg != NULL && (reg->key.sz != len ||
+ strncmp(reg->key.p, name, len) != 0))
reg = reg->next;
if (NULL == reg) {
/* Create a new register. */
reg = mandoc_malloc(sizeof(struct roffreg));
- reg->key.p = mandoc_strdup(name);
- reg->key.sz = strlen(name);
+ reg->key.p = mandoc_strndup(name, len);
+ reg->key.sz = len;
reg->val = 0;
reg->next = r->regtab;
r->regtab = reg;
@@ -2576,26 +2585,13 @@ roff_getregro(const struct roff *r, const char *name)
}
int
-roff_getreg(const struct roff *r, const char *name)
+roff_getreg(struct roff *r, const char *name)
{
- struct roffreg *reg;
- int val;
-
- if ('.' == name[0] && '\0' != name[1] && '\0' == name[2]) {
- val = roff_getregro(r, name + 1);
- if (-1 != val)
- return val;
- }
-
- for (reg = r->regtab; reg; reg = reg->next)
- if (0 == strcmp(name, reg->key.p))
- return reg->val;
-
- return 0;
+ return roff_getregn(r, name, strlen(name));
}
static int
-roff_getregn(const struct roff *r, const char *name, size_t len)
+roff_getregn(struct roff *r, const char *name, size_t len)
{
struct roffreg *reg;
int val;
@@ -2611,6 +2607,7 @@ roff_getregn(const struct roff *r, const char *name, size_t len)
0 == strncmp(name, reg->key.p, len))
return reg->val;
+ roff_setregn(r, name, len, 0, '\0');
return 0;
}
@@ -2662,14 +2659,13 @@ roff_nr(ROFF_ARGS)
keysz = roff_getname(r, &val, ln, pos);
if (key[keysz] == '\\')
return ROFF_IGN;
- key[keysz] = '\0';
sign = *val;
if (sign == '+' || sign == '-')
val++;
if (roff_evalnum(r, ln, val, NULL, &iv, ROFFNUM_SCALE))
- roff_setreg(r, key, iv, sign);
+ roff_setregn(r, key, keysz, iv, sign);
return ROFF_IGN;
}