mirror of
https://gitlab.freedesktop.org/libbsd/libbsd.git
synced 2025-05-29 07:25:57 +02:00
Switch strtonum() implementation from strtoll() to strtoi()
Import from NetBSD.
This commit is contained in:
parent
e13b1a337a
commit
6f68c93076
5
COPYING
5
COPYING
@ -274,8 +274,10 @@ Files:
|
|||||||
src/fmtcheck.c
|
src/fmtcheck.c
|
||||||
src/humanize_number.c
|
src/humanize_number.c
|
||||||
src/stringlist.c
|
src/stringlist.c
|
||||||
|
src/strtonum.c
|
||||||
Copyright:
|
Copyright:
|
||||||
Copyright © 1994, 1997-2000, 2002, 2008, 2010 The NetBSD Foundation, Inc.
|
Copyright © 1994, 1997-2000, 2002, 2008, 2010, 2014
|
||||||
|
The NetBSD Foundation, Inc.
|
||||||
Copyright © 2013 John-Mark Gurney <jmg@FreeBSD.org>
|
Copyright © 2013 John-Mark Gurney <jmg@FreeBSD.org>
|
||||||
All rights reserved.
|
All rights reserved.
|
||||||
.
|
.
|
||||||
@ -459,7 +461,6 @@ Files:
|
|||||||
src/reallocarray.c
|
src/reallocarray.c
|
||||||
src/strlcat.c
|
src/strlcat.c
|
||||||
src/strlcpy.c
|
src/strlcpy.c
|
||||||
src/strtonum.c
|
|
||||||
Copyright:
|
Copyright:
|
||||||
Copyright © 2004 Ted Unangst and Todd Miller
|
Copyright © 2004 Ted Unangst and Todd Miller
|
||||||
All rights reserved.
|
All rights reserved.
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
.\" $NetBSD: strtonum.3,v 1.2 2015/01/19 11:47:41 wiz Exp $
|
||||||
|
.\" $OpenBSD: strtonum.3,v 1.17 2013/08/14 06:32:28 jmc Exp $
|
||||||
|
.\"
|
||||||
.\" Copyright (c) 2004 Ted Unangst
|
.\" Copyright (c) 2004 Ted Unangst
|
||||||
.\"
|
.\"
|
||||||
.\" Permission to use, copy, modify, and distribute this software for any
|
.\" Permission to use, copy, modify, and distribute this software for any
|
||||||
@ -12,10 +15,7 @@
|
|||||||
.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
.\"
|
.\"
|
||||||
.\" $OpenBSD: strtonum.3,v 1.12 2005/10/26 11:37:58 jmc Exp $
|
.Dd January 18, 2015
|
||||||
.\" $FreeBSD$
|
|
||||||
.\"
|
|
||||||
.Dd April 29, 2004
|
|
||||||
.Dt STRTONUM 3bsd
|
.Dt STRTONUM 3bsd
|
||||||
.Os
|
.Os
|
||||||
.Sh NAME
|
.Sh NAME
|
||||||
@ -45,14 +45,6 @@ function converts the string in
|
|||||||
to a
|
to a
|
||||||
.Vt "long long"
|
.Vt "long long"
|
||||||
value.
|
value.
|
||||||
The
|
|
||||||
.Fn strtonum
|
|
||||||
function was designed to facilitate safe, robust programming
|
|
||||||
and overcome the shortcomings of the
|
|
||||||
.Xr atoi 3
|
|
||||||
and
|
|
||||||
.Xr strtol 3
|
|
||||||
family of interfaces.
|
|
||||||
.Pp
|
.Pp
|
||||||
The string may begin with an arbitrary amount of whitespace
|
The string may begin with an arbitrary amount of whitespace
|
||||||
(as determined by
|
(as determined by
|
||||||
@ -112,15 +104,13 @@ The above example will guarantee that the value of iterations is between
|
|||||||
1 and 64 (inclusive).
|
1 and 64 (inclusive).
|
||||||
.Sh ERRORS
|
.Sh ERRORS
|
||||||
.Bl -tag -width Er
|
.Bl -tag -width Er
|
||||||
|
.It Bq Er EINVAL
|
||||||
|
The given string did not consist solely of digit characters; or
|
||||||
|
.Ar minval
|
||||||
|
was larger than
|
||||||
|
.Ar maxval .
|
||||||
.It Bq Er ERANGE
|
.It Bq Er ERANGE
|
||||||
The given string was out of range.
|
The given string was out of range.
|
||||||
.It Bq Er EINVAL
|
|
||||||
The given string did not consist solely of digit characters.
|
|
||||||
.It Bq Er EINVAL
|
|
||||||
The supplied
|
|
||||||
.Fa minval
|
|
||||||
was larger than
|
|
||||||
.Fa maxval .
|
|
||||||
.El
|
.El
|
||||||
.Pp
|
.Pp
|
||||||
If an error occurs,
|
If an error occurs,
|
||||||
@ -142,21 +132,58 @@ The string did not consist solely of digit characters.
|
|||||||
.Xr atoll 3 ,
|
.Xr atoll 3 ,
|
||||||
.Xr sscanf 3 ,
|
.Xr sscanf 3 ,
|
||||||
.Xr strtod 3 ,
|
.Xr strtod 3 ,
|
||||||
|
.Xr strtoi 3bsd ,
|
||||||
.Xr strtol 3 ,
|
.Xr strtol 3 ,
|
||||||
.Xr strtoul 3
|
.Xr strtoll 3 ,
|
||||||
|
.Xr strtou 3bsd ,
|
||||||
|
.Xr strtoul 3 ,
|
||||||
|
.Xr strtoull 3
|
||||||
.Sh STANDARDS
|
.Sh STANDARDS
|
||||||
The
|
|
||||||
.Fn strtonum
|
.Fn strtonum
|
||||||
function is a
|
is an
|
||||||
.Bx
|
.Ox
|
||||||
extension.
|
extension.
|
||||||
The existing alternatives, such as
|
|
||||||
.Xr atoi 3
|
|
||||||
and
|
|
||||||
.Xr strtol 3 ,
|
|
||||||
are either impossible or difficult to use safely.
|
|
||||||
.Sh HISTORY
|
.Sh HISTORY
|
||||||
The
|
The
|
||||||
.Fn strtonum
|
.Fn strtonum
|
||||||
function first appeared in
|
function first appeared in
|
||||||
.Ox 3.6 .
|
.Ox 3.6 .
|
||||||
|
.Fn strtonum
|
||||||
|
was redesigned in
|
||||||
|
.Nx 8
|
||||||
|
as
|
||||||
|
.Fn strtoi 3bsd
|
||||||
|
and
|
||||||
|
.Fn strtou 3bsd .
|
||||||
|
.Sh CAVEATS
|
||||||
|
The
|
||||||
|
.Fn strtonum
|
||||||
|
function was designed to facilitate safe,
|
||||||
|
robust programming and overcome the shortcomings of the
|
||||||
|
.Xr atoi 3
|
||||||
|
and
|
||||||
|
.Xr strtol 3
|
||||||
|
family of interfaces, however there are problems with the
|
||||||
|
.Fn strtonum
|
||||||
|
API:
|
||||||
|
.Bl -dash
|
||||||
|
.It
|
||||||
|
will return 0 on failure; 0 might not be in range, so that necessitates
|
||||||
|
an error check even if you want to avoid it
|
||||||
|
.It
|
||||||
|
does not differentiate 'illegal' returns, so we can't tell the
|
||||||
|
difference between partial and no conversions
|
||||||
|
.It
|
||||||
|
returns english strings
|
||||||
|
.It
|
||||||
|
can't set the base, or find where the conversion ended
|
||||||
|
.It
|
||||||
|
hardcodes long long integer type
|
||||||
|
.El
|
||||||
|
To overcome the shortcomings of
|
||||||
|
.Fn strtonum
|
||||||
|
.Nx
|
||||||
|
provides
|
||||||
|
.Fn strtou 3bsd
|
||||||
|
and
|
||||||
|
.Fn strtoi 3bsd .
|
||||||
|
@ -1,67 +1,62 @@
|
|||||||
|
/* $NetBSD: strtonum.c,v 1.5 2018/01/04 20:57:29 kamil Exp $ */
|
||||||
/*-
|
/*-
|
||||||
* Copyright (c) 2004 Ted Unangst and Todd Miller
|
* Copyright (c) 2014 The NetBSD Foundation, Inc.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Permission to use, copy, modify, and distribute this software for any
|
* This code is derived from software contributed to The NetBSD Foundation
|
||||||
* purpose with or without fee is hereby granted, provided that the above
|
* by Christos Zoulas.
|
||||||
* copyright notice and this permission notice appear in all copies.
|
|
||||||
*
|
*
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
* modification, are permitted provided that the following conditions
|
||||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
* are met:
|
||||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
* notice, this list of conditions and the following disclaimer.
|
||||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
*
|
*
|
||||||
* $OpenBSD: strtonum.c,v 1.6 2004/08/03 19:38:01 millert Exp $
|
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
|
||||||
|
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||||
|
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||||
|
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
|
||||||
|
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
|
|
||||||
#include <errno.h>
|
#include <stdio.h>
|
||||||
#include <limits.h>
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <errno.h>
|
||||||
#define INVALID 1
|
#include <inttypes.h>
|
||||||
#define TOOSMALL 2
|
|
||||||
#define TOOLARGE 3
|
|
||||||
|
|
||||||
long long
|
long long
|
||||||
strtonum(const char *numstr, long long minval, long long maxval,
|
strtonum(const char *nptr, long long minval, long long maxval,
|
||||||
const char **errstrp)
|
const char **errstr)
|
||||||
{
|
{
|
||||||
long long ll = 0;
|
int e;
|
||||||
char *ep;
|
long long rv;
|
||||||
int error = 0;
|
const char *resp;
|
||||||
struct errval {
|
|
||||||
const char *errstr;
|
|
||||||
int err;
|
|
||||||
} ev[4] = {
|
|
||||||
{ NULL, 0 },
|
|
||||||
{ "invalid", EINVAL },
|
|
||||||
{ "too small", ERANGE },
|
|
||||||
{ "too large", ERANGE },
|
|
||||||
};
|
|
||||||
|
|
||||||
ev[0].err = errno;
|
if (errstr == NULL)
|
||||||
errno = 0;
|
errstr = &resp;
|
||||||
if (minval > maxval)
|
|
||||||
error = INVALID;
|
rv = (long long)strtoi(nptr, NULL, 10, minval, maxval, &e);
|
||||||
else {
|
|
||||||
ll = strtoll(numstr, &ep, 10);
|
if (e == 0) {
|
||||||
if (errno == EINVAL || numstr == ep || *ep != '\0')
|
*errstr = NULL;
|
||||||
error = INVALID;
|
return rv;
|
||||||
else if ((ll == LLONG_MIN && errno == ERANGE) || ll < minval)
|
|
||||||
error = TOOSMALL;
|
|
||||||
else if ((ll == LLONG_MAX && errno == ERANGE) || ll > maxval)
|
|
||||||
error = TOOLARGE;
|
|
||||||
}
|
}
|
||||||
if (errstrp != NULL)
|
|
||||||
*errstrp = ev[error].errstr;
|
|
||||||
errno = ev[error].err;
|
|
||||||
if (error)
|
|
||||||
ll = 0;
|
|
||||||
|
|
||||||
return (ll);
|
if (e == ERANGE)
|
||||||
|
*errstr = (rv == maxval ? "too large" : "too small");
|
||||||
|
else
|
||||||
|
*errstr = "invalid";
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user