1/* A more useful interface to strtol.
2
3   Copyright (C) 1995, 1996, 1998, 1999, 2001, 2002, 2003, 2004 Free
4   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# if HAVE_INTTYPES_H
26#  include <inttypes.h>
27# endif
28# if HAVE_STDINT_H
29#  include <stdint.h>
30# endif
31
32# ifndef _STRTOL_ERROR
33enum strtol_error
34  {
35    LONGINT_OK = 0,
36
37    /* These two values can be ORed together, to indicate that both
38       errors occurred.  */
39    LONGINT_OVERFLOW = 1,
40    LONGINT_INVALID_SUFFIX_CHAR = 2,
41
42    LONGINT_INVALID_SUFFIX_CHAR_WITH_OVERFLOW = (LONGINT_INVALID_SUFFIX_CHAR
43						 | LONGINT_OVERFLOW),
44    LONGINT_INVALID = 4
45  };
46typedef enum strtol_error strtol_error;
47# endif
48
49# define _DECLARE_XSTRTOL(name, type) \
50  strtol_error name (const char *, char **, int, type *, const char *);
51_DECLARE_XSTRTOL (xstrtol, long int)
52_DECLARE_XSTRTOL (xstrtoul, unsigned long int)
53_DECLARE_XSTRTOL (xstrtoimax, intmax_t)
54_DECLARE_XSTRTOL (xstrtoumax, uintmax_t)
55
56# define _STRTOL_ERROR(Exit_code, Str, Argument_type_string, Err)	\
57  do									\
58    {									\
59      switch ((Err))							\
60	{								\
61	default:							\
62	  abort ();							\
63									\
64	case LONGINT_INVALID:						\
65	  error ((Exit_code), 0, "invalid %s `%s'",			\
66		 (Argument_type_string), (Str));			\
67	  break;							\
68									\
69	case LONGINT_INVALID_SUFFIX_CHAR:				\
70	case LONGINT_INVALID_SUFFIX_CHAR | LONGINT_OVERFLOW:		\
71	  error ((Exit_code), 0, "invalid character following %s in `%s'", \
72		 (Argument_type_string), (Str));			\
73	  break;							\
74									\
75	case LONGINT_OVERFLOW:						\
76	  error ((Exit_code), 0, "%s `%s' too large",			\
77		 (Argument_type_string), (Str));			\
78	  break;							\
79	}								\
80    }									\
81  while (0)
82
83# define STRTOL_FATAL_ERROR(Str, Argument_type_string, Err)		\
84  _STRTOL_ERROR (exit_failure, Str, Argument_type_string, Err)
85
86# define STRTOL_FAIL_WARN(Str, Argument_type_string, Err)		\
87  _STRTOL_ERROR (0, Str, Argument_type_string, Err)
88
89#endif /* not XSTRTOL_H_ */
90