Add xstrtoimax.
[gnulib.git] / lib / xstrtol.h
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 (xstrtoimax, intmax_t)
31 _DECLARE_XSTRTOL (xstrtoumax, uintmax_t)
32
33 # define _STRTOL_ERROR(Exit_code, Str, Argument_type_string, Err)       \
34   do                                                                    \
35     {                                                                   \
36       switch ((Err))                                                    \
37         {                                                               \
38         case LONGINT_OK:                                                \
39           abort ();                                                     \
40                                                                         \
41         case LONGINT_INVALID:                                           \
42           error ((Exit_code), 0, "invalid %s `%s'",                     \
43                  (Argument_type_string), (Str));                        \
44           break;                                                        \
45                                                                         \
46         case LONGINT_INVALID_SUFFIX_CHAR:                               \
47           error ((Exit_code), 0, "invalid character following %s `%s'", \
48                  (Argument_type_string), (Str));                        \
49           break;                                                        \
50                                                                         \
51         case LONGINT_OVERFLOW:                                          \
52           error ((Exit_code), 0, "%s `%s' too large",                   \
53                  (Argument_type_string), (Str));                        \
54           break;                                                        \
55         }                                                               \
56     }                                                                   \
57   while (0)
58
59 # define STRTOL_FATAL_ERROR(Str, Argument_type_string, Err)             \
60   _STRTOL_ERROR (2, Str, Argument_type_string, Err)
61
62 # define STRTOL_FAIL_WARN(Str, Argument_type_string, Err)               \
63   _STRTOL_ERROR (0, Str, Argument_type_string, Err)
64
65 #endif /* not XSTRTOL_H_ */