summary refs log tree commit diff
diff options
context:
space:
mode:
authorGerrit Pape <pape@smarden.org>2007-12-23 21:24:37 +0800
committerHerbert Xu <herbert@gondor.apana.org.au>2007-12-23 21:24:37 +0800
commit469fad86703e8dc8177dc9f1a768571105292344 (patch)
treeb1a9ba02237d1d960b22ef7e2b24e0a7c1f67687
parent[BUILTIN] Add set +o support (diff)
downloaddash-469fad86703e8dc8177dc9f1a768571105292344.tar.gz
dash-469fad86703e8dc8177dc9f1a768571105292344.zip
[ARITH] If imaxdiv() isn't available, use / and % operators
Although in posix, imaxdiv() isn't implemented on Debian/alpha, causing
dash to fail to build.  So use / and % operators if imaxdiv() isn't
available.

 http://bugs.debian.org/456398

Signed-off-by: Gerrit Pape <pape@smarden.org>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-rw-r--r--ChangeLog4
-rw-r--r--configure.ac5
-rw-r--r--src/arith_yacc.c6
3 files changed, 13 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 10ec45c..56acd66 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2007-12-23  Gerrit Pape <pape@smarden.org>
+
+	* If imaxdiv() isn't available, use / and % operators.
+
 2007-12-23  Richard M Kreuter <kreuter@progn.net>
 
 	* Add set +o support.
diff --git a/configure.ac b/configure.ac
index ccc4ac1..4d739c2 100644
--- a/configure.ac
+++ b/configure.ac
@@ -33,8 +33,9 @@ dnl Checks for libraries.
 dnl Checks for header files.
 
 dnl Checks for library functions.
-AC_CHECK_FUNCS(bsearch getpwnam getrlimit isalpha killpg mempcpy sigsetmask \
-	       stpcpy strchrnul strsignal strtod strtoimax strtoumax sysconf)
+AC_CHECK_FUNCS(bsearch getpwnam getrlimit imaxdiv isalpha killpg mempcpy \
+	       sigsetmask stpcpy strchrnul strsignal strtod strtoimax \
+	       strtoumax sysconf)
 
 if test "$enable_fnmatch" = yes; then
 	use_fnmatch=
diff --git a/src/arith_yacc.c b/src/arith_yacc.c
index e473594..f4857fe 100644
--- a/src/arith_yacc.c
+++ b/src/arith_yacc.c
@@ -88,7 +88,9 @@ static inline int higher_prec(int op1, int op2)
 
 static intmax_t do_binop(int op, intmax_t a, intmax_t b)
 {
+#ifdef HAVE_IMAXDIV
 	imaxdiv_t div;
+#endif
 
 	switch (op) {
 	default:
@@ -96,8 +98,12 @@ static intmax_t do_binop(int op, intmax_t a, intmax_t b)
 	case ARITH_DIV:
 		if (!b)
 			yyerror("division by zero");
+#ifdef HAVE_IMAXDIV
 		div = imaxdiv(a, b);
 		return op == ARITH_REM ? div.rem : div.quot;
+#else
+		return op == ARITH_REM ? a % b : a / b;
+#endif
 	case ARITH_MUL:
 		return a * b;
 	case ARITH_ADD: