a95a765088a9d14545e23466ddb41a6e672a1ffa
[gnulib.git] / lib / strtol.c
1 /* Convert string representation of a number into an integer value.
2
3    Copyright (C) 1991, 1992, 1994, 1995, 1996, 1997, 1998, 1999, 2003, 2005
4    Free Software Foundation, Inc.
5
6    NOTE: The canonical source of this file is maintained with the GNU C
7    Library.  Bugs can be reported to bug-glibc@gnu.org.
8
9    This program is free software; you can redistribute it and/or modify it
10    under the terms of the GNU General Public License as published by the
11    Free Software Foundation; either version 2, or (at your option) any
12    later version.
13
14    This program is distributed in the hope that it will be useful,
15    but WITHOUT ANY WARRANTY; without even the implied warranty of
16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17    GNU General Public License for more details.
18
19    You should have received a copy of the GNU General Public License
20    along with this program; if not, write to the Free Software Foundation,
21    Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
22
23 #if HAVE_CONFIG_H
24 # include <config.h>
25 #endif
26
27 #ifdef _LIBC
28 # define USE_NUMBER_GROUPING
29 #endif
30
31 #include <ctype.h>
32 #include <errno.h>
33 #ifndef errno
34 extern int errno;
35 #endif
36 #ifndef __set_errno
37 # define __set_errno(Val) errno = (Val)
38 #endif
39
40 #include <limits.h>
41 #include <stddef.h>
42 #include <stdlib.h>
43 #include <string.h>
44
45 #ifdef USE_NUMBER_GROUPING
46 # include "../locale/localeinfo.h"
47 #endif
48
49 /* Nonzero if we are defining `strtoul' or `strtoull', operating on
50    unsigned integers.  */
51 #ifndef UNSIGNED
52 # define UNSIGNED 0
53 # define INT LONG int
54 #else
55 # define INT unsigned LONG int
56 #endif
57
58 /* Determine the name.  */
59 #ifdef USE_IN_EXTENDED_LOCALE_MODEL
60 # if UNSIGNED
61 #  ifdef USE_WIDE_CHAR
62 #   ifdef QUAD
63 #    define strtol __wcstoull_l
64 #   else
65 #    define strtol __wcstoul_l
66 #   endif
67 #  else
68 #   ifdef QUAD
69 #    define strtol __strtoull_l
70 #   else
71 #    define strtol __strtoul_l
72 #   endif
73 #  endif
74 # else
75 #  ifdef USE_WIDE_CHAR
76 #   ifdef QUAD
77 #    define strtol __wcstoll_l
78 #   else
79 #    define strtol __wcstol_l
80 #   endif
81 #  else
82 #   ifdef QUAD
83 #    define strtol __strtoll_l
84 #   else
85 #    define strtol __strtol_l
86 #   endif
87 #  endif
88 # endif
89 #else
90 # if UNSIGNED
91 #  ifdef USE_WIDE_CHAR
92 #   ifdef QUAD
93 #    define strtol wcstoull
94 #   else
95 #    define strtol wcstoul
96 #   endif
97 #  else
98 #   ifdef QUAD
99 #    define strtol strtoull
100 #   else
101 #    define strtol strtoul
102 #   endif
103 #  endif
104 # else
105 #  ifdef USE_WIDE_CHAR
106 #   ifdef QUAD
107 #    define strtol wcstoll
108 #   else
109 #    define strtol wcstol
110 #   endif
111 #  else
112 #   ifdef QUAD
113 #    define strtol strtoll
114 #   endif
115 #  endif
116 # endif
117 #endif
118
119 /* If QUAD is defined, we are defining `strtoll' or `strtoull',
120    operating on `long long int's.  */
121 #ifdef QUAD
122 # define LONG long long
123 # define STRTOL_LONG_MIN LONG_LONG_MIN
124 # define STRTOL_LONG_MAX LONG_LONG_MAX
125 # define STRTOL_ULONG_MAX ULONG_LONG_MAX
126
127 /* The extra casts in the following macros work around compiler bugs,
128    e.g., in Cray C 5.0.3.0.  */
129
130 /* True if the arithmetic type T is signed.  */
131 # ifndef TYPE_SIGNED
132 #  define TYPE_SIGNED(t) (! ((t) 0 < (t) -1))
133 # endif
134
135 /* The maximum and minimum values for the integer type T.  These
136    macros have undefined behavior if T is signed and has padding bits
137    (i.e., bits that do not contribute to the value), or if T uses
138    signed-magnitude representation.  If this is a problem for you,
139    please let us know how to fix it for your host.  */
140 # ifndef TYPE_MINIMUM
141 #  define TYPE_MINIMUM(t) ((t) (TYPE_SIGNED (t) \
142                                 ? ~ (t) 0 << (sizeof (t) * CHAR_BIT - 1) \
143                                 : (t) 0))
144 # endif
145 # ifndef TYPE_MAXIMUM
146 #  define TYPE_MAXIMUM(t) ((t) (~ (t) 0 - TYPE_MINIMUM (t)))
147 # endif
148
149 # ifndef ULONG_LONG_MAX
150 #  define ULONG_LONG_MAX TYPE_MAXIMUM (unsigned long long)
151 # endif
152 # ifndef LONG_LONG_MAX
153 #  define LONG_LONG_MAX TYPE_MAXIMUM (long long int)
154 # endif
155 # ifndef LONG_LONG_MIN
156 #  define LONG_LONG_MIN TYPE_MINIMUM (long long int)
157 # endif
158
159 # if __GNUC__ == 2 && __GNUC_MINOR__ < 7
160    /* Work around gcc bug with using this constant.  */
161    static const unsigned long long int maxquad = ULONG_LONG_MAX;
162 #  undef STRTOL_ULONG_MAX
163 #  define STRTOL_ULONG_MAX maxquad
164 # endif
165 #else
166 # define LONG long
167 # define STRTOL_LONG_MIN LONG_MIN
168 # define STRTOL_LONG_MAX LONG_MAX
169 # define STRTOL_ULONG_MAX ULONG_MAX
170 #endif
171
172
173 /* We use this code also for the extended locale handling where the
174    function gets as an additional argument the locale which has to be
175    used.  To access the values we have to redefine the _NL_CURRENT
176    macro.  */
177 #ifdef USE_IN_EXTENDED_LOCALE_MODEL
178 # undef _NL_CURRENT
179 # define _NL_CURRENT(category, item) \
180   (current->values[_NL_ITEM_INDEX (item)].string)
181 # define LOCALE_PARAM , loc
182 # define LOCALE_PARAM_PROTO , __locale_t loc
183 #else
184 # define LOCALE_PARAM
185 # define LOCALE_PARAM_PROTO
186 #endif
187
188 #if defined _LIBC || defined HAVE_WCHAR_H
189 # include <wchar.h>
190 #endif
191
192 #ifdef USE_WIDE_CHAR
193 # include <wctype.h>
194 # define L_(Ch) L##Ch
195 # define UCHAR_TYPE wint_t
196 # define STRING_TYPE wchar_t
197 # ifdef USE_IN_EXTENDED_LOCALE_MODEL
198 #  define ISSPACE(Ch) __iswspace_l ((Ch), loc)
199 #  define ISALPHA(Ch) __iswalpha_l ((Ch), loc)
200 #  define TOUPPER(Ch) __towupper_l ((Ch), loc)
201 # else
202 #  define ISSPACE(Ch) iswspace (Ch)
203 #  define ISALPHA(Ch) iswalpha (Ch)
204 #  define TOUPPER(Ch) towupper (Ch)
205 # endif
206 #else
207 # if defined STDC_HEADERS || (!defined isascii && !defined HAVE_ISASCII)
208 #  define IN_CTYPE_DOMAIN(c) 1
209 # else
210 #  define IN_CTYPE_DOMAIN(c) isascii(c)
211 # endif
212 # define L_(Ch) Ch
213 # define UCHAR_TYPE unsigned char
214 # define STRING_TYPE char
215 # ifdef USE_IN_EXTENDED_LOCALE_MODEL
216 #  define ISSPACE(Ch) __isspace_l ((Ch), loc)
217 #  define ISALPHA(Ch) __isalpha_l ((Ch), loc)
218 #  define TOUPPER(Ch) __toupper_l ((Ch), loc)
219 # else
220 #  define ISSPACE(Ch) (IN_CTYPE_DOMAIN (Ch) && isspace (Ch))
221 #  define ISALPHA(Ch) (IN_CTYPE_DOMAIN (Ch) && isalpha (Ch))
222 #  define TOUPPER(Ch) (IN_CTYPE_DOMAIN (Ch) ? toupper (Ch) : (Ch))
223 # endif
224 #endif
225
226 #define INTERNAL(X) INTERNAL1(X)
227 #define INTERNAL1(X) __##X##_internal
228 #define WEAKNAME(X) WEAKNAME1(X)
229
230 #ifdef USE_NUMBER_GROUPING
231 /* This file defines a function to check for correct grouping.  */
232 # include "grouping.h"
233 #endif
234
235
236
237 /* Convert NPTR to an `unsigned long int' or `long int' in base BASE.
238    If BASE is 0 the base is determined by the presence of a leading
239    zero, indicating octal or a leading "0x" or "0X", indicating hexadecimal.
240    If BASE is < 2 or > 36, it is reset to 10.
241    If ENDPTR is not NULL, a pointer to the character after the last
242    one converted is stored in *ENDPTR.  */
243
244 INT
245 INTERNAL (strtol) (const STRING_TYPE *nptr, STRING_TYPE **endptr,
246                    int base, int group LOCALE_PARAM_PROTO)
247 {
248   int negative;
249   register unsigned LONG int cutoff;
250   register unsigned int cutlim;
251   register unsigned LONG int i;
252   register const STRING_TYPE *s;
253   register UCHAR_TYPE c;
254   const STRING_TYPE *save, *end;
255   int overflow;
256
257 #ifdef USE_NUMBER_GROUPING
258 # ifdef USE_IN_EXTENDED_LOCALE_MODEL
259   struct locale_data *current = loc->__locales[LC_NUMERIC];
260 # endif
261   /* The thousands character of the current locale.  */
262   wchar_t thousands = L'\0';
263   /* The numeric grouping specification of the current locale,
264      in the format described in <locale.h>.  */
265   const char *grouping;
266
267   if (group)
268     {
269       grouping = _NL_CURRENT (LC_NUMERIC, GROUPING);
270       if (*grouping <= 0 || *grouping == CHAR_MAX)
271         grouping = NULL;
272       else
273         {
274           /* Figure out the thousands separator character.  */
275 # if defined _LIBC || defined _HAVE_BTOWC
276           thousands = __btowc (*_NL_CURRENT (LC_NUMERIC, THOUSANDS_SEP));
277           if (thousands == WEOF)
278             thousands = L'\0';
279 # endif
280           if (thousands == L'\0')
281             grouping = NULL;
282         }
283     }
284   else
285     grouping = NULL;
286 #endif
287
288   if (base < 0 || base == 1 || base > 36)
289     {
290       __set_errno (EINVAL);
291       return 0;
292     }
293
294   save = s = nptr;
295
296   /* Skip white space.  */
297   while (ISSPACE (*s))
298     ++s;
299   if (*s == L_('\0'))
300     goto noconv;
301
302   /* Check for a sign.  */
303   if (*s == L_('-'))
304     {
305       negative = 1;
306       ++s;
307     }
308   else if (*s == L_('+'))
309     {
310       negative = 0;
311       ++s;
312     }
313   else
314     negative = 0;
315
316   /* Recognize number prefix and if BASE is zero, figure it out ourselves.  */
317   if (*s == L_('0'))
318     {
319       if ((base == 0 || base == 16) && TOUPPER (s[1]) == L_('X'))
320         {
321           s += 2;
322           base = 16;
323         }
324       else if (base == 0)
325         base = 8;
326     }
327   else if (base == 0)
328     base = 10;
329
330   /* Save the pointer so we can check later if anything happened.  */
331   save = s;
332
333 #ifdef USE_NUMBER_GROUPING
334   if (group)
335     {
336       /* Find the end of the digit string and check its grouping.  */
337       end = s;
338       for (c = *end; c != L_('\0'); c = *++end)
339         if ((wchar_t) c != thousands
340             && ((wchar_t) c < L_('0') || (wchar_t) c > L_('9'))
341             && (!ISALPHA (c) || (int) (TOUPPER (c) - L_('A') + 10) >= base))
342           break;
343       if (*s == thousands)
344         end = s;
345       else
346         end = correctly_grouped_prefix (s, end, thousands, grouping);
347     }
348   else
349 #endif
350     end = NULL;
351
352   cutoff = STRTOL_ULONG_MAX / (unsigned LONG int) base;
353   cutlim = STRTOL_ULONG_MAX % (unsigned LONG int) base;
354
355   overflow = 0;
356   i = 0;
357   for (c = *s; c != L_('\0'); c = *++s)
358     {
359       if (s == end)
360         break;
361       if (c >= L_('0') && c <= L_('9'))
362         c -= L_('0');
363       else if (ISALPHA (c))
364         c = TOUPPER (c) - L_('A') + 10;
365       else
366         break;
367       if ((int) c >= base)
368         break;
369       /* Check for overflow.  */
370       if (i > cutoff || (i == cutoff && c > cutlim))
371         overflow = 1;
372       else
373         {
374           i *= (unsigned LONG int) base;
375           i += c;
376         }
377     }
378
379   /* Check if anything actually happened.  */
380   if (s == save)
381     goto noconv;
382
383   /* Store in ENDPTR the address of one character
384      past the last character we converted.  */
385   if (endptr != NULL)
386     *endptr = (STRING_TYPE *) s;
387
388 #if !UNSIGNED
389   /* Check for a value that is within the range of
390      `unsigned LONG int', but outside the range of `LONG int'.  */
391   if (overflow == 0
392       && i > (negative
393               ? -((unsigned LONG int) (STRTOL_LONG_MIN + 1)) + 1
394               : (unsigned LONG int) STRTOL_LONG_MAX))
395     overflow = 1;
396 #endif
397
398   if (overflow)
399     {
400       __set_errno (ERANGE);
401 #if UNSIGNED
402       return STRTOL_ULONG_MAX;
403 #else
404       return negative ? STRTOL_LONG_MIN : STRTOL_LONG_MAX;
405 #endif
406     }
407
408   /* Return the result of the appropriate sign.  */
409   return negative ? -i : i;
410
411 noconv:
412   /* We must handle a special case here: the base is 0 or 16 and the
413      first two characters are '0' and 'x', but the rest are no
414      hexadecimal digits.  This is no error case.  We return 0 and
415      ENDPTR points to the `x`.  */
416   if (endptr != NULL)
417     {
418       if (save - nptr >= 2 && TOUPPER (save[-1]) == L_('X')
419           && save[-2] == L_('0'))
420         *endptr = (STRING_TYPE *) &save[-1];
421       else
422         /*  There was no number to convert.  */
423         *endptr = (STRING_TYPE *) nptr;
424     }
425
426   return 0L;
427 }
428 \f
429 /* External user entry point.  */
430
431
432 INT
433 #ifdef weak_function
434 weak_function
435 #endif
436 strtol (const STRING_TYPE *nptr, STRING_TYPE **endptr,
437         int base LOCALE_PARAM_PROTO)
438 {
439   return INTERNAL (strtol) (nptr, endptr, base, 0 LOCALE_PARAM);
440 }