Prefer https to http for gnu.org and fsf.org URLs
[platform/upstream/glibc.git] / stdlib / strtol.c
1 /* Convert string representation of a number into an integer value.
2    Copyright (C) 1991-2019 Free Software Foundation, Inc.
3    This file is part of the GNU C Library.
4
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.
9
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.
14
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/>.  */
18
19 #include <stdlib.h>
20 #include <wchar.h>
21 #include <locale/localeinfo.h>
22
23 #ifndef UNSIGNED
24 # define UNSIGNED 0
25 # define INT LONG int
26 #else
27 # define INT unsigned LONG int
28 #endif
29
30 #if UNSIGNED
31 # ifdef USE_WIDE_CHAR
32 #  ifdef QUAD
33 #   define strtol wcstoull
34 #   define __strtol_l __wcstoull_l
35 #  else
36 #   define strtol wcstoul
37 #   define __strtol_l __wcstoul_l
38 #  endif
39 # else
40 #  ifdef QUAD
41 #   define strtol strtoull
42 #   define __strtol_l __strtoull_l
43 #  else
44 #   define strtol strtoul
45 #   define __strtol_l __strtoul_l
46 #  endif
47 # endif
48 #else
49 # ifdef USE_WIDE_CHAR
50 #  ifdef QUAD
51 #   define strtol wcstoll
52 #   define __strtol_l __wcstoll_l
53 #  else
54 #   define strtol wcstol
55 #   define __strtol_l __wcstol_l
56 #  endif
57 # else
58 #  ifdef QUAD
59 #   define strtol strtoll
60 #   define __strtol_l __strtoll_l
61 #  endif
62 # endif
63 #endif
64
65
66 /* If QUAD is defined, we are defining `strtoll' or `strtoull',
67    operating on `long long int's.  */
68 #ifdef QUAD
69 # define LONG long long
70 #else
71 # define LONG long
72 #endif
73
74
75 #ifdef USE_WIDE_CHAR
76 # define STRING_TYPE wchar_t
77 #else
78 # define STRING_TYPE char
79 #endif
80
81
82 #define INTERNAL(X) INTERNAL1(X)
83 #define INTERNAL1(X) __##X##_internal
84
85 #define SYM__(X) SYM__1 (X)
86 #define SYM__1(X) __ ## X
87 #define __strtol SYM__ (strtol)
88
89
90 extern INT INTERNAL (__strtol_l) (const STRING_TYPE *, STRING_TYPE **, int,
91                                   int, locale_t);
92
93
94 INT
95 INTERNAL (strtol) (const STRING_TYPE *nptr, STRING_TYPE **endptr,
96                    int base, int group)
97 {
98   return INTERNAL (__strtol_l) (nptr, endptr, base, group, _NL_CURRENT_LOCALE);
99 }
100 libc_hidden_def (INTERNAL (strtol))
101
102
103 INT
104 __strtol (const STRING_TYPE *nptr, STRING_TYPE **endptr, int base)
105 {
106   return INTERNAL (__strtol_l) (nptr, endptr, base, 0, _NL_CURRENT_LOCALE);
107 }
108 weak_alias (__strtol, strtol)
109 libc_hidden_weak (strtol)