summaryrefslogtreecommitdiff
path: root/lib/libc
diff options
context:
space:
mode:
authorTodd C. Miller <millert@cvs.openbsd.org>2004-08-03 19:38:02 +0000
committerTodd C. Miller <millert@cvs.openbsd.org>2004-08-03 19:38:02 +0000
commit4a4fb3686e6b4f0b805466fae33ed185cda2d8c5 (patch)
tree9a9a9411a0755bce70ae735cbf7fa0c159c20e29 /lib/libc
parent6acc9eba8f8c94223248a2c56d2042a7f62c9777 (diff)
It's not really possible to make strtonum() deal with unsigned long
long values properly so don't bother trying. This greatly simplifies the code. tedu@ OK with input from otto@ and others.
Diffstat (limited to 'lib/libc')
-rw-r--r--lib/libc/stdlib/strtonum.319
-rw-r--r--lib/libc/stdlib/strtonum.c37
2 files changed, 21 insertions, 35 deletions
diff --git a/lib/libc/stdlib/strtonum.3 b/lib/libc/stdlib/strtonum.3
index 7a8d7faf6d7..3e3e255e556 100644
--- a/lib/libc/stdlib/strtonum.3
+++ b/lib/libc/stdlib/strtonum.3
@@ -1,4 +1,4 @@
-.\" $OpenBSD: strtonum.3,v 1.5 2004/05/06 06:19:01 tedu Exp $
+.\" $OpenBSD: strtonum.3,v 1.6 2004/08/03 19:38:01 millert Exp $
.\"
.\" Copyright (c) 2004 Ted Unangst
.\"
@@ -23,11 +23,11 @@
.Sh SYNOPSIS
.Fd #include <stdlib.h>
.Fd #include <limits.h>
-.Ft unsigned long long
+.Ft long long
.Fo strtonum
.Fa "const char *nptr"
.Fa "long long minval"
-.Fa "unsigned long long maxval"
+.Fa "long long maxval"
.Fa "const char **errstr"
.Fc
.Sh DESCRIPTION
@@ -35,10 +35,9 @@ The
.Fn strtonum
function converts the string in
.Fa nptr
-to an
-.Li unsigned long long
+to a
+.Li long long
value.
-Negative values may be obtained by casting the result.
The
.Fn strtonum
function was designed to facilitate safe, robust programming
@@ -57,8 +56,8 @@ or
.Ql -
sign.
.Pp
-The remainder of the string is converted to an
-.Li unsigned long long
+The remainder of the string is converted to a
+.Li long long
value according to base 10.
.Pp
The value obtained is then checked against the provided
@@ -102,6 +101,10 @@ The above example will guarantee that the value of iterations is between
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
+.Ar minval
+was larger than
+.Ar maxval .
.El
.Pp
If an error occurs, errstr will be set to one of the following strings.
diff --git a/lib/libc/stdlib/strtonum.c b/lib/libc/stdlib/strtonum.c
index a2dfed25caf..e426388ed0f 100644
--- a/lib/libc/stdlib/strtonum.c
+++ b/lib/libc/stdlib/strtonum.c
@@ -1,4 +1,5 @@
-/* $OpenBSD: strtonum.c,v 1.5 2004/07/16 18:36:05 otto Exp $ */
+/* $OpenBSD: strtonum.c,v 1.6 2004/08/03 19:38:01 millert Exp $ */
+
/*
* Copyright (c) 2004 Ted Unangst and Todd Miller
* All rights reserved.
@@ -24,12 +25,11 @@
#define TOOSMALL 2
#define TOOLARGE 3
-unsigned long long
-strtonum(const char *numstr, long long minval, unsigned long long umaxval,
+long long
+strtonum(const char *numstr, long long minval, long long maxval,
const char **errstrp)
{
- long long ll, maxval = (long long)umaxval;
- unsigned long long ull = 0;
+ long long ll = 0;
char *ep;
int error = 0;
struct errval {
@@ -44,24 +44,9 @@ strtonum(const char *numstr, long long minval, unsigned long long umaxval,
ev[0].err = errno;
errno = 0;
- if (umaxval > LLONG_MAX ) {
- if (minval < 0) {
- error = INVALID;
- goto done;
- }
- ull = strtoull(numstr, &ep, 10);
- if (numstr == ep || *ep != '\0')
- error = INVALID;
- else if ((ull == ULLONG_MAX && errno == ERANGE) ||
- ull > umaxval)
- error = TOOLARGE;
- else if (ull < minval)
- error = TOOSMALL;
- } else {
- if (minval > maxval || maxval < minval) {
- error = INVALID;
- goto done;
- }
+ if (minval > maxval)
+ error = INVALID;
+ else {
ll = strtoll(numstr, &ep, 10);
if (numstr == ep || *ep != '\0')
error = INVALID;
@@ -69,14 +54,12 @@ strtonum(const char *numstr, long long minval, unsigned long long umaxval,
error = TOOSMALL;
else if ((ll == LLONG_MAX && errno == ERANGE) || ll > maxval)
error = TOOLARGE;
- ull = (unsigned long long)ll;
}
-done:
if (errstrp != NULL)
*errstrp = ev[error].errstr;
errno = ev[error].err;
if (error)
- ull = 0;
+ ll = 0;
- return (ull);
+ return (ll);
}