1 #ifndef XSTRTOL_H_ 2 # define XSTRTOL_H_ 1 3 4 # if HAVE_INTTYPES_H 5 # include <inttypes.h> /* for uintmax_t */ 6 # endif 7 8 # ifndef PARAMS 9 # if defined PROTOTYPES || (defined __STDC__ && __STDC__) 10 # define PARAMS(Args) Args 11 # else 12 # define PARAMS(Args) () 13 # endif 14 # endif 15 16 # ifndef _STRTOL_ERROR 17 enum strtol_error 18 { 19 LONGINT_OK, LONGINT_INVALID, LONGINT_INVALID_SUFFIX_CHAR, LONGINT_OVERFLOW 20 }; 21 typedef enum strtol_error strtol_error; 22 # endif 23 24 # define _DECLARE_XSTRTOL(name, type) \ 25 strtol_error \ 26 name PARAMS ((const char *s, char **ptr, int base, \ 27 type *val, const char *valid_suffixes)); 28 _DECLARE_XSTRTOL (xstrtol, long int) 29 _DECLARE_XSTRTOL (xstrtoul, unsigned long int) 30 _DECLARE_XSTRTOL (xstrtoumax, uintmax_t) 31 32 # define _STRTOL_ERROR(Exit_code, Str, Argument_type_string, Err) \ 33 do \ 34 { \ 35 switch ((Err)) \ 36 { \ 37 case LONGINT_OK: \ 38 abort (); \ 39 \ 40 case LONGINT_INVALID: \ 41 error ((Exit_code), 0, "invalid %s `%s'", \ 42 (Argument_type_string), (Str)); \ 43 break; \ 44 \ 45 case LONGINT_INVALID_SUFFIX_CHAR: \ 46 error ((Exit_code), 0, "invalid character following %s `%s'", \ 47 (Argument_type_string), (Str)); \ 48 break; \ 49 \ 50 case LONGINT_OVERFLOW: \ 51 error ((Exit_code), 0, "%s `%s' too large", \ 52 (Argument_type_string), (Str)); \ 53 break; \ 54 } \ 55 } \ 56 while (0) 57 58 # define STRTOL_FATAL_ERROR(Str, Argument_type_string, Err) \ 59 _STRTOL_ERROR (2, Str, Argument_type_string, Err) 60 61 # define STRTOL_FAIL_WARN(Str, Argument_type_string, Err) \ 62 _STRTOL_ERROR (0, Str, Argument_type_string, Err) 63 64 #endif /* not XSTRTOL_H_ */ 65