1  /* Convert string representation of a number into an intmax_t value.
       2  
       3     Copyright (C) 1999, 2001-2004, 2006, 2009-2022 Free Software Foundation,
       4     Inc.
       5  
       6     This file is free software: you can redistribute it and/or modify
       7     it under the terms of the GNU Lesser General Public License as
       8     published by the Free Software Foundation, either version 3 of the
       9     License, or (at your option) any later version.
      10  
      11     This file is distributed in the hope that it will be useful,
      12     but WITHOUT ANY WARRANTY; without even the implied warranty of
      13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      14     GNU Lesser General Public License for more details.
      15  
      16     You should have received a copy of the GNU Lesser General Public License
      17     along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
      18  
      19  /* Written by Paul Eggert. */
      20  
      21  #include <config.h>
      22  
      23  /* Verify interface.  */
      24  #include <inttypes.h>
      25  
      26  #include <stdlib.h>
      27  
      28  #include "verify.h"
      29  
      30  #ifdef UNSIGNED
      31  # ifndef HAVE_DECL_STRTOULL
      32  "this configure-time declaration test was not run"
      33  # endif
      34  # if !HAVE_DECL_STRTOULL
      35  unsigned long long int strtoull (char const *, char **, int);
      36  # endif
      37  
      38  #else
      39  
      40  # ifndef HAVE_DECL_STRTOLL
      41  "this configure-time declaration test was not run"
      42  # endif
      43  # if !HAVE_DECL_STRTOLL
      44  long long int strtoll (char const *, char **, int);
      45  # endif
      46  #endif
      47  
      48  #ifdef UNSIGNED
      49  # define Int uintmax_t
      50  # define Strtoimax strtoumax
      51  # define Strtol strtoul
      52  # define Strtoll strtoull
      53  # define Unsigned unsigned
      54  #else
      55  # define Int intmax_t
      56  # define Strtoimax strtoimax
      57  # define Strtol strtol
      58  # define Strtoll strtoll
      59  # define Unsigned
      60  #endif
      61  
      62  Int
      63  Strtoimax (char const *ptr, char **endptr, int base)
      64  {
      65    verify (sizeof (Int) == sizeof (Unsigned long int)
      66            || sizeof (Int) == sizeof (Unsigned long long int));
      67  
      68    if (sizeof (Int) != sizeof (Unsigned long int))
      69      return Strtoll (ptr, endptr, base);
      70  
      71    return Strtol (ptr, endptr, base);
      72  }