util-isnumber.hc (1750B)
1 // $Id$ --*- c -*-- 2 3 // Copyright (C) 2006 Enrico Scholz <enrico.scholz@informatik.tu-chemnitz.de> 4 // 5 // This program is free software; you can redistribute it and/or modify 6 // it under the terms of the GNU General Public License as published by 7 // the Free Software Foundation; version 2 of the License. 8 // 9 // This program is distributed in the hope that it will be useful, 10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 // GNU General Public License for more details. 13 // 14 // You should have received a copy of the GNU General Public License 15 // along with this program; if not, write to the Free Software 16 // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 17 18 #include <stdbool.h> 19 #include <stdlib.h> 20 #include <errno.h> 21 22 #define ENSC_DECL_UTIL_ISNUMBER(NAME,TYPE,FUNC) \ 23 bool \ 24 NAME(char const *str, TYPE *result, bool is_strict) \ 25 { \ 26 char * errptr; \ 27 TYPE val; \ 28 unsigned int fac = 1; \ 29 \ 30 errno = 0; \ 31 val = FUNC(str, &errptr, 0); \ 32 if (errno==ERANGE) \ 33 return false; \ 34 if (errptr!=str && !is_strict) { \ 35 switch (*errptr) { \ 36 case 'M' : fac *= 1024; /* fallthrough */ \ 37 case 'K' : fac *= 1024; ++errptr; break; \ 38 case 'm' : fac *= 1000; /* fallthrough */ \ 39 case 'k' : fac *= 1000; ++errptr; break; \ 40 default : break; \ 41 } \ 42 } \ 43 if (!checkConstraints(val,fac)) \ 44 return false; \ 45 \ 46 if (*errptr!='\0' || errptr==str) \ 47 return false; \ 48 else { \ 49 if (result) *result = val*fac; \ 50 return true; \ 51 } \ 52 }