1 /* Convert string representation of a number into an integer value.
2    Copyright (C) 1991-2022 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
INTERNAL(strtol)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 }
libc_hidden_def(INTERNAL (strtol))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)
110