xref: /titanic_50/usr/src/cmd/mandoc/compat_strtonum.c (revision 260e9a87725c090ba5835b1f9f0b62fa2f96036f)
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