1*260e9a87SYuri Pankov #include "config.h" 2*260e9a87SYuri Pankov 3*260e9a87SYuri Pankov #if HAVE_STRTONUM 4*260e9a87SYuri Pankov 5*260e9a87SYuri Pankov int dummy; 6*260e9a87SYuri Pankov 7*260e9a87SYuri Pankov #else 8*260e9a87SYuri Pankov 9*260e9a87SYuri Pankov /* $Id: compat_strtonum.c,v 1.1 2015/02/16 14:56:22 schwarze Exp $ */ 10*260e9a87SYuri Pankov /* $OpenBSD: strtonum.c,v 1.7 2013/04/17 18:40:58 tedu Exp $ */ 11*260e9a87SYuri Pankov 12*260e9a87SYuri Pankov /* 13*260e9a87SYuri Pankov * Copyright (c) 2004 Ted Unangst and Todd Miller 14*260e9a87SYuri Pankov * All rights reserved. 15*260e9a87SYuri Pankov * 16*260e9a87SYuri Pankov * Permission to use, copy, modify, and distribute this software for any 17*260e9a87SYuri Pankov * purpose with or without fee is hereby granted, provided that the above 18*260e9a87SYuri Pankov * copyright notice and this permission notice appear in all copies. 19*260e9a87SYuri Pankov * 20*260e9a87SYuri Pankov * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 21*260e9a87SYuri Pankov * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 22*260e9a87SYuri Pankov * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 23*260e9a87SYuri Pankov * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 24*260e9a87SYuri Pankov * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 25*260e9a87SYuri Pankov * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 26*260e9a87SYuri Pankov * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 27*260e9a87SYuri Pankov */ 28*260e9a87SYuri Pankov 29*260e9a87SYuri Pankov #include <errno.h> 30*260e9a87SYuri Pankov #include <limits.h> 31*260e9a87SYuri Pankov #include <stdlib.h> 32*260e9a87SYuri Pankov 33*260e9a87SYuri Pankov #define INVALID 1 34*260e9a87SYuri Pankov #define TOOSMALL 2 35*260e9a87SYuri Pankov #define TOOLARGE 3 36*260e9a87SYuri Pankov 37*260e9a87SYuri Pankov long long 38*260e9a87SYuri Pankov strtonum(const char *numstr, long long minval, long long maxval, 39*260e9a87SYuri Pankov const char **errstrp) 40*260e9a87SYuri Pankov { 41*260e9a87SYuri Pankov long long ll = 0; 42*260e9a87SYuri Pankov int error = 0; 43*260e9a87SYuri Pankov char *ep; 44*260e9a87SYuri Pankov struct errval { 45*260e9a87SYuri Pankov const char *errstr; 46*260e9a87SYuri Pankov int err; 47*260e9a87SYuri Pankov } ev[4] = { 48*260e9a87SYuri Pankov { NULL, 0 }, 49*260e9a87SYuri Pankov { "invalid", EINVAL }, 50*260e9a87SYuri Pankov { "too small", ERANGE }, 51*260e9a87SYuri Pankov { "too large", ERANGE }, 52*260e9a87SYuri Pankov }; 53*260e9a87SYuri Pankov 54*260e9a87SYuri Pankov ev[0].err = errno; 55*260e9a87SYuri Pankov errno = 0; 56*260e9a87SYuri Pankov if (minval > maxval) { 57*260e9a87SYuri Pankov error = INVALID; 58*260e9a87SYuri Pankov } else { 59*260e9a87SYuri Pankov ll = strtoll(numstr, &ep, 10); 60*260e9a87SYuri Pankov if (numstr == ep || *ep != '\0') 61*260e9a87SYuri Pankov error = INVALID; 62*260e9a87SYuri Pankov else if ((ll == LLONG_MIN && errno == ERANGE) || ll < minval) 63*260e9a87SYuri Pankov error = TOOSMALL; 64*260e9a87SYuri Pankov else if ((ll == LLONG_MAX && errno == ERANGE) || ll > maxval) 65*260e9a87SYuri Pankov error = TOOLARGE; 66*260e9a87SYuri Pankov } 67*260e9a87SYuri Pankov if (errstrp != NULL) 68*260e9a87SYuri Pankov *errstrp = ev[error].errstr; 69*260e9a87SYuri Pankov errno = ev[error].err; 70*260e9a87SYuri Pankov if (error) 71*260e9a87SYuri Pankov ll = 0; 72*260e9a87SYuri Pankov 73*260e9a87SYuri Pankov return (ll); 74*260e9a87SYuri Pankov } 75*260e9a87SYuri Pankov 76*260e9a87SYuri Pankov #endif /* !HAVE_STRTONUM */ 77