/* Copyright (C) 1991 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA.
This file was modified slightly by Ian Lance Taylor, May 1992, for
#define ULONG_MAX 4294967295
#define LONG_MIN (- LONG_MAX - 1)
#define LONG_MAX 2147483647
/* Convert NPTR to an `unsigned long int' or `long int' in base BASE.
If BASE is 0 the base is determined by the presence of a leading
zero, indicating octal or a leading "0x" or "0X", indicating hexadecimal.
If BASE is < 2 or > 36, it is reset to 10.
If ENDPTR is not NULL, a pointer to the character after the last
one converted is stored in *ENDPTR. */
strtol (nptr
, endptr
, base
)
register unsigned long int cutoff
;
register unsigned int cutlim
;
register unsigned long int i
;
if (base
< 0 || base
== 1 || base
> 36)
while (isspace(BUCHAR (*s
)))
&& (s
[1] == 'x' || s
[1] == 'X'))
/* If BASE is zero, figure it out ourselves. */
if (s
[1] == 'x' || s
[1] == 'X')
/* Save the pointer so we can check later if anything happened. */
cutoff
= ULONG_MAX
/ (unsigned long int) base
;
cutlim
= ULONG_MAX
% (unsigned long int) base
;
for (c
= BUCHAR (*s
); c
!= '\0'; c
= BUCHAR (*++s
))
/* Check for overflow. */
if (i
> cutoff
|| (i
== cutoff
&& c
> cutlim
))
i
*= (unsigned long int) base
;
/* Check if anything actually happened. */
/* Store in ENDPTR the address of one character
past the last character we converted. */
/* Check for a value that is within the range of
`unsigned long int', but outside the range of `long int'. */
- (unsigned long int) LONG_MIN
: (unsigned long int) LONG_MAX
))
return negative
? LONG_MIN
: LONG_MAX
;
/* Return the result of the appropriate sign. */
return (negative
? - i
: i
);
/* There was no number to convert. */