Remove 'grp' and merge into 'nss' and 'posix'
[platform/upstream/glibc.git] / stdlib / strtol.c
1 /* Convert string representation of a number into an integer value.
2    Copyright (C) 1991-2023 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 <features.h>
20 #undef __GLIBC_USE_C2X_STRTOL
21 #define __GLIBC_USE_C2X_STRTOL 0
22 #include <stdlib.h>
23 #include <wchar.h>
24 #include <locale/localeinfo.h>
25
26 #ifndef UNSIGNED
27 # define UNSIGNED 0
28 # define INT LONG int
29 #else
30 # define INT unsigned LONG int
31 #endif
32
33 #if UNSIGNED
34 # ifdef USE_WIDE_CHAR
35 #  ifdef QUAD
36 #   define strtol wcstoull
37 #   define __strtol_l __wcstoull_l
38 #   define __isoc23_strtol __isoc23_wcstoull
39 #  else
40 #   define strtol wcstoul
41 #   define __strtol_l __wcstoul_l
42 #   define __isoc23_strtol __isoc23_wcstoul
43 #  endif
44 # else
45 #  ifdef QUAD
46 #   define strtol strtoull
47 #   define __strtol_l __strtoull_l
48 #   define __isoc23_strtol __isoc23_strtoull
49 #  else
50 #   define strtol strtoul
51 #   define __strtol_l __strtoul_l
52 #   define __isoc23_strtol __isoc23_strtoul
53 #  endif
54 # endif
55 #else
56 # ifdef USE_WIDE_CHAR
57 #  ifdef QUAD
58 #   define strtol wcstoll
59 #   define __strtol_l __wcstoll_l
60 #   define __isoc23_strtol __isoc23_wcstoll
61 #  else
62 #   define strtol wcstol
63 #   define __strtol_l __wcstol_l
64 #   define __isoc23_strtol __isoc23_wcstol
65 #  endif
66 # else
67 #  ifdef QUAD
68 #   define strtol strtoll
69 #   define __strtol_l __strtoll_l
70 #   define __isoc23_strtol __isoc23_strtoll
71 #  endif
72 # endif
73 #endif
74
75
76 /* If QUAD is defined, we are defining `strtoll' or `strtoull',
77    operating on `long long int's.  */
78 #ifdef QUAD
79 # define LONG long long
80 #else
81 # define LONG long
82 #endif
83
84
85 #ifdef USE_WIDE_CHAR
86 # define STRING_TYPE wchar_t
87 #else
88 # define STRING_TYPE char
89 #endif
90
91
92 #define INTERNAL(X) INTERNAL1(X)
93 #define INTERNAL1(X) __##X##_internal
94
95 #define SYM__(X) SYM__1 (X)
96 #define SYM__1(X) __ ## X
97 #define __strtol SYM__ (strtol)
98
99
100 extern INT INTERNAL (__strtol_l) (const STRING_TYPE *, STRING_TYPE **, int,
101                                   int, bool, locale_t);
102
103
104 INT
105 INTERNAL (strtol) (const STRING_TYPE *nptr, STRING_TYPE **endptr,
106                    int base, int group)
107 {
108   return INTERNAL (__strtol_l) (nptr, endptr, base, group, false,
109                                 _NL_CURRENT_LOCALE);
110 }
111 libc_hidden_def (INTERNAL (strtol))
112
113
114 INT
115 __strtol (const STRING_TYPE *nptr, STRING_TYPE **endptr, int base)
116 {
117   return INTERNAL (__strtol_l) (nptr, endptr, base, 0, false,
118                                 _NL_CURRENT_LOCALE);
119 }
120 weak_alias (__strtol, strtol)
121 libc_hidden_weak (strtol)
122
123 INT
124 __isoc23_strtol (const STRING_TYPE *nptr, STRING_TYPE **endptr, int base)
125 {
126   return INTERNAL (__strtol_l) (nptr, endptr, base, 0, true,
127                                 _NL_CURRENT_LOCALE);
128 }
129 libc_hidden_def (__isoc23_strtol)