1 /* Convert string representing a number to integer value, using given locale.
2 Copyright (C) 1997, 2002, 2004, 2006, 2007 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, write to the Free
18 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
27 # define USE_NUMBER_GROUPING
29 # define HAVE_LIMITS_H
35 # define __set_errno(Val) errno = (Val)
47 #include <bits/wordsize.h>
49 #ifdef USE_NUMBER_GROUPING
50 # include "../locale/localeinfo.h"
53 /* Nonzero if we are defining `strtoul' or `strtoull', operating on
59 # define INT unsigned LONG int
62 /* Determine the name. */
66 # define strtol_l wcstoull_l
68 # define strtol_l wcstoul_l
72 # define strtol_l strtoull_l
74 # define strtol_l strtoul_l
80 # define strtol_l wcstoll_l
82 # define strtol_l wcstol_l
86 # define strtol_l strtoll_l
88 # define strtol_l strtol_l
93 #define __strtol_l __strtol_l2(strtol_l)
94 #define __strtol_l2(name) __strtol_l3(name)
95 #define __strtol_l3(name) __##name
98 /* If QUAD is defined, we are defining `strtoll' or `strtoull',
99 operating on `long long int's. */
101 # define LONG long long
102 # define STRTOL_LONG_MIN LONG_LONG_MIN
103 # define STRTOL_LONG_MAX LONG_LONG_MAX
104 # define STRTOL_ULONG_MAX ULONG_LONG_MAX
109 # define ULONG_MAX ((unsigned long int) ~(unsigned long int) 0)
112 # define LONG_MAX ((long int) (ULONG_MAX >> 1))
114 # define STRTOL_LONG_MIN LONG_MIN
115 # define STRTOL_LONG_MAX LONG_MAX
116 # define STRTOL_ULONG_MAX ULONG_MAX
120 /* We use this code for the extended locale handling where the
121 function gets as an additional argument the locale which has to be
122 used. To access the values we have to redefine the _NL_CURRENT and
123 _NL_CURRENT_WORD macros. */
125 #define _NL_CURRENT(category, item) \
126 (current->values[_NL_ITEM_INDEX (item)].string)
127 #undef _NL_CURRENT_WORD
128 #define _NL_CURRENT_WORD(category, item) \
129 ((uint32_t) current->values[_NL_ITEM_INDEX (item)].word)
131 #if defined _LIBC || defined HAVE_WCHAR_H
137 # define L_(Ch) L##Ch
138 # define UCHAR_TYPE wint_t
139 # define STRING_TYPE wchar_t
140 # define ISSPACE(Ch) __iswspace_l ((Ch), loc)
141 # define ISALPHA(Ch) __iswalpha_l ((Ch), loc)
142 # define TOUPPER(Ch) __towupper_l ((Ch), loc)
145 || defined STDC_HEADERS || (!defined isascii && !defined HAVE_ISASCII)
146 # define IN_CTYPE_DOMAIN(c) 1
148 # define IN_CTYPE_DOMAIN(c) isascii(c)
151 # define UCHAR_TYPE unsigned char
152 # define STRING_TYPE char
153 # define ISSPACE(Ch) __isspace_l ((Ch), loc)
154 # define ISALPHA(Ch) __isalpha_l ((Ch), loc)
155 # define TOUPPER(Ch) __toupper_l ((Ch), loc)
158 #define INTERNAL(X) INTERNAL1(X)
159 #define INTERNAL1(X) __##X##_internal
160 #define WEAKNAME(X) WEAKNAME1(X)
162 #ifdef USE_NUMBER_GROUPING
163 /* This file defines a function to check for correct grouping. */
164 # include "grouping.h"
168 /* Define tables of maximum values and remainders in order to detect
169 overflow. Do this at compile-time in order to avoid the runtime
170 overhead of the division. */
171 extern const unsigned long __strtol_ul_max_tab
[] attribute_hidden
;
172 extern const unsigned char __strtol_ul_rem_tab
[] attribute_hidden
;
173 #if defined(QUAD) && __WORDSIZE == 32
174 extern const unsigned long long __strtol_ull_max_tab
[] attribute_hidden
;
175 extern const unsigned char __strtol_ull_rem_tab
[] attribute_hidden
;
178 #define DEF(TYPE, NAME) \
179 const TYPE NAME[] attribute_hidden = \
181 F(2), F(3), F(4), F(5), F(6), F(7), F(8), F(9), F(10), \
182 F(11), F(12), F(13), F(14), F(15), F(16), F(17), F(18), F(19), F(20), \
183 F(21), F(22), F(23), F(24), F(25), F(26), F(27), F(28), F(29), F(30), \
184 F(31), F(32), F(33), F(34), F(35), F(36) \
187 #if !UNSIGNED && !defined (USE_WIDE_CHAR) && !defined (QUAD)
188 # define F(X) ULONG_MAX / X
189 DEF (unsigned long, __strtol_ul_max_tab
);
191 # define F(X) ULONG_MAX % X
192 DEF (unsigned char, __strtol_ul_rem_tab
);
195 #if !UNSIGNED && !defined (USE_WIDE_CHAR) && defined (QUAD) \
197 # define F(X) ULONG_LONG_MAX / X
198 DEF (unsigned long long, __strtol_ull_max_tab
);
200 # define F(X) ULONG_LONG_MAX % X
201 DEF (unsigned char, __strtol_ull_rem_tab
);
206 /* Define some more readable aliases for these arrays which correspond
207 to how they'll be used in the function below. */
208 #define jmax_tab __strtol_ul_max_tab
209 #if defined(QUAD) && __WORDSIZE == 32
210 # define cutoff_tab __strtol_ull_max_tab
211 # define cutlim_tab __strtol_ull_rem_tab
213 # define cutoff_tab __strtol_ul_max_tab
214 # define cutlim_tab __strtol_ul_rem_tab
218 /* Convert NPTR to an `unsigned long int' or `long int' in base BASE.
219 If BASE is 0 the base is determined by the presence of a leading
220 zero, indicating octal or a leading "0x" or "0X", indicating hexadecimal.
221 If BASE is < 2 or > 36, it is reset to 10.
222 If ENDPTR is not NULL, a pointer to the character after the last
223 one converted is stored in *ENDPTR. */
226 INTERNAL (__strtol_l
) (nptr
, endptr
, base
, group
, loc
)
227 const STRING_TYPE
*nptr
;
228 STRING_TYPE
**endptr
;
234 register unsigned LONG
int cutoff
;
235 register unsigned int cutlim
;
236 register unsigned LONG
int i
;
237 register const STRING_TYPE
*s
;
238 register UCHAR_TYPE c
;
239 const STRING_TYPE
*save
, *end
;
241 #ifndef USE_WIDE_CHAR
245 #ifdef USE_NUMBER_GROUPING
246 struct locale_data
*current
= loc
->__locales
[LC_NUMERIC
];
247 /* The thousands character of the current locale. */
248 # ifdef USE_WIDE_CHAR
249 wchar_t thousands
= L
'\0';
251 const char *thousands
= NULL
;
252 size_t thousands_len
= 0;
254 /* The numeric grouping specification of the current locale,
255 in the format described in <locale.h>. */
256 const char *grouping
;
258 if (__builtin_expect (group
, 0))
260 grouping
= _NL_CURRENT (LC_NUMERIC
, GROUPING
);
261 if (*grouping
<= 0 || *grouping
== CHAR_MAX
)
265 /* Figure out the thousands separator character. */
266 # ifdef USE_WIDE_CHAR
268 thousands
= _NL_CURRENT_WORD (LC_NUMERIC
,
269 _NL_NUMERIC_THOUSANDS_SEP_WC
);
271 if (thousands
== L
'\0')
275 thousands
= _NL_CURRENT (LC_NUMERIC
, THOUSANDS_SEP
);
277 if (*thousands
== '\0')
289 if (base
< 0 || base
== 1 || base
> 36)
291 __set_errno (EINVAL
);
297 /* Skip white space. */
300 if (__builtin_expect (*s
== L_('\0'), 0))
303 /* Check for a sign. */
310 else if (*s
== L_('+'))
313 /* Recognize number prefix and if BASE is zero, figure it out ourselves. */
316 if ((base
== 0 || base
== 16) && TOUPPER (s
[1]) == L_('X'))
327 /* Save the pointer so we can check later if anything happened. */
330 #ifdef USE_NUMBER_GROUPING
334 if (__builtin_expect (grouping
!= NULL
, 0))
336 # ifndef USE_WIDE_CHAR
337 thousands_len
= strlen (thousands
);
340 /* Find the end of the digit string and check its grouping. */
343 # ifdef USE_WIDE_CHAR
346 ({ for (cnt
= 0; cnt
< thousands_len
; ++cnt
)
347 if (thousands
[cnt
] != end
[cnt
])
349 cnt
< thousands_len
; })
353 for (c
= *end
; c
!= L_('\0'); c
= *++end
)
354 if (((STRING_TYPE
) c
< L_('0') || (STRING_TYPE
) c
> L_('9'))
355 # ifdef USE_WIDE_CHAR
356 && (wchar_t) c
!= thousands
358 && ({ for (cnt
= 0; cnt
< thousands_len
; ++cnt
)
359 if (thousands
[cnt
] != end
[cnt
])
361 cnt
< thousands_len
; })
364 || (int) (TOUPPER (c
) - L_('A') + 10) >= base
))
367 # ifdef USE_WIDE_CHAR
368 end
= __correctly_grouped_prefixwc (s
, end
, thousands
, grouping
);
370 end
= __correctly_grouped_prefixmb (s
, end
, thousands
, grouping
);
378 /* Avoid runtime division; lookup cutoff and limit. */
379 cutoff
= cutoff_tab
[base
- 2];
380 cutlim
= cutlim_tab
[base
- 2];
385 if (sizeof (long int) != sizeof (LONG
int))
387 unsigned long int j
= 0;
388 unsigned long int jmax
= jmax_tab
[base
- 2];
390 for (;c
!= L_('\0'); c
= *++s
)
394 if (c
>= L_('0') && c
<= L_('9'))
396 #ifdef USE_NUMBER_GROUPING
397 # ifdef USE_WIDE_CHAR
398 else if (grouping
&& (wchar_t) c
== thousands
)
401 else if (thousands_len
)
403 for (cnt
= 0; cnt
< thousands_len
; ++cnt
)
404 if (thousands
[cnt
] != s
[cnt
])
406 if (cnt
== thousands_len
)
408 s
+= thousands_len
- 1;
412 c
= TOUPPER (c
) - L_('A') + 10;
418 else if (ISALPHA (c
))
419 c
= TOUPPER (c
) - L_('A') + 10;
424 /* Note that we never can have an overflow. */
427 /* We have an overflow. Now use the long representation. */
428 i
= (unsigned LONG
int) j
;
432 j
= j
* (unsigned long int) base
+ c
;
435 i
= (unsigned LONG
int) j
;
438 for (;c
!= L_('\0'); c
= *++s
)
442 if (c
>= L_('0') && c
<= L_('9'))
444 #ifdef USE_NUMBER_GROUPING
445 # ifdef USE_WIDE_CHAR
446 else if (grouping
&& (wchar_t) c
== thousands
)
449 else if (thousands_len
)
451 for (cnt
= 0; cnt
< thousands_len
; ++cnt
)
452 if (thousands
[cnt
] != s
[cnt
])
454 if (cnt
== thousands_len
)
456 s
+= thousands_len
- 1;
460 c
= TOUPPER (c
) - L_('A') + 10;
466 else if (ISALPHA (c
))
467 c
= TOUPPER (c
) - L_('A') + 10;
472 /* Check for overflow. */
473 if (i
> cutoff
|| (i
== cutoff
&& c
> cutlim
))
478 i
*= (unsigned LONG
int) base
;
483 /* Check if anything actually happened. */
487 /* Store in ENDPTR the address of one character
488 past the last character we converted. */
490 *endptr
= (STRING_TYPE
*) s
;
493 /* Check for a value that is within the range of
494 `unsigned LONG int', but outside the range of `LONG int'. */
497 ? -((unsigned LONG
int) (STRTOL_LONG_MIN
+ 1)) + 1
498 : (unsigned LONG
int) STRTOL_LONG_MAX
))
502 if (__builtin_expect (overflow
, 0))
504 __set_errno (ERANGE
);
506 return STRTOL_ULONG_MAX
;
508 return negative
? STRTOL_LONG_MIN
: STRTOL_LONG_MAX
;
512 /* Return the result of the appropriate sign. */
513 return negative
? -i
: i
;
516 /* We must handle a special case here: the base is 0 or 16 and the
517 first two characters are '0' and 'x', but the rest are no
518 hexadecimal digits. This is no error case. We return 0 and
519 ENDPTR points to the `x`. */
522 if (save
- nptr
>= 2 && TOUPPER (save
[-1]) == L_('X')
523 && save
[-2] == L_('0'))
524 *endptr
= (STRING_TYPE
*) &save
[-1];
526 /* There was no number to convert. */
527 *endptr
= (STRING_TYPE
*) nptr
;
532 #if defined _LIBC && !defined USE_WIDE_CHAR
533 libc_hidden_def (INTERNAL (__strtol_l
))
536 /* External user entry point. */
540 # if defined (__STDC__) && __STDC__
541 # define PARAMS(Args) Args
543 # define PARAMS(Args) ()
547 extern INT __strtol_l
PARAMS ((const STRING_TYPE
*nptr
, STRING_TYPE
**endptr
,
556 __strtol_l (nptr
, endptr
, base
, loc
)
557 const STRING_TYPE
*nptr
;
558 STRING_TYPE
**endptr
;
562 return INTERNAL (__strtol_l
) (nptr
, endptr
, base
, 0, loc
);
564 libc_hidden_def (__strtol_l
)
565 weak_alias (__strtol_l
, strtol_l
)