1/* A more useful interface to strtol. 2 3 Copyright (C) 1995, 1996, 1998, 1999, 2001, 2002, 2003, 2004 Free 4 Software Foundation, Inc. 5 6 This program is free software; you can redistribute it and/or modify 7 it under the terms of the GNU General Public License as published by 8 the Free Software Foundation; either version 2, or (at your option) 9 any later version. 10 11 This program 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 General Public License for more details. 15 16 You should have received a copy of the GNU General Public License 17 along with this program; if not, write to the Free Software Foundation, 18 Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ 19 20#ifndef XSTRTOL_H_ 21# define XSTRTOL_H_ 1 22 23# include "exitfail.h" 24 25# if HAVE_INTTYPES_H 26# include <inttypes.h> 27# endif 28# if HAVE_STDINT_H 29# include <stdint.h> 30# endif 31 32# ifndef _STRTOL_ERROR 33enum strtol_error 34 { 35 LONGINT_OK = 0, 36 37 /* These two values can be ORed together, to indicate that both 38 errors occurred. */ 39 LONGINT_OVERFLOW = 1, 40 LONGINT_INVALID_SUFFIX_CHAR = 2, 41 42 LONGINT_INVALID_SUFFIX_CHAR_WITH_OVERFLOW = (LONGINT_INVALID_SUFFIX_CHAR 43 | LONGINT_OVERFLOW), 44 LONGINT_INVALID = 4 45 }; 46typedef enum strtol_error strtol_error; 47# endif 48 49# define _DECLARE_XSTRTOL(name, type) \ 50 strtol_error name (const char *, char **, int, type *, const char *); 51_DECLARE_XSTRTOL (xstrtol, long int) 52_DECLARE_XSTRTOL (xstrtoul, unsigned long int) 53_DECLARE_XSTRTOL (xstrtoimax, intmax_t) 54_DECLARE_XSTRTOL (xstrtoumax, uintmax_t) 55 56# define _STRTOL_ERROR(Exit_code, Str, Argument_type_string, Err) \ 57 do \ 58 { \ 59 switch ((Err)) \ 60 { \ 61 default: \ 62 abort (); \ 63 \ 64 case LONGINT_INVALID: \ 65 error ((Exit_code), 0, "invalid %s `%s'", \ 66 (Argument_type_string), (Str)); \ 67 break; \ 68 \ 69 case LONGINT_INVALID_SUFFIX_CHAR: \ 70 case LONGINT_INVALID_SUFFIX_CHAR | LONGINT_OVERFLOW: \ 71 error ((Exit_code), 0, "invalid character following %s in `%s'", \ 72 (Argument_type_string), (Str)); \ 73 break; \ 74 \ 75 case LONGINT_OVERFLOW: \ 76 error ((Exit_code), 0, "%s `%s' too large", \ 77 (Argument_type_string), (Str)); \ 78 break; \ 79 } \ 80 } \ 81 while (0) 82 83# define STRTOL_FATAL_ERROR(Str, Argument_type_string, Err) \ 84 _STRTOL_ERROR (exit_failure, Str, Argument_type_string, Err) 85 86# define STRTOL_FAIL_WARN(Str, Argument_type_string, Err) \ 87 _STRTOL_ERROR (0, Str, Argument_type_string, Err) 88 89#endif /* not XSTRTOL_H_ */ 90