projects
/
gnulib.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
frexpl: Update autoconf test.
[gnulib.git]
/
lib
/
strtol.c
diff --git
a/lib/strtol.c
b/lib/strtol.c
index
0b2c82a
..
6c15d11
100644
(file)
--- a/
lib/strtol.c
+++ b/
lib/strtol.c
@@
-1,8
+1,7
@@
/* Convert string representation of a number into an integer value.
/* Convert string representation of a number into an integer value.
- Copyright (C) 1991, 1992, 1994, 1995, 1996, 1997, 1998, 1999, 2003, 2005,
- 2006, 2007
- Free Software Foundation, Inc.
+ Copyright (C) 1991-1992, 1994-1999, 2003, 2005-2007, 2009-2011 Free Software
+ Foundation, Inc.
NOTE: The canonical source of this file is maintained with the GNU C
Library. Bugs can be reported to bug-glibc@gnu.org.
NOTE: The canonical source of this file is maintained with the GNU C
Library. Bugs can be reported to bug-glibc@gnu.org.
@@
-115,9
+114,9
@@
operating on `long long int's. */
#ifdef QUAD
# define LONG long long
operating on `long long int's. */
#ifdef QUAD
# define LONG long long
-# define STRTOL_LONG_MIN L
ONG_
LONG_MIN
-# define STRTOL_LONG_MAX L
ONG_
LONG_MAX
-# define STRTOL_ULONG_MAX UL
ONG_
LONG_MAX
+# define STRTOL_LONG_MIN LLONG_MIN
+# define STRTOL_LONG_MAX LLONG_MAX
+# define STRTOL_ULONG_MAX ULLONG_MAX
/* The extra casts in the following macros work around compiler bugs,
e.g., in Cray C 5.0.3.0. */
/* The extra casts in the following macros work around compiler bugs,
e.g., in Cray C 5.0.3.0. */
@@
-139,28
+138,28
@@
your host. */
# define TYPE_MINIMUM(t) \
((t) (! TYPE_SIGNED (t) \
your host. */
# define TYPE_MINIMUM(t) \
((t) (! TYPE_SIGNED (t) \
- ? (t) 0 \
- : TYPE_SIGNED_MAGNITUDE (t) \
- ? ~ (t) 0 \
-
: ~ (t) 0 << (sizeof (t) * CHAR_BIT - 1
)))
+
? (t) 0 \
+
: TYPE_SIGNED_MAGNITUDE (t) \
+
? ~ (t) 0 \
+
: ~ TYPE_MAXIMUM (t
)))
# define TYPE_MAXIMUM(t) \
((t) (! TYPE_SIGNED (t) \
# define TYPE_MAXIMUM(t) \
((t) (! TYPE_SIGNED (t) \
- ? (t) -1 \
-
: ~ (~ (t) 0 << (sizeof (t) * CHAR_BIT - 1)
)))
+
? (t) -1 \
+
: ((((t) 1 << (sizeof (t) * CHAR_BIT - 2)) - 1) * 2 + 1
)))
-# ifndef UL
ONG_
LONG_MAX
-# define UL
ONG_
LONG_MAX TYPE_MAXIMUM (unsigned long long)
+# ifndef ULLONG_MAX
+# define ULLONG_MAX TYPE_MAXIMUM (unsigned long long)
# endif
# endif
-# ifndef L
ONG_
LONG_MAX
-# define L
ONG_
LONG_MAX TYPE_MAXIMUM (long long int)
+# ifndef LLONG_MAX
+# define LLONG_MAX TYPE_MAXIMUM (long long int)
# endif
# endif
-# ifndef L
ONG_
LONG_MIN
-# define L
ONG_
LONG_MIN TYPE_MINIMUM (long long int)
+# ifndef LLONG_MIN
+# define LLONG_MIN TYPE_MINIMUM (long long int)
# endif
# if __GNUC__ == 2 && __GNUC_MINOR__ < 7
/* Work around gcc bug with using this constant. */
# endif
# if __GNUC__ == 2 && __GNUC_MINOR__ < 7
/* Work around gcc bug with using this constant. */
- static const unsigned long long int maxquad = UL
ONG_
LONG_MAX;
+ static const unsigned long long int maxquad = ULLONG_MAX;
# undef STRTOL_ULONG_MAX
# define STRTOL_ULONG_MAX maxquad
# endif
# undef STRTOL_ULONG_MAX
# define STRTOL_ULONG_MAX maxquad
# endif
@@
-187,9
+186,8
@@
# define LOCALE_PARAM_PROTO
#endif
# define LOCALE_PARAM_PROTO
#endif
-#include <wchar.h>
-
#ifdef USE_WIDE_CHAR
#ifdef USE_WIDE_CHAR
+# include <wchar.h>
# include <wctype.h>
# define L_(Ch) L##Ch
# define UCHAR_TYPE wint_t
# include <wctype.h>
# define L_(Ch) L##Ch
# define UCHAR_TYPE wint_t
@@
-238,7
+236,7
@@
INT
INTERNAL (strtol) (const STRING_TYPE *nptr, STRING_TYPE **endptr,
INT
INTERNAL (strtol) (const STRING_TYPE *nptr, STRING_TYPE **endptr,
- int base, int group LOCALE_PARAM_PROTO)
+
int base, int group LOCALE_PARAM_PROTO)
{
int negative;
register unsigned LONG int cutoff;
{
int negative;
register unsigned LONG int cutoff;
@@
-263,18
+261,18
@@
INTERNAL (strtol) (const STRING_TYPE *nptr, STRING_TYPE **endptr,
{
grouping = _NL_CURRENT (LC_NUMERIC, GROUPING);
if (*grouping <= 0 || *grouping == CHAR_MAX)
{
grouping = _NL_CURRENT (LC_NUMERIC, GROUPING);
if (*grouping <= 0 || *grouping == CHAR_MAX)
- grouping = NULL;
+
grouping = NULL;
else
else
- {
- /* Figure out the thousands separator character. */
+
{
+
/* Figure out the thousands separator character. */
# if defined _LIBC || defined _HAVE_BTOWC
# if defined _LIBC || defined _HAVE_BTOWC
- thousands = __btowc (*_NL_CURRENT (LC_NUMERIC, THOUSANDS_SEP));
- if (thousands == WEOF)
- thousands = L'\0';
+
thousands = __btowc (*_NL_CURRENT (LC_NUMERIC, THOUSANDS_SEP));
+
if (thousands == WEOF)
+
thousands = L'\0';
# endif
# endif
- if (thousands == L'\0')
- grouping = NULL;
- }
+
if (thousands == L'\0')
+
grouping = NULL;
+
}
}
else
grouping = NULL;
}
else
grouping = NULL;
@@
-312,12
+310,12
@@
INTERNAL (strtol) (const STRING_TYPE *nptr, STRING_TYPE **endptr,
if (*s == L_('0'))
{
if ((base == 0 || base == 16) && TOUPPER (s[1]) == L_('X'))
if (*s == L_('0'))
{
if ((base == 0 || base == 16) && TOUPPER (s[1]) == L_('X'))
- {
- s += 2;
- base = 16;
- }
+
{
+
s += 2;
+
base = 16;
+
}
else if (base == 0)
else if (base == 0)
- base = 8;
+
base = 8;
}
else if (base == 0)
base = 10;
}
else if (base == 0)
base = 10;
@@
-331,14
+329,14
@@
INTERNAL (strtol) (const STRING_TYPE *nptr, STRING_TYPE **endptr,
/* Find the end of the digit string and check its grouping. */
end = s;
for (c = *end; c != L_('\0'); c = *++end)
/* Find the end of the digit string and check its grouping. */
end = s;
for (c = *end; c != L_('\0'); c = *++end)
- if ((wchar_t) c != thousands
- && ((wchar_t) c < L_('0') || (wchar_t) c > L_('9'))
- && (!ISALPHA (c) || (int) (TOUPPER (c) - L_('A') + 10) >= base))
- break;
+
if ((wchar_t) c != thousands
+
&& ((wchar_t) c < L_('0') || (wchar_t) c > L_('9'))
+
&& (!ISALPHA (c) || (int) (TOUPPER (c) - L_('A') + 10) >= base))
+
break;
if (*s == thousands)
if (*s == thousands)
- end = s;
+
end = s;
else
else
- end = correctly_grouped_prefix (s, end, thousands, grouping);
+
end = correctly_grouped_prefix (s, end, thousands, grouping);
}
else
#endif
}
else
#endif
@@
-352,23
+350,23
@@
INTERNAL (strtol) (const STRING_TYPE *nptr, STRING_TYPE **endptr,
for (c = *s; c != L_('\0'); c = *++s)
{
if (s == end)
for (c = *s; c != L_('\0'); c = *++s)
{
if (s == end)
- break;
+
break;
if (c >= L_('0') && c <= L_('9'))
if (c >= L_('0') && c <= L_('9'))
- c -= L_('0');
+
c -= L_('0');
else if (ISALPHA (c))
else if (ISALPHA (c))
- c = TOUPPER (c) - L_('A') + 10;
+
c = TOUPPER (c) - L_('A') + 10;
else
else
- break;
+
break;
if ((int) c >= base)
if ((int) c >= base)
- break;
+
break;
/* Check for overflow. */
if (i > cutoff || (i == cutoff && c > cutlim))
/* Check for overflow. */
if (i > cutoff || (i == cutoff && c > cutlim))
- overflow = 1;
+
overflow = 1;
else
else
- {
- i *= (unsigned LONG int) base;
- i += c;
- }
+
{
+
i *= (unsigned LONG int) base;
+
i += c;
+
}
}
/* Check if anything actually happened. */
}
/* Check if anything actually happened. */
@@
-385,8
+383,8
@@
INTERNAL (strtol) (const STRING_TYPE *nptr, STRING_TYPE **endptr,
`unsigned LONG int', but outside the range of `LONG int'. */
if (overflow == 0
&& i > (negative
`unsigned LONG int', but outside the range of `LONG int'. */
if (overflow == 0
&& i > (negative
- ? -((unsigned LONG int) (STRTOL_LONG_MIN + 1)) + 1
- : (unsigned LONG int) STRTOL_LONG_MAX))
+
? -((unsigned LONG int) (STRTOL_LONG_MIN + 1)) + 1
+
: (unsigned LONG int) STRTOL_LONG_MAX))
overflow = 1;
#endif
overflow = 1;
#endif
@@
-411,11
+409,11
@@
noconv:
if (endptr != NULL)
{
if (save - nptr >= 2 && TOUPPER (save[-1]) == L_('X')
if (endptr != NULL)
{
if (save - nptr >= 2 && TOUPPER (save[-1]) == L_('X')
- && save[-2] == L_('0'))
- *endptr = (STRING_TYPE *) &save[-1];
+
&& save[-2] == L_('0'))
+
*endptr = (STRING_TYPE *) &save[-1];
else
else
- /* There was no number to convert. */
- *endptr = (STRING_TYPE *) nptr;
+
/* There was no number to convert. */
+
*endptr = (STRING_TYPE *) nptr;
}
return 0L;
}
return 0L;
@@
-429,7
+427,7
@@
INT
weak_function
#endif
strtol (const STRING_TYPE *nptr, STRING_TYPE **endptr,
weak_function
#endif
strtol (const STRING_TYPE *nptr, STRING_TYPE **endptr,
- int base LOCALE_PARAM_PROTO)
+
int base LOCALE_PARAM_PROTO)
{
return INTERNAL (strtol) (nptr, endptr, base, 0 LOCALE_PARAM);
}
{
return INTERNAL (strtol) (nptr, endptr, base, 0 LOCALE_PARAM);
}