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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ 19 20 #ifndef XSTRTOL_H_ 21 # define XSTRTOL_H_ 1 22 23 # include "exitfail.h" 24 25 /* Get uintmax_t. */ 26 # if HAVE_INTTYPES_H 27 # include <inttypes.h> 28 # else 29 # if HAVE_STDINT_H 30 # include <stdint.h> 31 # endif 32 # endif 33 34 # ifndef _STRTOL_ERROR 35 enum strtol_error 36 { 37 LONGINT_OK = 0, 38 39 /* These two values can be ORed together, to indicate that both 40 errors occurred. */ 41 LONGINT_OVERFLOW = 1, 42 LONGINT_INVALID_SUFFIX_CHAR = 2, 43 44 LONGINT_INVALID_SUFFIX_CHAR_WITH_OVERFLOW = (LONGINT_INVALID_SUFFIX_CHAR 45 | LONGINT_OVERFLOW), 46 LONGINT_INVALID = 4 47 }; 48 typedef enum strtol_error strtol_error; 49 # endif 50 51 # define _DECLARE_XSTRTOL(name, type) \ 52 strtol_error name (const char *, char **, int, type *, const char *); 53 _DECLARE_XSTRTOL (xstrtol, long int) 54 _DECLARE_XSTRTOL (xstrtoul, unsigned long int) 55 _DECLARE_XSTRTOL (xstrtoimax, intmax_t) 56 _DECLARE_XSTRTOL (xstrtoumax, uintmax_t) 57 58 # define _STRTOL_ERROR(Exit_code, Str, Argument_type_string, Err) \ 59 do \ 60 { \ 61 switch ((Err)) \ 62 { \ 63 default: \ 64 abort (); \ 65 \ 66 case LONGINT_INVALID: \ 67 error ((Exit_code), 0, "invalid %s `%s'", \ 68 (Argument_type_string), (Str)); \ 69 break; \ 70 \ 71 case LONGINT_INVALID_SUFFIX_CHAR: \ 72 case LONGINT_INVALID_SUFFIX_CHAR | LONGINT_OVERFLOW: \ 73 error ((Exit_code), 0, "invalid character following %s in `%s'", \ 74 (Argument_type_string), (Str)); \ 75 break; \ 76 \ 77 case LONGINT_OVERFLOW: \ 78 error ((Exit_code), 0, "%s `%s' too large", \ 79 (Argument_type_string), (Str)); \ 80 break; \ 81 } \ 82 } \ 83 while (0) 84 85 # define STRTOL_FATAL_ERROR(Str, Argument_type_string, Err) \ 86 _STRTOL_ERROR (exit_failure, Str, Argument_type_string, Err) 87 88 # define STRTOL_FAIL_WARN(Str, Argument_type_string, Err) \ 89 _STRTOL_ERROR (0, Str, Argument_type_string, Err) 90 91 #endif /* not XSTRTOL_H_ */ 92