1/* A more useful interface to strtol.
2   Copyright 1995, 1996, 1998, 1999, 2001 Free Software Foundation, Inc.
3
4   This program is free software; you can redistribute it and/or modify
5   it under the terms of the GNU General Public License as published by
6   the Free Software Foundation; either version 2, or (at your option)
7   any later version.
8
9   This program is distributed in the hope that it will be useful,
10   but WITHOUT ANY WARRANTY; without even the implied warranty of
11   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12   GNU General Public License for more details.
13
14   You should have received a copy of the GNU General Public License
15   along with this program; if not, write to the Free Software Foundation,
16   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
17
18#ifndef XSTRTOL_H_
19# define XSTRTOL_H_ 1
20
21# if HAVE_INTTYPES_H
22#  include <inttypes.h> /* for uintmax_t */
23# endif
24
25# ifndef PARAMS
26#  if defined PROTOTYPES || (defined __STDC__ && __STDC__)
27#   define PARAMS(Args) Args
28#  else
29#   define PARAMS(Args) ()
30#  endif
31# endif
32
33# ifndef _STRTOL_ERROR
34enum strtol_error
35  {
36    LONGINT_OK, LONGINT_INVALID, LONGINT_INVALID_SUFFIX_CHAR, LONGINT_OVERFLOW
37  };
38typedef enum strtol_error strtol_error;
39# endif
40
41# define _DECLARE_XSTRTOL(name, type) \
42  strtol_error \
43    name PARAMS ((const char *s, char **ptr, int base, \
44		  type *val, const char *valid_suffixes));
45_DECLARE_XSTRTOL (xstrtol, long int)
46_DECLARE_XSTRTOL (xstrtoul, unsigned long int)
47_DECLARE_XSTRTOL (xstrtoimax, intmax_t)
48_DECLARE_XSTRTOL (xstrtoumax, uintmax_t)
49
50# define _STRTOL_ERROR(Exit_code, Str, Argument_type_string, Err)	\
51  do									\
52    {									\
53      switch ((Err))							\
54	{								\
55	case LONGINT_OK:						\
56	  abort ();							\
57									\
58	case LONGINT_INVALID:						\
59	  error ((Exit_code), 0, "invalid %s `%s'",			\
60		 (Argument_type_string), (Str));			\
61	  break;							\
62									\
63	case LONGINT_INVALID_SUFFIX_CHAR:				\
64	  error ((Exit_code), 0, "invalid character following %s in `%s'", \
65		 (Argument_type_string), (Str));			\
66	  break;							\
67									\
68	case LONGINT_OVERFLOW:						\
69	  error ((Exit_code), 0, "%s `%s' too large",			\
70		 (Argument_type_string), (Str));			\
71	  break;							\
72	}								\
73    }									\
74  while (0)
75
76# define STRTOL_FATAL_ERROR(Str, Argument_type_string, Err)		\
77  _STRTOL_ERROR (2, Str, Argument_type_string, Err)
78
79# define STRTOL_FAIL_WARN(Str, Argument_type_string, Err)		\
80  _STRTOL_ERROR (0, Str, Argument_type_string, Err)
81
82#endif /* not XSTRTOL_H_ */
83