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