2007-07-25 Jim Meyering <jim@meyering.net>
[gnulib.git] / lib / xstrtol.h
1 /* A more useful interface to strtol.
2
3    Copyright (C) 1995, 1996, 1998, 1999, 2001-2004, 2006-2007
4    Free Software Foundation, Inc.
5
6    This program is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 2, or (at your option)
9    any later version.
10
11    This program is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15
16    You should have received a copy of the GNU General Public License
17    along with this program; if not, write to the Free Software Foundation,
18    Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
19
20 #ifndef XSTRTOL_H_
21 # define XSTRTOL_H_ 1
22
23 # include "exitfail.h"
24
25 # include <inttypes.h>
26
27 # include "gettext.h"
28
29 # ifndef _STRTOL_ERROR
30 enum strtol_error
31   {
32     LONGINT_OK = 0,
33
34     /* These two values can be ORed together, to indicate that both
35        errors occurred.  */
36     LONGINT_OVERFLOW = 1,
37     LONGINT_INVALID_SUFFIX_CHAR = 2,
38
39     LONGINT_INVALID_SUFFIX_CHAR_WITH_OVERFLOW = (LONGINT_INVALID_SUFFIX_CHAR
40                                                  | LONGINT_OVERFLOW),
41     LONGINT_INVALID = 4
42   };
43 typedef enum strtol_error strtol_error;
44 # endif
45
46 # define _DECLARE_XSTRTOL(name, type) \
47   strtol_error name (const char *, char **, int, type *, const char *);
48 _DECLARE_XSTRTOL (xstrtol, long int)
49 _DECLARE_XSTRTOL (xstrtoul, unsigned long int)
50 _DECLARE_XSTRTOL (xstrtoimax, intmax_t)
51 _DECLARE_XSTRTOL (xstrtoumax, uintmax_t)
52
53 /* Signal an error for an out-of-range integer argument, through the error()
54    function.
55    EXIT_CODE is the exit code (0 for a non-fatal error).
56    STR is the value of the given argument value.
57    OPTION is the option that takes the argument (usually starting with one
58    or two minus signs).
59    ERR is the error code returned by one of the xstrto* functions.  */
60 # define _STRTOL_ERROR(Exit_code, Str, Option, Err)                     \
61   do                                                                    \
62     {                                                                   \
63       switch ((Err))                                                    \
64         {                                                               \
65         default:                                                        \
66           abort ();                                                     \
67                                                                         \
68         case LONGINT_INVALID:                                           \
69           error ((Exit_code), 0, gettext ("invalid %s argument `%s'"),  \
70                  (Option), (Str));                                      \
71           break;                                                        \
72                                                                         \
73         case LONGINT_INVALID_SUFFIX_CHAR:                               \
74         case LONGINT_INVALID_SUFFIX_CHAR | LONGINT_OVERFLOW:            \
75           error ((Exit_code), 0,                                        \
76                  gettext ("invalid character following %s argument in `%s'"), \
77                  (Option), (Str));                                      \
78           break;                                                        \
79                                                                         \
80         case LONGINT_OVERFLOW:                                          \
81           error ((Exit_code), 0, gettext ("%s argument `%s' too large"), \
82                  (Option), (Str));                                      \
83           break;                                                        \
84         }                                                               \
85     }                                                                   \
86   while (0)
87
88 # define STRTOL_FATAL_ERROR(Str, Option, Err)                           \
89   _STRTOL_ERROR (exit_failure, Str, Option, Err)
90
91 # define STRTOL_FAIL_WARN(Str, Option, Err)                             \
92   _STRTOL_ERROR (0, Str, Option, Err)
93
94 #endif /* not XSTRTOL_H_ */