(root)/
glibc-2.38/
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)