summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@cvs.openbsd.org>2014-09-14 14:32:45 +0000
committerIngo Schwarze <schwarze@cvs.openbsd.org>2014-09-14 14:32:45 +0000
commit130b7d19f4f146f0da64ed6a9949b53ab796cc2d (patch)
treee5b6be97c224896fc292854d6fd2f5d0e4c5a840 /lib
parentf86fd20f7920e0ce9eed94dbfa81ade1020f9bd4 (diff)
Do not claim that empty numbers set EINVAL, our implementation doesn't.
Mention that invalid bases do set EINVAL (as required by POSIX); this part of the change uses part of an earlier patch by millert@. Minor mdoc(7) cleanup and sync between the two pages while here. Feedback and ok jmc@ and millert@.
Diffstat (limited to 'lib')
-rw-r--r--lib/libc/stdlib/strtol.351
-rw-r--r--lib/libc/stdlib/strtoul.347
2 files changed, 61 insertions, 37 deletions
diff --git a/lib/libc/stdlib/strtol.3 b/lib/libc/stdlib/strtol.3
index c0a60979d9b..742be4cbb73 100644
--- a/lib/libc/stdlib/strtol.3
+++ b/lib/libc/stdlib/strtol.3
@@ -29,9 +29,9 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.\" $OpenBSD: strtol.3,v 1.24 2013/08/14 06:32:28 jmc Exp $
+.\" $OpenBSD: strtol.3,v 1.25 2014/09/14 14:32:44 schwarze Exp $
.\"
-.Dd $Mdocdate: August 14 2013 $
+.Dd $Mdocdate: September 14 2014 $
.Dt STRTOL 3
.Os
.Sh NAME
@@ -45,14 +45,11 @@
.In stdlib.h
.Ft long
.Fn strtol "const char *nptr" "char **endptr" "int base"
-.Pp
.Ft long long
.Fn strtoll "const char *nptr" "char **endptr" "int base"
-.Pp
.In inttypes.h
.Ft intmax_t
.Fn strtoimax "const char *nptr" "char **endptr" "int base"
-.Pp
.In sys/types.h
.In limits.h
.In stdlib.h
@@ -64,21 +61,21 @@ The
function converts the string in
.Fa nptr
to a
-.Li long
+.Vt long
value.
The
.Fn strtoll
function converts the string in
.Fa nptr
to a
-.Li long long
+.Vt long long
value.
The
.Fn strtoimax
function converts the string in
.Fa nptr
to an
-.Li intmax_t
+.Vt intmax_t
value.
The
.Fn strtoq
@@ -108,10 +105,10 @@ is taken as 10 (decimal) unless the next character is
in which case it is taken as 8 (octal).
.Pp
The remainder of the string is converted to a
-.Li long ,
-.Li long long ,
+.Vt long ,
+.Vt long long ,
or
-.Li intmax_t ,
+.Vt intmax_t
value in the obvious manner,
stopping at the first character which is not a valid digit
in the given base.
@@ -151,14 +148,7 @@ The
.Fn strtoimax ,
and
.Fn strtoq
-functions return the result of the conversion,
-unless the value would underflow or overflow.
-If no conversion could be performed, 0 is returned;
-the global variable
-.Va errno
-is also set to
-.Er EINVAL ,
-though this is not portable across all platforms.
+functions return the result of the conversion.
If overflow or underflow occurs,
.Va errno
is set to
@@ -171,6 +161,14 @@ and the function return value is as follows:
.It Fn strtoimax Ta Dv INTMAX_MIN Ta Dv INTMAX_MAX
.It Fn strtoq Ta Dv LLONG_MIN Ta Dv LLONG_MAX
.El
+.Pp
+If there is no valid digit, 0 is returned.
+If
+.Ar base
+is invalid, 0 is returned and the global variable
+.Va errno
+is set to
+.Er EINVAL .
.Sh EXAMPLES
Ensuring that a string is a valid number (i.e., in range and containing no
trailing characters) requires clearing
@@ -212,9 +210,9 @@ If
is being used instead of
.Xr atoi 3 ,
error checking is further complicated because the desired return value is an
-.Li int
+.Vt int
rather than a
-.Li long ;
+.Vt long ;
however, on some architectures integers and long integers are the same size.
Thus the following is necessary:
.Bd -literal -offset indent
@@ -235,6 +233,10 @@ ival = lval;
.Ed
.Sh ERRORS
.Bl -tag -width Er
+.It Bq Er EINVAL
+The value of
+.Ar base
+was neither between 2 and 36 inclusive nor the special value 0.
.It Bq Er ERANGE
The given string was out of range; the value converted has been clamped.
.El
@@ -255,6 +257,13 @@ and
.Fn strtoimax
functions conform to
.St -ansiC-99 .
+Setting
+.Va errno
+to
+.Dv EINVAL
+is an extension to that standard required by
+.St -p1003.1-2008 .
+.Pp
The
.Fn strtoq
function is a
diff --git a/lib/libc/stdlib/strtoul.3 b/lib/libc/stdlib/strtoul.3
index 1353637d68c..122ad7bb264 100644
--- a/lib/libc/stdlib/strtoul.3
+++ b/lib/libc/stdlib/strtoul.3
@@ -29,9 +29,9 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.\" $OpenBSD: strtoul.3,v 1.22 2013/08/14 06:32:28 jmc Exp $
+.\" $OpenBSD: strtoul.3,v 1.23 2014/09/14 14:32:44 schwarze Exp $
.\"
-.Dd $Mdocdate: August 14 2013 $
+.Dd $Mdocdate: September 14 2014 $
.Dt STRTOUL 3
.Os
.Sh NAME
@@ -61,21 +61,21 @@ The
function converts the string in
.Fa nptr
to an
-.Li unsigned long
+.Vt unsigned long
value.
The
.Fn strtoull
function converts the string in
.Fa nptr
to an
-.Li unsigned long long
+.Vt unsigned long long
value.
The
.Fn strtoumax
function converts the string in
.Fa nptr
to a
-.Li umaxint_t
+.Vt umaxint_t
value.
The
.Fn strtouq
@@ -84,8 +84,7 @@ function is a deprecated equivalent of
and is provided for backwards compatibility with legacy programs.
The conversion is done according to the given
.Fa base ,
-which must be a number between 2 and 36 inclusive
-or the special value 0.
+which must be a number between 2 and 36 inclusive or the special value 0.
If the string in
.Fa nptr
represents a negative number, it will be converted to its unsigned equivalent.
@@ -111,9 +110,12 @@ is taken as 10 (decimal) unless the next character is
in which case it is taken as 8 (octal).
.Pp
The remainder of the string is converted to an
-.Li unsigned long
-value in the obvious manner, stopping at the end of the string
-or at the first character that does not produce a valid digit
+.Vt unsigned long ,
+.Vt unsigned long long ,
+or
+.Vt uintmax_t
+value in the obvious manner,
+stopping at the first character which is not a valid digit
in the given base.
(In bases above 10, the letter
.Ql A
@@ -172,12 +174,6 @@ and the global variable
.Va errno
is set to
.Er ERANGE .
-If no conversion could be performed, 0 is returned;
-the global variable
-.Va errno
-is also set to
-.Er EINVAL ,
-though this is not portable across all platforms.
.Pp
There is no way to determine if
.Fn strtoul
@@ -185,6 +181,14 @@ has processed a negative number (and returned an unsigned value) short of
examining the string in
.Fa nptr
directly.
+.Pp
+If there is no valid digit, 0 is returned.
+If
+.Ar base
+is invalid, 0 is returned and the global variable
+.Va errno
+is set to
+.Er EINVAL .
.Sh EXAMPLES
Ensuring that a string is a valid number (i.e., in range and containing no
trailing characters) requires clearing
@@ -222,6 +226,10 @@ alternately, use
.Xr sscanf 3 .
.Sh ERRORS
.Bl -tag -width Er
+.It Bq Er EINVAL
+The value of
+.Ar base
+was neither between 2 and 36 inclusive nor the special value 0.
.It Bq Er ERANGE
The given string was out of range; the value converted has been clamped.
.El
@@ -236,6 +244,13 @@ and
.Fn strtoumax
functions conform to
.St -ansiC-99 .
+Setting
+.Va errno
+to
+.Dv EINVAL
+is an extension to that standard required by
+.St -p1003.1-2008 .
+.Pp
The
.Fn strtouq
function is a