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 17enum strtol_error 18 { 19 LONGINT_OK, LONGINT_INVALID, LONGINT_INVALID_SUFFIX_CHAR, LONGINT_OVERFLOW 20 }; 21typedef 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