strtonum.c revision 303975
1122394Sharti/* $OpenBSD: strtonum.c,v 1.6 2004/08/03 19:38:01 millert Exp $ */ 2122394Sharti 3122394Sharti/* 4122394Sharti * Copyright (c) 2004 Ted Unangst and Todd Miller 5122394Sharti * All rights reserved. 6122394Sharti * 7122394Sharti * Permission to use, copy, modify, and distribute this software for any 8133211Sharti * purpose with or without fee is hereby granted, provided that the above 9133211Sharti * copyright notice and this permission notice appear in all copies. 10133211Sharti * 11133211Sharti * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 12133211Sharti * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 13133211Sharti * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 14122394Sharti * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 15122394Sharti * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 16122394Sharti * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 17133211Sharti * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 18133211Sharti */ 19133211Sharti 20133211Sharti/* OPENBSD ORIGINAL: lib/libc/stdlib/strtonum.c */ 21133211Sharti 22133211Sharti#include "includes.h" 23133211Sharti 24133211Sharti#ifndef HAVE_STRTONUM 25133211Sharti#include <stdlib.h> 26133211Sharti#include <limits.h> 27133211Sharti#include <errno.h> 28133211Sharti 29122394Sharti#define INVALID 1 30133211Sharti#define TOOSMALL 2 31122394Sharti#define TOOLARGE 3 32122394Sharti 33122394Shartilong long 34122394Shartistrtonum(const char *numstr, long long minval, long long maxval, 35122394Sharti const char **errstrp) 36122394Sharti{ 37122394Sharti long long ll = 0; 38122394Sharti char *ep; 39122394Sharti int error = 0; 40122394Sharti struct errval { 41122394Sharti const char *errstr; 42122394Sharti int err; 43122394Sharti } ev[4] = { 44122394Sharti { NULL, 0 }, 45122394Sharti { "invalid", EINVAL }, 46122394Sharti { "too small", ERANGE }, 47122394Sharti { "too large", ERANGE }, 48122394Sharti }; 49122394Sharti 50122394Sharti ev[0].err = errno; 51122394Sharti errno = 0; 52122394Sharti if (minval > maxval) 53122394Sharti error = INVALID; 54122394Sharti else { 55122394Sharti ll = strtoll(numstr, &ep, 10); 56122394Sharti if (numstr == ep || *ep != '\0') 57122394Sharti error = INVALID; 58122394Sharti else if ((ll == LLONG_MIN && errno == ERANGE) || ll < minval) 59122394Sharti error = TOOSMALL; 60122394Sharti else if ((ll == LLONG_MAX && errno == ERANGE) || ll > maxval) 61122394Sharti error = TOOLARGE; 62122394Sharti } 63122394Sharti if (errstrp != NULL) 64122394Sharti *errstrp = ev[error].errstr; 65122394Sharti errno = ev[error].err; 66122394Sharti if (error) 67122394Sharti ll = 0; 68122394Sharti 69122394Sharti return (ll); 70122394Sharti} 71122394Sharti 72122394Sharti#endif /* HAVE_STRTONUM */ 73122394Sharti