1 /* Convert string representing a number to integer value, using given locale.
2 Copyright (C) 1997-2015 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
4 Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
6 The GNU C Library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Lesser General Public
8 License as published by the Free Software Foundation; either
9 version 2.1 of the License, or (at your option) any later version.
11 The GNU C Library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
16 You should have received a copy of the GNU Lesser General Public
17 License along with the GNU C Library; if not, see
18 <http://www.gnu.org/licenses/>. */
26 # define USE_NUMBER_GROUPING
27 # define HAVE_LIMITS_H
33 # define __set_errno(Val) errno = (Val)
46 #include <bits/wordsize.h>
48 #ifdef USE_NUMBER_GROUPING
49 # include "../locale/localeinfo.h"
52 /* Nonzero if we are defining `strtoul' or `strtoull', operating on
58 # define INT unsigned LONG int
61 /* Determine the name. */
65 # define strtol_l wcstoull_l
67 # define strtol_l wcstoul_l
71 # define strtol_l strtoull_l
73 # define strtol_l strtoul_l
79 # define strtol_l wcstoll_l
81 # define strtol_l wcstol_l
85 # define strtol_l strtoll_l
87 # define strtol_l strtol_l
92 #define __strtol_l __strtol_l2(strtol_l)
93 #define __strtol_l2(name) __strtol_l3(name)
94 #define __strtol_l3(name) __##name
97 /* If QUAD is defined, we are defining `strtoll' or `strtoull',
98 operating on `long long int's. */
100 # define LONG long long
101 # define STRTOL_LONG_MIN LONG_LONG_MIN
102 # define STRTOL_LONG_MAX LONG_LONG_MAX
103 # define STRTOL_ULONG_MAX ULONG_LONG_MAX
108 # define ULONG_MAX ((unsigned long int) ~(unsigned long int) 0)
111 # define LONG_MAX ((long int) (ULONG_MAX >> 1))
113 # define STRTOL_LONG_MIN LONG_MIN
114 # define STRTOL_LONG_MAX LONG_MAX
115 # define STRTOL_ULONG_MAX ULONG_MAX
119 /* We use this code for the extended locale handling where the
120 function gets as an additional argument the locale which has to be
121 used. To access the values we have to redefine the _NL_CURRENT and
122 _NL_CURRENT_WORD macros. */
124 #define _NL_CURRENT(category, item) \
125 (current->values[_NL_ITEM_INDEX (item)].string)
126 #undef _NL_CURRENT_WORD
127 #define _NL_CURRENT_WORD(category, item) \
128 ((uint32_t) current->values[_NL_ITEM_INDEX (item)].word)
130 #if defined _LIBC || defined HAVE_WCHAR_H
136 # define L_(Ch) L##Ch
137 # define UCHAR_TYPE wint_t
138 # define STRING_TYPE wchar_t
139 # define ISSPACE(Ch) __iswspace_l ((Ch), loc)
140 # define ISALPHA(Ch) __iswalpha_l ((Ch), loc)
141 # define TOUPPER(Ch) __towupper_l ((Ch), loc)
144 || defined STDC_HEADERS || (!defined isascii && !defined HAVE_ISASCII)
145 # define IN_CTYPE_DOMAIN(c) 1
147 # define IN_CTYPE_DOMAIN(c) isascii(c)
150 # define UCHAR_TYPE unsigned char
151 # define STRING_TYPE char
152 # define ISSPACE(Ch) __isspace_l ((Ch), loc)
153 # define ISALPHA(Ch) __isalpha_l ((Ch), loc)
154 # define TOUPPER(Ch) __toupper_l ((Ch), loc)
157 #define INTERNAL(X) INTERNAL1(X)
158 #define INTERNAL1(X) __##X##_internal
159 #define WEAKNAME(X) WEAKNAME1(X)
161 #ifdef USE_NUMBER_GROUPING
162 /* This file defines a function to check for correct grouping. */
163 # include "grouping.h"
167 /* Define tables of maximum values and remainders in order to detect
168 overflow. Do this at compile-time in order to avoid the runtime
169 overhead of the division. */
170 extern const unsigned long __strtol_ul_max_tab[] attribute_hidden;
171 extern const unsigned char __strtol_ul_rem_tab[] attribute_hidden;
172 #if defined(QUAD) && __WORDSIZE == 32
173 extern const unsigned long long __strtol_ull_max_tab[] attribute_hidden;
174 extern const unsigned char __strtol_ull_rem_tab[] attribute_hidden;
177 #define DEF(TYPE, NAME) \
178 const TYPE NAME[] attribute_hidden = \
180 F(2), F(3), F(4), F(5), F(6), F(7), F(8), F(9), F(10), \
181 F(11), F(12), F(13), F(14), F(15), F(16), F(17), F(18), F(19), F(20), \
182 F(21), F(22), F(23), F(24), F(25), F(26), F(27), F(28), F(29), F(30), \
183 F(31), F(32), F(33), F(34), F(35), F(36) \
186 #if !UNSIGNED && !defined (USE_WIDE_CHAR) && !defined (QUAD)
187 # define F(X) ULONG_MAX / X
188 DEF (unsigned long, __strtol_ul_max_tab);
190 # define F(X) ULONG_MAX % X
191 DEF (unsigned char, __strtol_ul_rem_tab);
194 #if !UNSIGNED && !defined (USE_WIDE_CHAR) && defined (QUAD) \
196 # define F(X) ULONG_LONG_MAX / X
197 DEF (unsigned long long, __strtol_ull_max_tab);
199 # define F(X) ULONG_LONG_MAX % X
200 DEF (unsigned char, __strtol_ull_rem_tab);
205 /* Define some more readable aliases for these arrays which correspond
206 to how they'll be used in the function below. */
207 #define jmax_tab __strtol_ul_max_tab
208 #if defined(QUAD) && __WORDSIZE == 32
209 # define cutoff_tab __strtol_ull_max_tab
210 # define cutlim_tab __strtol_ull_rem_tab
212 # define cutoff_tab __strtol_ul_max_tab
213 # define cutlim_tab __strtol_ul_rem_tab
217 /* Convert NPTR to an `unsigned long int' or `long int' in base BASE.
218 If BASE is 0 the base is determined by the presence of a leading
219 zero, indicating octal or a leading "0x" or "0X", indicating hexadecimal.
220 If BASE is < 2 or > 36, it is reset to 10.
221 If ENDPTR is not NULL, a pointer to the character after the last
222 one converted is stored in *ENDPTR. */
225 INTERNAL (__strtol_l) (nptr, endptr, base, group, loc)
226 const STRING_TYPE *nptr;
227 STRING_TYPE **endptr;
233 unsigned LONG int cutoff;
236 const STRING_TYPE *s;
238 const STRING_TYPE *save, *end;
240 #ifndef USE_WIDE_CHAR
244 #ifdef USE_NUMBER_GROUPING
245 struct __locale_data *current = loc->__locales[LC_NUMERIC];
246 /* The thousands character of the current locale. */
247 # ifdef USE_WIDE_CHAR
248 wchar_t thousands = L'\0';
250 const char *thousands = NULL;
251 size_t thousands_len = 0;
253 /* The numeric grouping specification of the current locale,
254 in the format described in <locale.h>. */
255 const char *grouping;
257 if (__glibc_unlikely (group))
259 grouping = _NL_CURRENT (LC_NUMERIC, GROUPING);
260 if (*grouping <= 0 || *grouping == CHAR_MAX)
264 /* Figure out the thousands separator character. */
265 # ifdef USE_WIDE_CHAR
267 thousands = _NL_CURRENT_WORD (LC_NUMERIC,
268 _NL_NUMERIC_THOUSANDS_SEP_WC);
270 if (thousands == L'\0')
274 thousands = _NL_CURRENT (LC_NUMERIC, THOUSANDS_SEP);
276 if (*thousands == '\0')
288 if (base < 0 || base == 1 || base > 36)
290 __set_errno (EINVAL);
296 /* Skip white space. */
299 if (__glibc_unlikely (*s == L_('\0')))
302 /* Check for a sign. */
309 else if (*s == L_('+'))
312 /* Recognize number prefix and if BASE is zero, figure it out ourselves. */
315 if ((base == 0 || base == 16) && TOUPPER (s[1]) == L_('X'))
326 /* Save the pointer so we can check later if anything happened. */
329 #ifdef USE_NUMBER_GROUPING
333 if (__glibc_unlikely (grouping != NULL))
335 # ifndef USE_WIDE_CHAR
336 thousands_len = strlen (thousands);
339 /* Find the end of the digit string and check its grouping. */
342 # ifdef USE_WIDE_CHAR
345 ({ for (cnt = 0; cnt < thousands_len; ++cnt)
346 if (thousands[cnt] != end[cnt])
348 cnt < thousands_len; })
352 for (c = *end; c != L_('\0'); c = *++end)
353 if (((STRING_TYPE) c < L_('0') || (STRING_TYPE) c > L_('9'))
354 # ifdef USE_WIDE_CHAR
355 && (wchar_t) c != thousands
357 && ({ for (cnt = 0; cnt < thousands_len; ++cnt)
358 if (thousands[cnt] != end[cnt])
360 cnt < thousands_len; })
363 || (int) (TOUPPER (c) - L_('A') + 10) >= base))
366 # ifdef USE_WIDE_CHAR
367 end = __correctly_grouped_prefixwc (s, end, thousands, grouping);
369 end = __correctly_grouped_prefixmb (s, end, thousands, grouping);
377 /* Avoid runtime division; lookup cutoff and limit. */
378 cutoff = cutoff_tab[base - 2];
379 cutlim = cutlim_tab[base - 2];
384 if (sizeof (long int) != sizeof (LONG int))
386 unsigned long int j = 0;
387 unsigned long int jmax = jmax_tab[base - 2];
389 for (;c != L_('\0'); c = *++s)
393 if (c >= L_('0') && c <= L_('9'))
395 #ifdef USE_NUMBER_GROUPING
396 # ifdef USE_WIDE_CHAR
397 else if (grouping && (wchar_t) c == thousands)
400 else if (thousands_len)
402 for (cnt = 0; cnt < thousands_len; ++cnt)
403 if (thousands[cnt] != s[cnt])
405 if (cnt == thousands_len)
407 s += thousands_len - 1;
411 c = TOUPPER (c) - L_('A') + 10;
417 else if (ISALPHA (c))
418 c = TOUPPER (c) - L_('A') + 10;
423 /* Note that we never can have an overflow. */
426 /* We have an overflow. Now use the long representation. */
427 i = (unsigned LONG int) j;
431 j = j * (unsigned long int) base + c;
434 i = (unsigned LONG int) j;
437 for (;c != L_('\0'); c = *++s)
441 if (c >= L_('0') && c <= L_('9'))
443 #ifdef USE_NUMBER_GROUPING
444 # ifdef USE_WIDE_CHAR
445 else if (grouping && (wchar_t) c == thousands)
448 else if (thousands_len)
450 for (cnt = 0; cnt < thousands_len; ++cnt)
451 if (thousands[cnt] != s[cnt])
453 if (cnt == thousands_len)
455 s += thousands_len - 1;
459 c = TOUPPER (c) - L_('A') + 10;
465 else if (ISALPHA (c))
466 c = TOUPPER (c) - L_('A') + 10;
471 /* Check for overflow. */
472 if (i > cutoff || (i == cutoff && c > cutlim))
477 i *= (unsigned LONG int) base;
482 /* Check if anything actually happened. */
486 /* Store in ENDPTR the address of one character
487 past the last character we converted. */
489 *endptr = (STRING_TYPE *) s;
492 /* Check for a value that is within the range of
493 `unsigned LONG int', but outside the range of `LONG int'. */
496 ? -((unsigned LONG int) (STRTOL_LONG_MIN + 1)) + 1
497 : (unsigned LONG int) STRTOL_LONG_MAX))
501 if (__glibc_unlikely (overflow))
503 __set_errno (ERANGE);
505 return STRTOL_ULONG_MAX;
507 return negative ? STRTOL_LONG_MIN : STRTOL_LONG_MAX;
511 /* Return the result of the appropriate sign. */
512 return negative ? -i : i;
515 /* We must handle a special case here: the base is 0 or 16 and the
516 first two characters are '0' and 'x', but the rest are no
517 hexadecimal digits. This is no error case. We return 0 and
518 ENDPTR points to the `x`. */
521 if (save - nptr >= 2 && TOUPPER (save[-1]) == L_('X')
522 && save[-2] == L_('0'))
523 *endptr = (STRING_TYPE *) &save[-1];
525 /* There was no number to convert. */
526 *endptr = (STRING_TYPE *) nptr;
531 #if defined _LIBC && !defined USE_WIDE_CHAR
532 libc_hidden_def (INTERNAL (__strtol_l))
535 /* External user entry point. */
540 extern INT __strtol_l (const STRING_TYPE *nptr, STRING_TYPE **endptr,
549 __strtol_l (nptr, endptr, base, loc)
550 const STRING_TYPE *nptr;
551 STRING_TYPE **endptr;
555 return INTERNAL (__strtol_l) (nptr, endptr, base, 0, loc);
557 libc_hidden_def (__strtol_l)
558 weak_alias (__strtol_l, strtol_l)