summaryrefslogtreecommitdiffstats
path: root/pw
diff options
context:
space:
mode:
authorBaptiste Daroussin <bapt@FreeBSD.org>2015-07-29 06:23:06 +0000
committerBaptiste Daroussin <bapt@FreeBSD.org>2015-07-29 06:23:06 +0000
commitaeb10dd06c2ccd5644afbdc9b5ba9a065d427bd1 (patch)
tree96e18ea9372791492202177d5c35487d26bbf7f6 /pw
parent00e5987be5ae3b7c108866ac1dba4403cc4306d5 (diff)
downloadpw-darwin-aeb10dd06c2ccd5644afbdc9b5ba9a065d427bd1.tar.gz
pw-darwin-aeb10dd06c2ccd5644afbdc9b5ba9a065d427bd1.tar.zst
pw-darwin-aeb10dd06c2ccd5644afbdc9b5ba9a065d427bd1.zip
Actually add the new code
Diffstat (limited to 'pw')
-rw-r--r--pw/strtounum.c73
1 files changed, 73 insertions, 0 deletions
diff --git a/pw/strtounum.c b/pw/strtounum.c
new file mode 100644
index 0000000..9687795
--- /dev/null
+++ b/pw/strtounum.c
@@ -0,0 +1,73 @@
+/*-
+ * Copyright (C) Baptiste Daroussin <bapt@FreeBSD.org>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY DAVID L. NUGENT 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 DAVID L. NUGENT 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>
+__FBSDID("$FreeBSD$");
+
+#include <errno.h>
+#include <inttypes.h>
+#include <limits.h>
+#include <stdlib.h>
+
+#include "pw.h"
+
+#define INVALID "invalid"
+#define TOOSMALL "too small"
+#define TOOLARGE "too large"
+
+uintmax_t
+strtounum(const char *numstr, uintmax_t minval, uintmax_t maxval,
+ const char **errstrp)
+{
+ uintmax_t ret = 0;
+ char *ep;
+
+ if (minval > maxval) {
+ errno = EINVAL;
+ if (errstrp != NULL)
+ *errstrp = INVALID;
+ return (0);
+ }
+
+ ret = strtoumax(numstr, &ep, 10);
+ if (errno == EINVAL || numstr == ep || *ep != '\0') {
+ errno = EINVAL;
+ if (errstrp != NULL)
+ *errstrp = INVALID;
+ return (0);
+ } else if ((ret == 0 && errno == ERANGE) || ret < minval) {
+ errno = ERANGE;
+ if (errstrp != NULL)
+ *errstrp = TOOSMALL;
+ return (0);
+ } else if ((ret == UINTMAX_MAX && errno == ERANGE) || ret > maxval) {
+ errno = ERANGE;
+ if (errstrp != NULL)
+ *errstrp = TOOLARGE;
+ return (0);
+ }
+
+ return (ret);
+}