source@mandoc.bsd.lv
 help / color / mirror / Atom feed
* mandoc: When accessing an undefined number register, define it to be
@ 2018-04-09 22:27 schwarze
  0 siblings, 0 replies; only message in thread
From: schwarze @ 2018-04-09 22:27 UTC (permalink / raw)
  To: source

Log Message:
-----------
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.  :-)

Modified Files:
--------------
    mandoc:
        libmandoc.h
        roff.c
    mandoc/regress/roff/nr:
        Makefile

Added Files:
-----------
    mandoc/regress/roff/nr:
        undef.in
        undef.out_ascii

Revision Data
-------------
Index: roff.c
===================================================================
RCS file: /home/cvs/mandoc/mandoc/roff.c,v
retrieving revision 1.325
retrieving revision 1.326
diff -Lroff.c -Lroff.c -u -p -r1.325 -r1.326
--- roff.c
+++ roff.c
@@ -182,8 +182,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 *,
@@ -207,6 +206,8 @@ static	enum rofferr	 roff_res(struct rof
 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 *,
@@ -2521,19 +2522,27 @@ roff_evalnum(struct roff *r, int ln, con
 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;
@@ -2578,26 +2587,13 @@ roff_getregro(const struct roff *r, cons
 }
 
 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;
@@ -2613,6 +2609,7 @@ roff_getregn(const struct roff *r, const
 		    0 == strncmp(name, reg->key.p, len))
 			return reg->val;
 
+	roff_setregn(r, name, len, 0, '\0');
 	return 0;
 }
 
@@ -2664,14 +2661,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;
 }
Index: libmandoc.h
===================================================================
RCS file: /home/cvs/mandoc/mandoc/libmandoc.h,v
retrieving revision 1.70
retrieving revision 1.71
diff -Llibmandoc.h -Llibmandoc.h -u -p -r1.70 -r1.71
--- libmandoc.h
+++ libmandoc.h
@@ -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 *);
--- /dev/null
+++ regress/roff/nr/undef.in
@@ -0,0 +1,24 @@
+.\" $OpenBSD: divzero.in,v 1.3 2017/07/04 14:53:27 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.
--- /dev/null
+++ regress/roff/nr/undef.out_ascii
@@ -0,0 +1,21 @@
+NR-UNDEF(1)                 General Commands Manual                NR-UNDEF(1)
+
+
+
+N\bNA\bAM\bME\bE
+       nr-undef - using an undefined number register
+
+D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
+       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)
Index: Makefile
===================================================================
RCS file: /home/cvs/mandoc/mandoc/regress/roff/nr/Makefile,v
retrieving revision 1.1
retrieving revision 1.2
diff -Lregress/roff/nr/Makefile -Lregress/roff/nr/Makefile -u -p -r1.1 -r1.2
--- regress/roff/nr/Makefile
+++ regress/roff/nr/Makefile
@@ -1,6 +1,6 @@
 # $OpenBSD: Makefile,v 1.9 2015/01/23 00:38:43 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>
--
 To unsubscribe send an email to source+unsubscribe@mandoc.bsd.lv

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2018-04-09 22:27 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-04-09 22:27 mandoc: When accessing an undefined number register, define it to be schwarze

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).