1 /* Convert string representing a number to integer value, using given locale.
2 Copyright (C) 1997-2022 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library; if not, see
17 <https://www.gnu.org/licenses/>. */
25 # define USE_NUMBER_GROUPING
26 # define HAVE_LIMITS_H
32 # define __set_errno(Val) errno = (Val)
44 #include <bits/wordsize.h>
46 #ifdef USE_NUMBER_GROUPING
47 # include "../locale/localeinfo.h"
50 /* Nonzero if we are defining `strtoul' or `strtoull', operating on
56 # define INT unsigned LONG int
59 /* Determine the name. */
63 # define strtol_l wcstoull_l
65 # define strtol_l wcstoul_l
69 # define strtol_l strtoull_l
71 # define strtol_l strtoul_l
77 # define strtol_l wcstoll_l
79 # define strtol_l wcstol_l
83 # define strtol_l strtoll_l
85 # define strtol_l strtol_l
90 #define __strtol_l __strtol_l2(strtol_l)
91 #define __strtol_l2(name) __strtol_l3(name)
92 #define __strtol_l3(name) __##name
95 /* If QUAD is defined, we are defining `strtoll' or `strtoull',
96 operating on `long long int's. */
98 # define LONG long long
99 # define STRTOL_LONG_MIN LONG_LONG_MIN
100 # define STRTOL_LONG_MAX LONG_LONG_MAX
101 # define STRTOL_ULONG_MAX ULONG_LONG_MAX
106 # define ULONG_MAX ((unsigned long int) ~(unsigned long int) 0)
109 # define LONG_MAX ((long int) (ULONG_MAX >> 1))
111 # define STRTOL_LONG_MIN LONG_MIN
112 # define STRTOL_LONG_MAX LONG_MAX
113 # define STRTOL_ULONG_MAX ULONG_MAX
117 /* We use this code for the extended locale handling where the
118 function gets as an additional argument the locale which has to be
119 used. To access the values we have to redefine the _NL_CURRENT and
120 _NL_CURRENT_WORD macros. */
122 #define _NL_CURRENT(category, item) \
123 (current->values[_NL_ITEM_INDEX (item)].string)
124 #undef _NL_CURRENT_WORD
125 #define _NL_CURRENT_WORD(category, item) \
126 ((uint32_t) current->values[_NL_ITEM_INDEX (item)].word)
128 #if defined _LIBC || defined HAVE_WCHAR_H
134 # define L_(Ch) L##Ch
135 # define UCHAR_TYPE wint_t
136 # define STRING_TYPE wchar_t
137 # define ISSPACE(Ch) __iswspace_l ((Ch), loc)
138 # define ISALPHA(Ch) __iswalpha_l ((Ch), _nl_C_locobj_ptr)
139 # define TOUPPER(Ch) __towupper_l ((Ch), _nl_C_locobj_ptr)
142 || defined STDC_HEADERS || (!defined isascii && !defined HAVE_ISASCII)
143 # define IN_CTYPE_DOMAIN(c) 1
145 # define IN_CTYPE_DOMAIN(c) isascii(c)
148 # define UCHAR_TYPE unsigned char
149 # define STRING_TYPE char
150 # define ISSPACE(Ch) __isspace_l ((Ch), loc)
151 # define ISALPHA(Ch) __isalpha_l ((Ch), _nl_C_locobj_ptr)
152 # define TOUPPER(Ch) __toupper_l ((Ch), _nl_C_locobj_ptr)
155 #define INTERNAL(X) INTERNAL1(X)
156 #define INTERNAL1(X) __##X##_internal
157 #define WEAKNAME(X) WEAKNAME1(X)
159 #ifdef USE_NUMBER_GROUPING
160 /* This file defines a function to check for correct grouping. */
161 # include "grouping.h"
165 /* Define tables of maximum values and remainders in order to detect
166 overflow. Do this at compile-time in order to avoid the runtime
167 overhead of the division. */
168 extern const unsigned long __strtol_ul_max_tab
[] attribute_hidden
;
169 extern const unsigned char __strtol_ul_rem_tab
[] attribute_hidden
;
170 #if defined(QUAD) && __WORDSIZE == 32
171 extern const unsigned long long __strtol_ull_max_tab
[] attribute_hidden
;
172 extern const unsigned char __strtol_ull_rem_tab
[] attribute_hidden
;
175 #define DEF(TYPE, NAME) \
176 const TYPE NAME[] attribute_hidden = \
178 F(2), F(3), F(4), F(5), F(6), F(7), F(8), F(9), F(10), \
179 F(11), F(12), F(13), F(14), F(15), F(16), F(17), F(18), F(19), F(20), \
180 F(21), F(22), F(23), F(24), F(25), F(26), F(27), F(28), F(29), F(30), \
181 F(31), F(32), F(33), F(34), F(35), F(36) \
184 #if !UNSIGNED && !defined (USE_WIDE_CHAR) && !defined (QUAD)
185 # define F(X) ULONG_MAX / X
186 DEF (unsigned long, __strtol_ul_max_tab
);
188 # define F(X) ULONG_MAX % X
189 DEF (unsigned char, __strtol_ul_rem_tab
);
192 #if !UNSIGNED && !defined (USE_WIDE_CHAR) && defined (QUAD) \
194 # define F(X) ULONG_LONG_MAX / X
195 DEF (unsigned long long, __strtol_ull_max_tab
);
197 # define F(X) ULONG_LONG_MAX % X
198 DEF (unsigned char, __strtol_ull_rem_tab
);
203 /* Define some more readable aliases for these arrays which correspond
204 to how they'll be used in the function below. */
205 #define jmax_tab __strtol_ul_max_tab
206 #if defined(QUAD) && __WORDSIZE == 32
207 # define cutoff_tab __strtol_ull_max_tab
208 # define cutlim_tab __strtol_ull_rem_tab
210 # define cutoff_tab __strtol_ul_max_tab
211 # define cutlim_tab __strtol_ul_rem_tab
215 /* Convert NPTR to an `unsigned long int' or `long int' in base BASE.
216 If BASE is 0 the base is determined by the presence of a leading
217 zero, indicating octal or a leading "0x" or "0X", indicating hexadecimal.
218 If BASE is < 2 or > 36, it is reset to 10.
219 If ENDPTR is not NULL, a pointer to the character after the last
220 one converted is stored in *ENDPTR. */
223 INTERNAL (__strtol_l
) (const STRING_TYPE
*nptr
, STRING_TYPE
**endptr
,
224 int base
, int group
, locale_t loc
)
227 unsigned LONG
int cutoff
;
230 const STRING_TYPE
*s
;
232 const STRING_TYPE
*save
, *end
;
234 #ifndef USE_WIDE_CHAR
238 #ifdef USE_NUMBER_GROUPING
239 struct __locale_data
*current
= loc
->__locales
[LC_NUMERIC
];
240 /* The thousands character of the current locale. */
241 # ifdef USE_WIDE_CHAR
242 wchar_t thousands
= L
'\0';
244 const char *thousands
= NULL
;
245 size_t thousands_len
= 0;
247 /* The numeric grouping specification of the current locale,
248 in the format described in <locale.h>. */
249 const char *grouping
;
251 if (__glibc_unlikely (group
))
253 grouping
= _NL_CURRENT (LC_NUMERIC
, GROUPING
);
254 if (*grouping
<= 0 || *grouping
== CHAR_MAX
)
258 /* Figure out the thousands separator character. */
259 # ifdef USE_WIDE_CHAR
261 thousands
= _NL_CURRENT_WORD (LC_NUMERIC
,
262 _NL_NUMERIC_THOUSANDS_SEP_WC
);
264 if (thousands
== L
'\0')
268 thousands
= _NL_CURRENT (LC_NUMERIC
, THOUSANDS_SEP
);
270 if (*thousands
== '\0')
282 if (base
< 0 || base
== 1 || base
> 36)
284 __set_errno (EINVAL
);
290 /* Skip white space. */
293 if (__glibc_unlikely (*s
== L_('\0')))
296 /* Check for a sign. */
303 else if (*s
== L_('+'))
306 /* Recognize number prefix and if BASE is zero, figure it out ourselves. */
309 if ((base
== 0 || base
== 16) && TOUPPER (s
[1]) == L_('X'))
320 /* Save the pointer so we can check later if anything happened. */
323 #ifdef USE_NUMBER_GROUPING
327 if (__glibc_unlikely (grouping
!= NULL
))
329 # ifndef USE_WIDE_CHAR
330 thousands_len
= strlen (thousands
);
333 /* Find the end of the digit string and check its grouping. */
336 # ifdef USE_WIDE_CHAR
339 ({ for (cnt
= 0; cnt
< thousands_len
; ++cnt
)
340 if (thousands
[cnt
] != end
[cnt
])
342 cnt
< thousands_len
; })
346 for (c
= *end
; c
!= L_('\0'); c
= *++end
)
347 if (((STRING_TYPE
) c
< L_('0') || (STRING_TYPE
) c
> L_('9'))
348 # ifdef USE_WIDE_CHAR
349 && (wchar_t) c
!= thousands
351 && ({ for (cnt
= 0; cnt
< thousands_len
; ++cnt
)
352 if (thousands
[cnt
] != end
[cnt
])
354 cnt
< thousands_len
; })
357 || (int) (TOUPPER (c
) - L_('A') + 10) >= base
))
360 # ifdef USE_WIDE_CHAR
361 end
= __correctly_grouped_prefixwc (s
, end
, thousands
, grouping
);
363 end
= __correctly_grouped_prefixmb (s
, end
, thousands
, grouping
);
371 /* Avoid runtime division; lookup cutoff and limit. */
372 cutoff
= cutoff_tab
[base
- 2];
373 cutlim
= cutlim_tab
[base
- 2];
378 if (sizeof (long int) != sizeof (LONG
int))
380 unsigned long int j
= 0;
381 unsigned long int jmax
= jmax_tab
[base
- 2];
383 for (;c
!= L_('\0'); c
= *++s
)
387 if (c
>= L_('0') && c
<= L_('9'))
389 #ifdef USE_NUMBER_GROUPING
390 # ifdef USE_WIDE_CHAR
391 else if (grouping
&& (wchar_t) c
== thousands
)
394 else if (thousands_len
)
396 for (cnt
= 0; cnt
< thousands_len
; ++cnt
)
397 if (thousands
[cnt
] != s
[cnt
])
399 if (cnt
== thousands_len
)
401 s
+= thousands_len
- 1;
405 c
= TOUPPER (c
) - L_('A') + 10;
411 else if (ISALPHA (c
))
412 c
= TOUPPER (c
) - L_('A') + 10;
417 /* Note that we never can have an overflow. */
420 /* We have an overflow. Now use the long representation. */
421 i
= (unsigned LONG
int) j
;
425 j
= j
* (unsigned long int) base
+ c
;
428 i
= (unsigned LONG
int) j
;
431 for (;c
!= L_('\0'); c
= *++s
)
435 if (c
>= L_('0') && c
<= L_('9'))
437 #ifdef USE_NUMBER_GROUPING
438 # ifdef USE_WIDE_CHAR
439 else if (grouping
&& (wchar_t) c
== thousands
)
442 else if (thousands_len
)
444 for (cnt
= 0; cnt
< thousands_len
; ++cnt
)
445 if (thousands
[cnt
] != s
[cnt
])
447 if (cnt
== thousands_len
)
449 s
+= thousands_len
- 1;
453 c
= TOUPPER (c
) - L_('A') + 10;
459 else if (ISALPHA (c
))
460 c
= TOUPPER (c
) - L_('A') + 10;
465 /* Check for overflow. */
466 if (i
> cutoff
|| (i
== cutoff
&& c
> cutlim
))
471 i
*= (unsigned LONG
int) base
;
476 /* Check if anything actually happened. */
480 /* Store in ENDPTR the address of one character
481 past the last character we converted. */
483 *endptr
= (STRING_TYPE
*) s
;
486 /* Check for a value that is within the range of
487 `unsigned LONG int', but outside the range of `LONG int'. */
490 ? -((unsigned LONG
int) (STRTOL_LONG_MIN
+ 1)) + 1
491 : (unsigned LONG
int) STRTOL_LONG_MAX
))
495 if (__glibc_unlikely (overflow
))
497 __set_errno (ERANGE
);
499 return STRTOL_ULONG_MAX
;
501 return negative
? STRTOL_LONG_MIN
: STRTOL_LONG_MAX
;
505 /* Return the result of the appropriate sign. */
506 return negative
? -i
: i
;
509 /* We must handle a special case here: the base is 0 or 16 and the
510 first two characters are '0' and 'x', but the rest are no
511 hexadecimal digits. This is no error case. We return 0 and
512 ENDPTR points to the `x`. */
515 if (save
- nptr
>= 2 && TOUPPER (save
[-1]) == L_('X')
516 && save
[-2] == L_('0'))
517 *endptr
= (STRING_TYPE
*) &save
[-1];
519 /* There was no number to convert. */
520 *endptr
= (STRING_TYPE
*) nptr
;
525 #if defined _LIBC && !defined USE_WIDE_CHAR
526 libc_hidden_def (INTERNAL (__strtol_l
))
529 /* External user entry point. */
534 extern INT
__strtol_l (const STRING_TYPE
*nptr
, STRING_TYPE
**endptr
,
543 __strtol_l (const STRING_TYPE
*nptr
, STRING_TYPE
**endptr
,
544 int base
, locale_t loc
)
546 return INTERNAL (__strtol_l
) (nptr
, endptr
, base
, 0, loc
);
548 libc_hidden_def (__strtol_l
)
549 weak_alias (__strtol_l
, strtol_l
)