1/* Convert string representation of a number into an intmax_t value. 2 3 Copyright (C) 1999, 2001 Free Software Foundation, Inc. 4 5 This program is free software; you can redistribute it and/or modify 6 it under the terms of the GNU General Public License as published by 7 the Free Software Foundation; either version 2, or (at your option) 8 any later version. 9 10 This program 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 13 GNU General Public License for more details. 14 15 You should have received a copy of the GNU General Public License 16 along with this program; if not, write to the Free Software Foundation, 17 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ 18 19/* Written by Paul Eggert. */ 20 21#if HAVE_CONFIG_H 22# include <config.h> 23#endif 24 25#if HAVE_INTTYPES_H 26# include <inttypes.h> 27#endif 28 29#if HAVE_STDLIB_H 30# include <stdlib.h> 31#endif 32 33#ifndef PARAMS 34# if defined PROTOTYPES || defined __STDC__ 35# define PARAMS(Args) Args 36# else 37# define PARAMS(Args) () 38# endif 39#endif 40 41/* Verify a requirement at compile-time (unlike assert, which is runtime). */ 42#define verify(name, assertion) struct name { char a[(assertion) ? 1 : -1]; } 43 44#ifdef UNSIGNED 45# ifndef HAVE_DECL_STRTOUL 46"this configure-time declaration test was not run" 47# endif 48# if !HAVE_DECL_STRTOUL 49unsigned long strtoul PARAMS ((char const *, char **, int)); 50# endif 51# ifndef HAVE_DECL_STRTOULL 52"this configure-time declaration test was not run" 53# endif 54# if !HAVE_DECL_STRTOULL && HAVE_UNSIGNED_LONG_LONG 55unsigned long long strtoull PARAMS ((char const *, char **, int)); 56# endif 57 58#else 59 60# ifndef HAVE_DECL_STRTOL 61"this configure-time declaration test was not run" 62# endif 63# if !HAVE_DECL_STRTOL 64long strtol PARAMS ((char const *, char **, int)); 65# endif 66# ifndef HAVE_DECL_STRTOLL 67"this configure-time declaration test was not run" 68# endif 69# if !HAVE_DECL_STRTOLL && HAVE_UNSIGNED_LONG_LONG 70long long strtoll PARAMS ((char const *, char **, int)); 71# endif 72#endif 73 74#ifdef UNSIGNED 75# undef HAVE_LONG_LONG 76# define HAVE_LONG_LONG HAVE_UNSIGNED_LONG_LONG 77# define INT uintmax_t 78# define strtoimax strtoumax 79# define strtol strtoul 80# define strtoll strtoull 81#else 82# define INT intmax_t 83#endif 84 85INT 86strtoimax (char const *ptr, char **endptr, int base) 87{ 88#if HAVE_LONG_LONG 89 verify (size_is_that_of_long_or_long_long, 90 (sizeof (INT) == sizeof (long) 91 || sizeof (INT) == sizeof (long long))); 92 93 if (sizeof (INT) != sizeof (long)) 94 return strtoll (ptr, endptr, base); 95#else 96 verify (size_is_that_of_long, 97 sizeof (INT) == sizeof (long)); 98#endif 99 100 return strtol (ptr, endptr, base); 101} 102