Mercurial > hg > octave-lyh > gnulib-hg
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;