sdk-core
v2026.11.05
PS2 SDK - core tier (build-critical EE/IOP modules)
Toggle main menu visibility
Loading...
Searching...
No Matches
strtol.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 a long integer.
75
*
76
* Ignores `locale' stuff. Assumes that the upper and lower case
77
* alphabets and digits are each contiguous.
78
*/
79
long
strtol(
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
// check base
90
if
(base < 0 || base > 36)
91
{
92
// errno = EINVAL
93
94
if
(endptr)
95
{
96
*endptr = (
char
*)(uintptr_t)nptr;
97
}
98
99
return
0;
100
}
101
102
/*
103
* Skip white space and pick up leading +/- sign if any.
104
* If base is 0, allow 0x for hex and 0 for octal, else
105
* assume decimal; if base is already 16, allow 0x.
106
*/
107
do
108
{
109
c = *s++;
110
}
while
(isspace(c));
111
112
if
(c ==
'-'
)
113
{
114
neg = 1;
115
c = *s++;
116
}
117
else
if
(c ==
'+'
)
118
{
119
c = *s++;
120
}
121
122
if
((base == 0 || base == 16) && c ==
'0'
&& (*s ==
'x'
|| *s ==
'X'
))
123
{
124
c = s[1];
125
s += 2;
126
base = 16;
127
}
128
else
if
((base == 0 || base == 2) && c ==
'0'
&& (*s ==
'b'
|| *s ==
'B'
))
129
{
130
c = s[1];
131
s += 2;
132
base = 2;
133
}
134
135
if
(base == 0)
136
{
137
base = c ==
'0'
? 8 : 10;
138
}
139
140
/*
141
* Compute the cutoff value between legal numbers and illegal
142
* numbers. That is the largest legal value, divided by the
143
* base. An input number that is greater than this value, if
144
* followed by a legal input character, is too big. One that
145
* is equal to this value may be valid or not; the limit
146
* between valid and invalid numbers is then based on the last
147
* digit. For instance, if the range for longs is
148
* [-2147483648..2147483647] and the input base is 10,
149
* cutoff will be set to 214748364 and cutlim to either
150
* 7 (neg==0) or 8 (neg==1), meaning that if we have accumulated
151
* a value > 214748364, or equal but the next digit is > 7 (or 8),
152
* the number is too big, and we will return a range error.
153
*
154
* Set any if any `digits' consumed; make it negative to indicate
155
* overflow.
156
*/
157
cutoff = neg ? -(
unsigned
long)LONG_MIN : LONG_MAX;
158
cutlim = (int)(cutoff % (
unsigned
long
)base);
159
cutoff /= (
unsigned
long)base;
160
161
for
(acc = 0, any = 0;; c = *s++)
162
{
163
if
(isdigit(c))
164
{
165
c -=
'0'
;
166
}
167
else
if
(isalpha(c))
168
{
169
c -= isupper(c) ?
'A'
- 10 :
'a'
- 10;
170
}
171
else
172
{
173
break
;
174
}
175
176
if
(c >= base)
177
{
178
break
;
179
}
180
181
if
(any < 0 || acc > cutoff || (acc == cutoff && c > cutlim))
182
{
183
any = -1;
184
}
185
else
186
{
187
any = 1;
188
acc *= (
unsigned
long)base;
189
acc += (
unsigned
long)c;
190
}
191
}
192
193
if
(any < 0)
194
{
195
acc = neg ? (
unsigned
long)LONG_MIN : (unsigned long)LONG_MAX;
196
// errno = ERANGE;
197
}
198
else
if
(neg)
199
{
200
acc = -acc;
201
}
202
203
if
(endptr != 0)
204
{
205
*endptr = (
char
*)(uintptr_t)(any ? s - 1 : nptr);
206
}
207
return
(
long
)(acc);
208
}
ctype.h
sysclib.h
core
sysclib
src
embeddedartistry_libc
stdlib
strtol.c
Generated by
1.18.0