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