2006-03-14 16:57:30 +00:00
|
|
|
.\" Copyright (c) 2004 Ted Unangst
|
|
|
|
.\"
|
|
|
|
.\" Permission to use, copy, modify, and distribute this software for any
|
|
|
|
.\" purpose with or without fee is hereby granted, provided that the above
|
|
|
|
.\" copyright notice and this permission notice appear in all copies.
|
|
|
|
.\"
|
|
|
|
.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
|
|
.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
|
|
.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
|
|
.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
|
|
.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
|
|
.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
|
|
.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
|
|
.\"
|
2010-10-21 18:21:19 +00:00
|
|
|
.\" $OpenBSD: strtonum.3,v 1.13 2006/04/25 05:15:42 tedu Exp $
|
2006-03-14 16:57:30 +00:00
|
|
|
.\" $FreeBSD$
|
|
|
|
.\"
|
|
|
|
.Dd April 29, 2004
|
|
|
|
.Dt STRTONUM 3
|
|
|
|
.Os
|
|
|
|
.Sh NAME
|
|
|
|
.Nm strtonum
|
|
|
|
.Nd "reliably convert string value to an integer"
|
|
|
|
.Sh SYNOPSIS
|
2006-09-30 10:34:13 +00:00
|
|
|
.In stdlib.h
|
2006-03-14 16:57:30 +00:00
|
|
|
.Ft long long
|
|
|
|
.Fo strtonum
|
|
|
|
.Fa "const char *nptr"
|
|
|
|
.Fa "long long minval"
|
|
|
|
.Fa "long long maxval"
|
|
|
|
.Fa "const char **errstr"
|
|
|
|
.Fc
|
|
|
|
.Sh DESCRIPTION
|
|
|
|
The
|
|
|
|
.Fn strtonum
|
|
|
|
function converts the string in
|
|
|
|
.Fa nptr
|
|
|
|
to a
|
2006-09-30 10:34:13 +00:00
|
|
|
.Vt "long long"
|
2006-03-14 16:57:30 +00:00
|
|
|
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
|
|
|
|
The string may begin with an arbitrary amount of whitespace
|
|
|
|
(as determined by
|
|
|
|
.Xr isspace 3 )
|
|
|
|
followed by a single optional
|
|
|
|
.Ql +
|
|
|
|
or
|
|
|
|
.Ql -
|
|
|
|
sign.
|
|
|
|
.Pp
|
|
|
|
The remainder of the string is converted to a
|
2006-09-30 10:34:13 +00:00
|
|
|
.Vt "long long"
|
2006-03-14 16:57:30 +00:00
|
|
|
value according to base 10.
|
|
|
|
.Pp
|
|
|
|
The value obtained is then checked against the provided
|
|
|
|
.Fa minval
|
|
|
|
and
|
|
|
|
.Fa maxval
|
|
|
|
bounds.
|
|
|
|
If
|
|
|
|
.Fa errstr
|
|
|
|
is non-null,
|
|
|
|
.Fn strtonum
|
|
|
|
stores an error string in
|
|
|
|
.Fa *errstr
|
|
|
|
indicating the failure.
|
|
|
|
.Sh RETURN VALUES
|
|
|
|
The
|
|
|
|
.Fn strtonum
|
|
|
|
function returns the result of the conversion,
|
|
|
|
unless the value would exceed the provided bounds or is invalid.
|
|
|
|
On error, 0 is returned,
|
|
|
|
.Va errno
|
|
|
|
is set, and
|
|
|
|
.Fa errstr
|
|
|
|
will point to an error message.
|
2006-09-30 10:34:13 +00:00
|
|
|
On success,
|
2006-03-14 16:57:30 +00:00
|
|
|
.Fa *errstr
|
|
|
|
will be set to
|
2006-09-30 10:34:13 +00:00
|
|
|
.Dv NULL ;
|
2006-03-14 16:57:30 +00:00
|
|
|
this fact can be used to differentiate
|
|
|
|
a successful return of 0 from an error.
|
|
|
|
.Sh EXAMPLES
|
|
|
|
Using
|
|
|
|
.Fn strtonum
|
|
|
|
correctly is meant to be simpler than the alternative functions.
|
|
|
|
.Bd -literal -offset indent
|
|
|
|
int iterations;
|
|
|
|
const char *errstr;
|
|
|
|
|
|
|
|
iterations = strtonum(optarg, 1, 64, &errstr);
|
2013-08-18 10:33:46 +00:00
|
|
|
if (errstr != NULL)
|
2006-03-14 16:57:30 +00:00
|
|
|
errx(1, "number of iterations is %s: %s", errstr, optarg);
|
|
|
|
.Ed
|
|
|
|
.Pp
|
|
|
|
The above example will guarantee that the value of iterations is between
|
|
|
|
1 and 64 (inclusive).
|
|
|
|
.Sh ERRORS
|
|
|
|
.Bl -tag -width Er
|
|
|
|
.It Bq Er ERANGE
|
|
|
|
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
|
2006-09-30 10:34:13 +00:00
|
|
|
The supplied
|
|
|
|
.Fa minval
|
2006-03-14 16:57:30 +00:00
|
|
|
was larger than
|
2006-09-30 10:34:13 +00:00
|
|
|
.Fa maxval .
|
2006-03-14 16:57:30 +00:00
|
|
|
.El
|
|
|
|
.Pp
|
|
|
|
If an error occurs,
|
|
|
|
.Fa errstr
|
|
|
|
will be set to one of the following strings:
|
|
|
|
.Pp
|
2006-09-30 10:34:13 +00:00
|
|
|
.Bl -tag -width ".Li too large" -compact
|
|
|
|
.It Li "too large"
|
2006-03-14 16:57:30 +00:00
|
|
|
The result was larger than the provided maximum value.
|
2006-09-30 10:34:13 +00:00
|
|
|
.It Li "too small"
|
2006-03-14 16:57:30 +00:00
|
|
|
The result was smaller than the provided minimum value.
|
2006-09-30 10:34:13 +00:00
|
|
|
.It Li invalid
|
2006-03-14 16:57:30 +00:00
|
|
|
The string did not consist solely of digit characters.
|
|
|
|
.El
|
|
|
|
.Sh SEE ALSO
|
|
|
|
.Xr atof 3 ,
|
|
|
|
.Xr atoi 3 ,
|
|
|
|
.Xr atol 3 ,
|
|
|
|
.Xr atoll 3 ,
|
|
|
|
.Xr sscanf 3 ,
|
|
|
|
.Xr strtod 3 ,
|
|
|
|
.Xr strtol 3 ,
|
|
|
|
.Xr strtoul 3
|
|
|
|
.Sh STANDARDS
|
2006-09-30 10:34:13 +00:00
|
|
|
The
|
2006-03-14 16:57:30 +00:00
|
|
|
.Fn strtonum
|
2006-09-30 10:34:13 +00:00
|
|
|
function is a
|
2006-03-15 14:45:45 +00:00
|
|
|
.Bx
|
|
|
|
extension.
|
2006-03-14 16:57:30 +00:00
|
|
|
The existing alternatives, such as
|
|
|
|
.Xr atoi 3
|
|
|
|
and
|
|
|
|
.Xr strtol 3 ,
|
|
|
|
are either impossible or difficult to use safely.
|
|
|
|
.Sh HISTORY
|
|
|
|
The
|
|
|
|
.Fn strtonum
|
2006-03-15 14:05:41 +00:00
|
|
|
function first appeared in
|
|
|
|
.Ox 3.6 .
|