sdk-core
v2026.11.05
PS2 SDK - core tier (build-critical EE/IOP modules)
Toggle main menu visibility
Loading...
Searching...
No Matches
strtoul.c
1
/*
2
* Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
3
*
4
* @APPLE_LICENSE_HEADER_START@
5
*
6
* The contents of this file constitute Original Code as defined in and
7
* are subject to the Apple Public Source License Version 1.1 (the
8
* "License"). You may not use this file except in compliance with the
9
* License. Please obtain a copy of the License at
10
* http://www.apple.com/publicsource and read it before using this file.
11
*
12
* This Original Code and all software distributed under the License are
13
* distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
14
* EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15
* INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
16
* FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
17
* License for the specific language governing rights and limitations
18
* under the License.
19
*
20
* @APPLE_LICENSE_HEADER_END@
21
*/
22
/* Copyright (c) 1995 NeXT Computer, Inc. All rights reserved.
23
*
24
* strol.c - The functions strtol() & strtoul() are exported as public API
25
* via the header file ~driverkit/generalFuncs.h
26
*
27
* HISTORY
28
* 25-Oct-1995 Dean Reece at NeXT
29
* Created based on BSD4.4's strtol.c & strtoul.c.
30
* Removed dependency on _ctype_ by static versions of isupper()...
31
* Added support for "0b101..." binary constants.
32
* Commented out references to errno.
33
*/
34
35
/*-
36
* Copyright (c) 1990, 1993
37
* The Regents of the University of California. All rights reserved.
38
*
39
* Redistribution and use in source and binary forms, with or without
40
* modification, are permitted provided that the following conditions
41
* are met:
42
* 1. Redistributions of source code must retain the above copyright
43
* notice, this list of conditions and the following disclaimer.
44
* 2. Redistributions in binary form must reproduce the above copyright
45
* notice, this list of conditions and the following disclaimer in the
46
* documentation and/or other materials provided with the distribution.
47
* 3. All advertising materials mentioning features or use of this software
48
* must display the following acknowledgement:
49
* This product includes software developed by the University of
50
* California, Berkeley and its contributors.
51
* 4. Neither the name of the University nor the names of its contributors
52
* may be used to endorse or promote products derived from this software
53
* without specific prior written permission.
54
*
55
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
56
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
57
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
58
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
59
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
60
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
61
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
62
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
63
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
64
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
65
* SUCH DAMAGE.
66
*/
67
68
#include <
ctype.h
>
69
#include <limits.h>
70
#include <stdint.h>
71
#include <
sysclib.h
>
72
73
/*
74
* Convert a string to an unsigned long integer.
75
*
76
* Ignores `locale' stuff. Assumes that the upper and lower case
77
* alphabets and digits are each contiguous.
78
*/
79
unsigned
long
strtoul(
const
char
* nptr,
char
** endptr,
int
base)
80
{
81
const
char
* s = nptr;
82
unsigned
long
acc;
83
int
c;
84
unsigned
long
cutoff;
85
int
neg = 0;
86
int
any;
87
int
cutlim;
88
89
/*
90
* See strtol for comments as to the logic used.
91
*/
92
do
93
{
94
c = *s++;
95
}
while
(isspace(c));
96
97
if
(c ==
'-'
)
98
{
99
neg = 1;
100
c = *s++;
101
}
102
else
if
(c ==
'+'
)
103
{
104
c = *s++;
105
}
106
107
if
((base == 0 || base == 16) && c ==
'0'
&& (*s ==
'x'
|| *s ==
'X'
))
108
{
109
c = s[1];
110
s += 2;
111
base = 16;
112
}
113
else
if
((base == 0 || base == 2) && c ==
'0'
&& (*s ==
'b'
|| *s ==
'B'
))
114
{
115
c = s[1];
116
s += 2;
117
base = 2;
118
}
119
120
if
(base == 0)
121
{
122
base = c ==
'0'
? 8 : 10;
123
}
124
125
cutoff = (
unsigned
long)ULONG_MAX / (
unsigned
long
)base;
126
cutlim = (int)((
unsigned
long
)ULONG_MAX % (
unsigned
long
)base);
127
128
for
(acc = 0, any = 0;; c = *s++)
129
{
130
if
(isdigit(c))
131
{
132
c -=
'0'
;
133
}
134
else
if
(isalpha(c))
135
{
136
c -= isupper(c) ?
'A'
- 10 :
'a'
- 10;
137
}
138
else
139
{
140
break
;
141
}
142
if
(c >= base)
143
{
144
break
;
145
}
146
if
(any < 0 || acc > cutoff || (acc == cutoff && c > cutlim))
147
{
148
any = -1;
149
}
150
else
151
{
152
any = 1;
153
acc *= (
unsigned
long)base;
154
acc += (
unsigned
long)c;
155
}
156
}
157
158
if
(any < 0)
159
{
160
acc = ULONG_MAX;
161
// errno = ERANGE;
162
}
163
else
if
(neg)
164
{
165
acc = -acc;
166
}
167
168
if
(endptr != 0)
169
{
170
*endptr = (
char
*)(uintptr_t)(any ? s - 1 : nptr);
171
}
172
173
return
(acc);
174
}
ctype.h
sysclib.h
core
sysclib
src
embeddedartistry_libc
stdlib
strtoul.c
Generated by
1.18.0