1131554Stjr#ifndef XSTRTOL_H_
2131554Stjr# define XSTRTOL_H_ 1
3131554Stjr
4131554Stjr# if HAVE_INTTYPES_H
5131554Stjr#  include <inttypes.h> /* for uintmax_t */
6131554Stjr# endif
7131554Stjr
8131554Stjr# ifndef PARAMS
9131554Stjr#  if defined PROTOTYPES || (defined __STDC__ && __STDC__)
10131554Stjr#   define PARAMS(Args) Args
11131554Stjr#  else
12131554Stjr#   define PARAMS(Args) ()
13131554Stjr#  endif
14131554Stjr# endif
15131554Stjr
16131554Stjr# ifndef _STRTOL_ERROR
17131554Stjrenum strtol_error
18131554Stjr  {
19131554Stjr    LONGINT_OK, LONGINT_INVALID, LONGINT_INVALID_SUFFIX_CHAR, LONGINT_OVERFLOW
20131554Stjr  };
21131554Stjrtypedef enum strtol_error strtol_error;
22131554Stjr# endif
23131554Stjr
24131554Stjr# define _DECLARE_XSTRTOL(name, type) \
25131554Stjr  strtol_error \
26131554Stjr    name PARAMS ((const char *s, char **ptr, int base, \
27131554Stjr		  type *val, const char *valid_suffixes));
28131554Stjr_DECLARE_XSTRTOL (xstrtol, long int)
29131554Stjr_DECLARE_XSTRTOL (xstrtoul, unsigned long int)
30131554Stjr_DECLARE_XSTRTOL (xstrtoumax, uintmax_t)
31131554Stjr
32131554Stjr# define _STRTOL_ERROR(Exit_code, Str, Argument_type_string, Err)	\
33131554Stjr  do									\
34131554Stjr    {									\
35131554Stjr      switch ((Err))							\
36131554Stjr	{								\
37131554Stjr	case LONGINT_OK:						\
38131554Stjr	  abort ();							\
39131554Stjr									\
40131554Stjr	case LONGINT_INVALID:						\
41131554Stjr	  error ((Exit_code), 0, "invalid %s `%s'",			\
42131554Stjr		 (Argument_type_string), (Str));			\
43131554Stjr	  break;							\
44131554Stjr									\
45131554Stjr	case LONGINT_INVALID_SUFFIX_CHAR:				\
46131554Stjr	  error ((Exit_code), 0, "invalid character following %s `%s'",	\
47131554Stjr		 (Argument_type_string), (Str));			\
48131554Stjr	  break;							\
49131554Stjr									\
50131554Stjr	case LONGINT_OVERFLOW:						\
51131554Stjr	  error ((Exit_code), 0, "%s `%s' too large",			\
52131554Stjr		 (Argument_type_string), (Str));			\
53131554Stjr	  break;							\
54131554Stjr	}								\
55131554Stjr    }									\
56131554Stjr  while (0)
57131554Stjr
58131554Stjr# define STRTOL_FATAL_ERROR(Str, Argument_type_string, Err)		\
59131554Stjr  _STRTOL_ERROR (2, Str, Argument_type_string, Err)
60131554Stjr
61131554Stjr# define STRTOL_FAIL_WARN(Str, Argument_type_string, Err)		\
62131554Stjr  _STRTOL_ERROR (0, Str, Argument_type_string, Err)
63131554Stjr
64131554Stjr#endif /* not XSTRTOL_H_ */
65