Recently Written · git

sad

sad (2f30.org simple audio daemon) with a Cygwin/OSS port on branch cygwin

git clone https://github.com/equwal/sad

Log | Files | Refs


commit b88068c456dc46c0c5503d84630cabb28e0771fa
sin <sin@2f30.org>
2014-12-27 18:26:10 +0000

Add strtonum()

 Makefile          |  1 +
 compat.h          |  3 +++
 compat/strtonum.c | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 71 insertions(+)
diff --git a/Makefile b/Makefile
index 1300d23..c989f97 100644
--- a/Makefile
+++ b/Makefile
@@ -25,6 +25,7 @@ BIN = sad
 OBJ += compat/reallocarray.o
 OBJ += compat/strlcat.o
 OBJ += compat/strlcpy.o
+OBJ += compat/strtonum.o
 CFLAGS += -DCOMPAT
 
 all: $(BIN)
diff --git a/compat.h b/compat.h
index e7fec25..9919ccd 100644
--- a/compat.h
+++ b/compat.h
@@ -1,6 +1,9 @@
 #undef reallocarray
 void *reallocarray(void *, size_t, size_t);
+
 #undef strlcat
 size_t strlcat(char *, const char *, size_t);
 #undef strlcpy
 size_t strlcpy(char *, const char *, size_t);
+
+long long strtonum(const char *, long long, long long, const char **);
diff --git a/compat/strtonum.c b/compat/strtonum.c
new file mode 100644
index 0000000..bc8d11f
--- /dev/null
+++ b/compat/strtonum.c
@@ -0,0 +1,67 @@
+/*-
+ * Copyright (c) 2004 Ted Unangst and Todd Miller
+ * All rights reserved.
+ *
+ * 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.
+ *
+ *	$OpenBSD: strtonum.c,v 1.6 2004/08/03 19:38:01 millert Exp $
+ */
+
+#include <errno.h>
+#include <limits.h>
+#include <stdlib.h>
+
+#include "../compat.h"
+
+#define INVALID 	1
+#define TOOSMALL 	2
+#define TOOLARGE 	3
+
+long long
+strtonum(const char *numstr, long long minval, long long maxval,
+    const char **errstrp)
+{
+	long long ll = 0;
+	char *ep;
+	int error = 0;
+	struct errval {
+		const char *errstr;
+		int err;
+	} ev[4] = {
+		{ NULL,		0 },
+		{ "invalid",	EINVAL },
+		{ "too small",	ERANGE },
+		{ "too large",	ERANGE },
+	};
+
+	ev[0].err = errno;
+	errno = 0;
+	if (minval > maxval)
+		error = INVALID;
+	else {
+		ll = strtoll(numstr, &ep, 10);
+		if (errno == EINVAL || numstr == ep || *ep != '\0')
+			error = INVALID;
+		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);
+}