diff options
author | Jim Meyering <jim@meyering.net> | 1998-03-31 13:14:22 +0000 |
---|---|---|
committer | Jim Meyering <jim@meyering.net> | 1998-03-31 13:14:22 +0000 |
commit | 45e8e5c550c1ba88a8e3f0d8ffdeeb16627568a4 (patch) | |
tree | 84b7d16e6da486249c2ba1f12bd73aa587cd74b1 /lib/xstrtol.c | |
parent | 69412999dc8aade3eef0541389f8ca563683523e (diff) | |
download | coreutils-45e8e5c550c1ba88a8e3f0d8ffdeeb16627568a4.tar.xz |
Merge with the version from textutils.
Diffstat (limited to 'lib/xstrtol.c')
-rw-r--r-- | lib/xstrtol.c | 36 |
1 files changed, 23 insertions, 13 deletions
diff --git a/lib/xstrtol.c b/lib/xstrtol.c index 29dc0773f..3947b5fdc 100644 --- a/lib/xstrtol.c +++ b/lib/xstrtol.c @@ -68,17 +68,23 @@ extern int errno; #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 (); +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. */ strtol_error @@ -121,7 +127,8 @@ __xstrtol (s, ptr, base, val, valid_suffixes) switch (**p) { case 'b': - BKM_SCALE (tmp, 512, LONGINT_OVERFLOW); + if (bkm_scale (&tmp, 512)) + return LONGINT_OVERFLOW; ++(*p); break; @@ -131,17 +138,20 @@ __xstrtol (s, ptr, base, val, valid_suffixes) 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; |