From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from localhost (fantadrom.bsd.lv [local]) by fantadrom.bsd.lv (OpenSMTPD) with ESMTPA id c8a858d0 for ; Mon, 9 Apr 2018 17:27:07 -0500 (EST) Date: Mon, 9 Apr 2018 17:27:07 -0500 (EST) X-Mailinglist: mandoc-source Reply-To: source@mandoc.bsd.lv MIME-Version: 1.0 From: schwarze@mandoc.bsd.lv To: source@mandoc.bsd.lv Subject: mandoc: When accessing an undefined number register, define it to be X-Mailer: activitymail 1.26, http://search.cpan.org/dist/activitymail/ Content-Type: text/plain; charset=utf-8 Message-Id: <84f5582f3dbba079@fantadrom.bsd.lv> 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) + + + +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) 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 -- To unsubscribe send an email to source+unsubscribe@mandoc.bsd.lv