xref: /netbsd-src/external/gpl2/diffutils/dist/lib/xstrtol.h (revision 53d1339bf7f9c7367b35a9e1ebe693f9b047a47b)
1 /*	$NetBSD: xstrtol.h,v 1.1.1.1 2016/01/13 03:15:30 christos Exp $	*/
2 
3 /* A more useful interface to strtol.
4    Copyright 1995, 1996, 1998, 1999, 2001 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
19 
20 #ifndef XSTRTOL_H_
21 # define XSTRTOL_H_ 1
22 
23 # if HAVE_INTTYPES_H
24 #  include <inttypes.h> /* for uintmax_t */
25 # endif
26 
27 # ifndef PARAMS
28 #  if defined PROTOTYPES || (defined __STDC__ && __STDC__)
29 #   define PARAMS(Args) Args
30 #  else
31 #   define PARAMS(Args) ()
32 #  endif
33 # endif
34 
35 # ifndef _STRTOL_ERROR
36 enum strtol_error
37   {
38     LONGINT_OK, LONGINT_INVALID, LONGINT_INVALID_SUFFIX_CHAR, LONGINT_OVERFLOW
39   };
40 typedef enum strtol_error strtol_error;
41 # endif
42 
43 # define _DECLARE_XSTRTOL(name, type) \
44   strtol_error \
45     name PARAMS ((const char *s, char **ptr, int base, \
46 		  type *val, const char *valid_suffixes));
47 _DECLARE_XSTRTOL (xstrtol, long int)
48 _DECLARE_XSTRTOL (xstrtoul, unsigned long int)
49 _DECLARE_XSTRTOL (xstrtoimax, intmax_t)
50 _DECLARE_XSTRTOL (xstrtoumax, uintmax_t)
51 
52 # define _STRTOL_ERROR(Exit_code, Str, Argument_type_string, Err)	\
53   do									\
54     {									\
55       switch ((Err))							\
56 	{								\
57 	case LONGINT_OK:						\
58 	  abort ();							\
59 									\
60 	case LONGINT_INVALID:						\
61 	  error ((Exit_code), 0, "invalid %s `%s'",			\
62 		 (Argument_type_string), (Str));			\
63 	  break;							\
64 									\
65 	case LONGINT_INVALID_SUFFIX_CHAR:				\
66 	  error ((Exit_code), 0, "invalid character following %s in `%s'", \
67 		 (Argument_type_string), (Str));			\
68 	  break;							\
69 									\
70 	case LONGINT_OVERFLOW:						\
71 	  error ((Exit_code), 0, "%s `%s' too large",			\
72 		 (Argument_type_string), (Str));			\
73 	  break;							\
74 	}								\
75     }									\
76   while (0)
77 
78 # define STRTOL_FATAL_ERROR(Str, Argument_type_string, Err)		\
79   _STRTOL_ERROR (2, Str, Argument_type_string, Err)
80 
81 # define STRTOL_FAIL_WARN(Str, Argument_type_string, Err)		\
82   _STRTOL_ERROR (0, Str, Argument_type_string, Err)
83 
84 #endif /* not XSTRTOL_H_ */
85