summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc Espie <espie@cvs.openbsd.org>2005-05-29 18:44:37 +0000
committerMarc Espie <espie@cvs.openbsd.org>2005-05-29 18:44:37 +0000
commite3bec23801625290db4be31b65ff84ec71c78a40 (patch)
tree810f382e963f8624d80b38ccce29a27cc5a8f76f
parentecd0e847cc9b1f379243478ab2c1443cca6b79e8 (diff)
fix a few minor compatibility issues.
- let eval() handle a base and number of digits, like it's advertized to. - in gnu-mode, undivert can take file names as arguments. - in gnu-mode, map can handle reversed charsets. Suggestions and okay otto@, mostly prompted by looking at the regress tests in newer gnu-m4.
-rw-r--r--usr.bin/m4/eval.c61
-rw-r--r--usr.bin/m4/extern.h4
-rw-r--r--usr.bin/m4/gnum4.c17
-rw-r--r--usr.bin/m4/misc.c28
4 files changed, 91 insertions, 19 deletions
diff --git a/usr.bin/m4/eval.c b/usr.bin/m4/eval.c
index 87e036ab27a..9613afe8929 100644
--- a/usr.bin/m4/eval.c
+++ b/usr.bin/m4/eval.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: eval.c,v 1.55 2005/03/02 10:12:15 espie Exp $ */
+/* $OpenBSD: eval.c,v 1.56 2005/05/29 18:44:36 espie Exp $ */
/* $NetBSD: eval.c,v 1.7 1996/11/10 21:21:29 pk Exp $ */
/*
@@ -37,7 +37,7 @@
#if 0
static char sccsid[] = "@(#)eval.c 8.2 (Berkeley) 4/27/95";
#else
-static char rcsid[] = "$OpenBSD: eval.c,v 1.55 2005/03/02 10:12:15 espie Exp $";
+static char rcsid[] = "$OpenBSD: eval.c,v 1.56 2005/05/29 18:44:36 espie Exp $";
#endif
#endif /* not lint */
@@ -49,6 +49,7 @@ static char rcsid[] = "$OpenBSD: eval.c,v 1.55 2005/03/02 10:12:15 espie Exp $";
#include <sys/types.h>
#include <errno.h>
+#include <limits.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
@@ -178,9 +179,27 @@ expand_builtin(const char *argv[], int argc, int td)
* doexpr - evaluate arithmetic
* expression
*/
+ {
+ int base = 10;
+ int maxdigits = 0;
+ const char *errstr;
+
+ if (argc > 3) {
+ base = strtonum(argv[3], 2, 36, &errstr);
+ if (errstr) {
+ errx(1, "base %s invalid", argv[3]);
+ }
+ }
+ if (argc > 4) {
+ maxdigits = strtonum(argv[4], 0, INT_MAX, &errstr);
+ if (errstr) {
+ errx(1, "maxdigits %s invalid", argv[4]);
+ }
+ }
if (argc > 2)
- pbnum(expr(argv[2]));
+ pbnumbase(expr(argv[2]), base, maxdigits);
break;
+ }
case IFELTYPE:
if (argc > 4)
@@ -866,10 +885,15 @@ doundiv(const char *argv[], int argc)
if (argc > 2) {
for (ind = 2; ind < argc; ind++) {
- n = atoi(argv[ind]);
- if (n > 0 && n < maxout && outfile[n] != NULL)
- getdiv(n);
-
+ const char *errstr;
+ n = strtonum(argv[ind], 1, INT_MAX, &errstr);
+ if (errstr) {
+ if (errno == EINVAL && mimic_gnu)
+ getdivfile(argv[ind]);
+ } else {
+ if (n < maxout && outfile[n] != NULL)
+ getdiv(n);
+ }
}
}
else
@@ -1011,12 +1035,23 @@ handledash(char *buffer, char *end, const char *src)
while(*src) {
if (src[1] == '-' && src[2]) {
unsigned char i;
- for (i = (unsigned char)src[0];
- i <= (unsigned char)src[2]; i++) {
- *p++ = i;
- if (p == end) {
- *p = '\0';
- return buffer;
+ if ((unsigned char)src[0] <= (unsigned char)src[2]) {
+ for (i = (unsigned char)src[0];
+ i <= (unsigned char)src[2]; i++) {
+ *p++ = i;
+ if (p == end) {
+ *p = '\0';
+ return buffer;
+ }
+ }
+ } else {
+ for (i = (unsigned char)src[0];
+ i >= (unsigned char)src[2]; i--) {
+ *p++ = i;
+ if (p == end) {
+ *p = '\0';
+ return buffer;
+ }
}
}
src += 3;
diff --git a/usr.bin/m4/extern.h b/usr.bin/m4/extern.h
index b8d87281ad8..2ee7924863d 100644
--- a/usr.bin/m4/extern.h
+++ b/usr.bin/m4/extern.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: extern.h,v 1.40 2005/03/02 10:12:15 espie Exp $ */
+/* $OpenBSD: extern.h,v 1.41 2005/05/29 18:44:36 espie Exp $ */
/* $NetBSD: extern.h,v 1.3 1996/01/13 23:25:24 pk Exp $ */
/*-
@@ -55,6 +55,7 @@ extern void doprintlineno(struct input_file *);
extern void doprintfilename(struct input_file *);
extern void doesyscmd(const char *);
+extern void getdivfile(const char *);
/* look.c */
@@ -96,6 +97,7 @@ extern void initspaces(void);
extern void killdiv(void);
extern void onintr(int);
extern void pbnum(int);
+extern void pbnumbase(int, int, int);
extern void pbunsigned(unsigned long);
extern void pbstr(const char *);
extern void putback(int);
diff --git a/usr.bin/m4/gnum4.c b/usr.bin/m4/gnum4.c
index 190b2533172..6e6e51b3c8f 100644
--- a/usr.bin/m4/gnum4.c
+++ b/usr.bin/m4/gnum4.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: gnum4.c,v 1.30 2005/05/21 10:33:48 espie Exp $ */
+/* $OpenBSD: gnum4.c,v 1.31 2005/05/29 18:44:36 espie Exp $ */
/*
* Copyright (c) 1999 Marc Espie
@@ -551,3 +551,18 @@ doesyscmd(const char *cmd)
pbstr(getstring());
}
}
+
+void
+getdivfile(const char *name)
+{
+ FILE *f;
+ int c;
+
+ f = fopen(name, "r");
+ if (!f)
+ return;
+
+ while ((c = getc(f))!= EOF)
+ putc(c, active);
+ (void) fclose(f);
+}
diff --git a/usr.bin/m4/misc.c b/usr.bin/m4/misc.c
index 83c5bf4e2e7..cf608d36024 100644
--- a/usr.bin/m4/misc.c
+++ b/usr.bin/m4/misc.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: misc.c,v 1.30 2003/11/17 17:12:10 espie Exp $ */
+/* $OpenBSD: misc.c,v 1.31 2005/05/29 18:44:36 espie Exp $ */
/* $NetBSD: misc.c,v 1.6 1995/09/28 05:37:41 tls Exp $ */
/*
@@ -37,7 +37,7 @@
#if 0
static char sccsid[] = "@(#)misc.c 8.1 (Berkeley) 6/6/93";
#else
-static char rcsid[] = "$OpenBSD: misc.c,v 1.30 2003/11/17 17:12:10 espie Exp $";
+static char rcsid[] = "$OpenBSD: misc.c,v 1.31 2005/05/29 18:44:36 espie Exp $";
#endif
#endif /* not lint */
@@ -119,13 +119,33 @@ pbstr(const char *s)
void
pbnum(int n)
{
+ pbnumbase(n, 10, 0);
+}
+
+void
+pbnumbase(int n, int base, int d)
+{
+ static char digits[36] = "0123456789abcdefghijklmnopqrstuvwxyz";
int num;
+ int printed = 0;
+
+ if (base > 36)
+ errx(1, "base %d > 36: not supported", base);
+
+ if (base < 2)
+ errx(1, "bad base %d for conversion", base);
num = (n < 0) ? -n : n;
do {
- putback(num % 10 + '0');
+ putback(digits[num % base]);
+ printed++;
}
- while ((num /= 10) > 0);
+ while ((num /= base) > 0);
+
+ if (n < 0)
+ printed++;
+ while (printed++ < d)
+ putback('0');
if (n < 0)
putback('-');