scoutos / prex0.9.0 / usr / lib / libc / stdlib / strtoul.c @ 03e9c04a
History  View  Annotate  Download (2.98 KB)
1 
/*


2 
* Copyright (c) 1990, 1993

3 
* The Regents of the University of California. All rights reserved.

4 
*

5 
* Redistribution and use in source and binary forms, with or without

6 
* modification, are permitted provided that the following conditions

7 
* are met:

8 
* 1. Redistributions of source code must retain the above copyright

9 
* notice, this list of conditions and the following disclaimer.

10 
* 2. Redistributions in binary form must reproduce the above copyright

11 
* notice, this list of conditions and the following disclaimer in the

12 
* documentation and/or other materials provided with the distribution.

13 
* 3. Neither the name of the University nor the names of its contributors

14 
* may be used to endorse or promote products derived from this software

15 
* without specific prior written permission.

16 
*

17 
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND

18 
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE

19 
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE

20 
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE

21 
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL

22 
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS

23 
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)

24 
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT

25 
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY

26 
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF

27 
* SUCH DAMAGE.

28 
*/

29  
30 
#include <limits.h> 
31 
#include <ctype.h> 
32 
#include <errno.h> 
33 
#include <stdlib.h> 
34  
35 
/*

36 
* Convert a string to an unsigned long integer.

37 
*

38 
* Ignores `locale' stuff. Assumes that the upper and lower case

39 
* alphabets and digits are each contiguous.

40 
*/

41 
unsigned long 
42 
strtoul(nptr, endptr, base) 
43 
const char *nptr; 
44 
char **endptr;

45 
register int base; 
46 
{ 
47 
const char *s; 
48 
unsigned long acc, cutoff; 
49 
int c;

50 
int neg, any, cutlim;

51  
52 
/*

53 
* See strtol for comments as to the logic used.

54 
*/

55 
s = nptr; 
56 
do {

57 
c = (unsigned char) *s++; 
58 
} while (isspace(c));

59 
if (c == '') { 
60 
neg = 1;

61 
c = *s++; 
62 
} else {

63 
neg = 0;

64 
if (c == '+') 
65 
c = *s++; 
66 
} 
67 
if ((base == 0  base == 16) && 
68 
c == '0' && (*s == 'x'  *s == 'X')) { 
69 
c = s[1];

70 
s += 2;

71 
base = 16;

72 
} 
73 
if (base == 0) 
74 
base = c == '0' ? 8 : 10; 
75  
76 
cutoff = ULONG_MAX / (unsigned long)base; 
77 
cutlim = (int)(ULONG_MAX % (unsigned long)base); 
78 
for (acc = 0, any = 0;; c = (unsigned char) *s++) { 
79 
if (isdigit(c))

80 
c = '0';

81 
else if (isalpha(c)) 
82 
c = isupper(c) ? 'A'  10 : 'a'  10; 
83 
else

84 
break;

85 
if (c >= base)

86 
break;

87 
if (any < 0) 
88 
continue;

89 
if (acc > cutoff  (acc == cutoff && c > cutlim)) {

90 
any = 1;

91 
acc = ULONG_MAX; 
92 
errno = ERANGE; 
93 
} else {

94 
any = 1;

95 
acc *= (unsigned long)base; 
96 
acc += c; 
97 
} 
98 
} 
99 
if (neg && any > 0) 
100 
acc = acc; 
101 
if (endptr != 0) 
102 
/* LINTED interface specification */

103 
*endptr = (char *)(any ? s  1 : nptr); 
104 
return (acc);

105 
} 