1/* $NetBSD$ */ 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 36enum strtol_error 37 { 38 LONGINT_OK, LONGINT_INVALID, LONGINT_INVALID_SUFFIX_CHAR, LONGINT_OVERFLOW 39 }; 40typedef 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