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