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
strtonum(const char * numstr,long long minval,long long maxval,const char ** errstrp)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