changeset 1294:24aee8551316

Merge with the version from textutils.
author Jim Meyering <jim@meyering.net>
date Tue, 31 Mar 1998 13:14:22 +0000
parents 2bb4c9c36a9f
children 9c879b706f20
files lib/xstrtol.c
diffstat 1 files changed, 23 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/lib/xstrtol.c
+++ b/lib/xstrtol.c
@@ -68,16 +68,22 @@
 
 #include "xstrtol.h"
 
-#define BKM_SCALE(x, scale_factor, error_return)			\
-      do								\
-	{								\
-	  if ((x) > (double) __ZLONG_MAX / (scale_factor))		\
-	    return (error_return);					\
-	  (x) *= (scale_factor);					\
-	}								\
-      while (0)
+__unsigned long int __strtol ();
 
-__unsigned long int __strtol ();
+static int
+bkm_scale (x, scale_factor)
+     __unsigned long int *x;
+     int scale_factor;
+{
+  /* The cast to `__unsigned long int' before the cast to double is
+     required to work around a bug in SunOS's /bin/cc.  */
+  if (*x > (double) ((__unsigned long int) __ZLONG_MAX) / scale_factor)
+    {
+      return 1;
+    }
+  *x *= scale_factor;
+  return 0;
+}
 
 /* FIXME: comment.  */
 
@@ -121,7 +127,8 @@
       switch (**p)
 	{
 	case 'b':
-	  BKM_SCALE (tmp, 512, LONGINT_OVERFLOW);
+	  if (bkm_scale (&tmp, 512))
+	    return LONGINT_OVERFLOW;
 	  ++(*p);
 	  break;
 
@@ -131,17 +138,20 @@
 
 	case 'B':
 	case 'k':
-	  BKM_SCALE (tmp, 1024, LONGINT_OVERFLOW);
+	  if (bkm_scale (&tmp, 1024))
+	    return LONGINT_OVERFLOW;
 	  ++(*p);
 	  break;
 
 	case 'm':
-	  BKM_SCALE (tmp, 1024 * 1024, LONGINT_OVERFLOW);
+	  if (bkm_scale (&tmp, 1024 * 1024))
+	    return LONGINT_OVERFLOW;
 	  ++(*p);
 	  break;
 
 	case 'w':
-	  BKM_SCALE (tmp, 2, LONGINT_OVERFLOW);
+	  if (bkm_scale (&tmp, 2))
+	    return LONGINT_OVERFLOW;
 	  ++(*p);
 	  break;