[experimental-ims] 368197a And now it is VNUM's turn...

Geoff Simmons geoff at varnish-cache.org
Mon Jan 9 21:52:16 CET 2012


commit 368197ad6241b398fd6a50d25385d4bf9ba2cc81
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Sun Oct 9 19:06:34 2011 +0000

    And now it is VNUM's turn...

diff --git a/bin/varnishd/mgt_shmem.c b/bin/varnishd/mgt_shmem.c
index 38dc59a..e42487a 100644
--- a/bin/varnishd/mgt_shmem.c
+++ b/bin/varnishd/mgt_shmem.c
@@ -103,6 +103,7 @@
 #include "vmb.h"
 #include "vsm.h"
 #include "vav.h"
+#include "vnum.h"
 #include "flopen.h"
 
 #ifndef MAP_HASSEMAPHORE
@@ -244,7 +245,7 @@ mgt_SHM_Init(const char *l_arg)
 
 	/* Size of SHMLOG */
 	if (*ap != NULL && **ap != '\0') {
-		q = str2bytes(*ap, &s1, 0);
+		q = VNUM_2bytes(*ap, &s1, 0);
 		if (q != NULL)
 			ARGV_ERR("\t-l[1] ...:  %s\n", q);
 	} else {
@@ -255,7 +256,7 @@ mgt_SHM_Init(const char *l_arg)
 
 	/* Size of space for other stuff */
 	if (*ap != NULL && **ap != '\0') {
-		q = str2bytes(*ap, &s2, 0);
+		q = VNUM_2bytes(*ap, &s2, 0);
 		if (q != NULL)
 			ARGV_ERR("\t-l[2] ...:  %s\n", q);
 	} else {
diff --git a/bin/varnishd/stevedore_utils.c b/bin/varnishd/stevedore_utils.c
index af7fc7f..725a086 100644
--- a/bin/varnishd/stevedore_utils.c
+++ b/bin/varnishd/stevedore_utils.c
@@ -53,6 +53,7 @@
 
 #include "mgt.h"
 #include "stevedore.h"
+#include "vnum.h"
 
 #ifndef O_LARGEFILE
 #define O_LARGEFILE	0
@@ -197,7 +198,7 @@ STV_FileSize(int fd, const char *size, unsigned *granularity, const char *ctx)
 		l = st.st_size;
 	} else {
 		AN(size);
-		q = str2bytes(size, &l, fssize);
+		q = VNUM_2bytes(size, &l, fssize);
 
 		if (q != NULL)
 			ARGV_ERR("(%s) size \"%s\": %s\n", size, ctx, q);
diff --git a/bin/varnishd/storage_file.c b/bin/varnishd/storage_file.c
index c363f4e..25c9947 100644
--- a/bin/varnishd/storage_file.c
+++ b/bin/varnishd/storage_file.c
@@ -38,6 +38,7 @@
 #include "cache.h"
 
 #include "stevedore.h"
+#include "vnum.h"
 
 #ifndef MAP_NOCORE
 #define MAP_NOCORE 0 /* XXX Linux */
@@ -131,7 +132,7 @@ smf_init(struct stevedore *parent, int ac, char * const *av)
 		size = av[1];
 	if (ac > 2 && *av[2] != '\0') {
 
-		r = str2bytes(av[2], &page_size, 0);
+		r = VNUM_2bytes(av[2], &page_size, 0);
 		if (r != NULL)
 			ARGV_ERR("(-sfile) granularity \"%s\": %s\n", av[2], r);
 	}
diff --git a/bin/varnishd/storage_malloc.c b/bin/varnishd/storage_malloc.c
index 500e74c..bc5a565 100644
--- a/bin/varnishd/storage_malloc.c
+++ b/bin/varnishd/storage_malloc.c
@@ -37,6 +37,7 @@
 #include "cache.h"
 
 #include "stevedore.h"
+#include "vnum.h"
 
 struct sma_sc {
 	unsigned		magic;
@@ -216,7 +217,7 @@ sma_init(struct stevedore *parent, int ac, char * const *av)
 	if (ac == 0 || *av[0] == '\0')
 		 return;
 
-	e = str2bytes(av[0], &u, 0);
+	e = VNUM_2bytes(av[0], &u, 0);
 	if (e != NULL)
 		ARGV_ERR("(-smalloc) size \"%s\": %s\n", av[0], e);
 	if ((u != (uintmax_t)(size_t)u))
diff --git a/bin/varnishd/storage_umem.c b/bin/varnishd/storage_umem.c
index 6e28a94..197d0ac 100644
--- a/bin/varnishd/storage_umem.c
+++ b/bin/varnishd/storage_umem.c
@@ -140,7 +140,7 @@ smu_init(struct stevedore *parent, int ac, char * const *av)
 	if (ac == 0 || *av[0] == '\0')
 		 return;
 
-	e = str2bytes(av[0], &u, 0);
+	e = VNUM_2bytes(av[0], &u, 0);
 	if (e != NULL)
 		ARGV_ERR("(-sumem) size \"%s\": %s\n", av[0], e);
 	if ((u != (uintmax_t)(size_t)u))
diff --git a/include/Makefile.am b/include/Makefile.am
index d62cab3..e852c58 100644
--- a/include/Makefile.am
+++ b/include/Makefile.am
@@ -48,6 +48,7 @@ nobase_noinst_HEADERS = \
 	vlu.h \
 	vmb.h \
 	vmod_abi.h \
+	vnum.h \
 	vpf.h \
 	vqueue.h \
 	vre.h \
diff --git a/include/libvarnish.h b/include/libvarnish.h
index c0851c8..1450578 100644
--- a/include/libvarnish.h
+++ b/include/libvarnish.h
@@ -38,9 +38,6 @@
 
 struct vsb;
 
-/* from libvarnish/num.c */
-const char *str2bytes(const char *p, uintmax_t *r, uintmax_t rel);
-
 /* from libvarnish/version.c */
 void VCS_Message(const char *);
 
diff --git a/lib/libvarnish/Makefile.am b/lib/libvarnish/Makefile.am
index 3c045e6..e890904 100644
--- a/lib/libvarnish/Makefile.am
+++ b/lib/libvarnish/Makefile.am
@@ -13,7 +13,7 @@ libvarnish_la_SOURCES = \
 	cli_common.c \
 	cli_serve.c \
 	flopen.c \
-	num.c \
+	vnum.c \
 	vtim.c \
 	vtcp.c \
 	vct.c \
@@ -33,13 +33,13 @@ libvarnish_la_CFLAGS = -DVARNISH_STATE_DIR='"${VARNISH_STATE_DIR}"'
 libvarnish_la_LIBADD = ${RT_LIBS} ${NET_LIBS} ${LIBM} @PCRE_LIBS@
 
 if ENABLE_TESTS
-TESTS = num_c_test
+TESTS = vnum_c_test
 
 noinst_PROGRAMS = ${TESTS}
 
-num_c_test_SOURCES = num.c
-num_c_test_CFLAGS = -DNUM_C_TEST -include config.h
-num_c_test_LDADD = ${LIBM}
+vnum_c_test_SOURCES = vnum.c
+vnum_c_test_CFLAGS = -DNUM_C_TEST -include config.h
+vnum_c_test_LDADD = ${LIBM}
 
 test: ${TESTS}
 	@for test in ${TESTS} ; do ./$${test} ; done
diff --git a/lib/libvarnish/num.c b/lib/libvarnish/num.c
deleted file mode 100644
index 70255db..0000000
--- a/lib/libvarnish/num.c
+++ /dev/null
@@ -1,197 +0,0 @@
-/*-
- * Copyright (c) 2008-2009 Varnish Software AS
- * All rights reserved.
- *
- * Author: Poul-Henning Kamp <phk at phk.freebsd.dk>
- *
- * 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 THE AUTHOR 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 AUTHOR 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.
- *
- * Deal with numbers with data storage suffix scaling
- */
-
-#include "config.h"
-
-#include <math.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdint.h>
-
-#include "libvarnish.h"
-
-static const char err_miss_num[] = "Missing number";
-static const char err_invalid_num[] = "Invalid number";
-static const char err_abs_req[] = "Absolute number required";
-static const char err_invalid_suff[] = "Invalid suffix";
-
-const char *
-str2bytes(const char *p, uintmax_t *r, uintmax_t rel)
-{
-	double fval;
-	char *end;
-
-	if (p == NULL || *p == '\0')
-		return (err_miss_num);
-
-	fval = strtod(p, &end);
-	if (end == p || !isfinite(fval))
-		return (err_invalid_num);
-
-	if (*end == '\0') {
-		*r = (uintmax_t)fval;
-		return (NULL);
-	}
-
-	if (end[0] == '%' && end[1] == '\0') {
-		if (rel == 0)
-			return (err_abs_req);
-		fval *= rel / 100.0;
-	} else {
-		/* accept a space before the multiplier */
-		if (end[0] == ' ' && end[1] != '\0')
-			++end;
-
-		switch (end[0]) {
-		case 'k': case 'K':
-			fval *= (uintmax_t)1 << 10;
-			++end;
-			break;
-		case 'm': case 'M':
-			fval *= (uintmax_t)1 << 20;
-			++end;
-			break;
-		case 'g': case 'G':
-			fval *= (uintmax_t)1 << 30;
-			++end;
-			break;
-		case 't': case 'T':
-			fval *= (uintmax_t)1 << 40;
-			++end;
-			break;
-		case 'p': case 'P':
-			fval *= (uintmax_t)1 << 50;
-			++end;
-			break;
-		case 'e': case 'E':
-			fval *= (uintmax_t)1 << 60;
-			++end;
-			break;
-		default:
-			break;
-		}
-
-		/* [bB] is a generic suffix of no effect */
-		if (end[0] == 'b' || end[0] == 'B')
-			end++;
-
-		if (end[0] != '\0')
-			return (err_invalid_suff);
-	}
-
-	*r = (uintmax_t)round(fval);
-	return (NULL);
-}
-
-#ifdef NUM_C_TEST
-/* Compile with: "cc -o foo -DNUM_C_TEST -I../.. -I../../include num.c -lm" */
-#include "vas.h"
-#include <math.h>
-#include <stdio.h>
-#include <string.h>
-
-struct test_case {
-	const char *str;
-	uintmax_t rel;
-	uintmax_t val;
-	const char *err;
-} test_cases[] = {
-	{ "1",			(uintmax_t)0,	(uintmax_t)1 },
-	{ "1B",			(uintmax_t)0,	(uintmax_t)1<<0 },
-	{ "1 B",		(uintmax_t)0,	(uintmax_t)1<<0 },
-	{ "1.3B",		(uintmax_t)0,	(uintmax_t)1 },
-	{ "1.7B",		(uintmax_t)0,	(uintmax_t)2 },
-
-	{ "1024",		(uintmax_t)0,	(uintmax_t)1024 },
-	{ "1k",			(uintmax_t)0,	(uintmax_t)1<<10 },
-	{ "1kB",		(uintmax_t)0,	(uintmax_t)1<<10 },
-	{ "1.3kB",		(uintmax_t)0,	(uintmax_t)1331 },
-	{ "1.7kB",		(uintmax_t)0,	(uintmax_t)1741 },
-
-	{ "1048576",		(uintmax_t)0,	(uintmax_t)1048576 },
-	{ "1M",			(uintmax_t)0,	(uintmax_t)1<<20 },
-	{ "1MB",		(uintmax_t)0,	(uintmax_t)1<<20 },
-	{ "1.3MB",		(uintmax_t)0,	(uintmax_t)1363149 },
-	{ "1.7MB",		(uintmax_t)0,	(uintmax_t)1782579 },
-
-	{ "1073741824",		(uintmax_t)0,	(uintmax_t)1073741824 },
-	{ "1G",			(uintmax_t)0,	(uintmax_t)1<<30 },
-	{ "1GB",		(uintmax_t)0,	(uintmax_t)1<<30 },
-	{ "1.3GB",		(uintmax_t)0,	(uintmax_t)1395864371 },
-	{ "1.7GB",		(uintmax_t)0,	(uintmax_t)1825361101 },
-
-	{ "1099511627776",	(uintmax_t)0,	(uintmax_t)1099511627776ULL },
-	{ "1T",			(uintmax_t)0,	(uintmax_t)1<<40 },
-	{ "1TB",		(uintmax_t)0,	(uintmax_t)1<<40 },
-	{ "1.3TB",		(uintmax_t)0,	(uintmax_t)1429365116109ULL },
-	{ "1.7TB",		(uintmax_t)0,	(uintmax_t)1869169767219ULL },
-
-	{ "1%",			(uintmax_t)1024,	(uintmax_t)10 },
-	{ "2%",			(uintmax_t)1024,	(uintmax_t)20 },
-	{ "3%",			(uintmax_t)1024,	(uintmax_t)31 },
-
-	/* Check the error checks */
-	{ "",			0,	0,	err_miss_num },
-	{ "m",			0,	0,	err_invalid_num },
-	{ "4%",			0,	0,	err_abs_req },
-	{ "3*",			0,	0,	err_invalid_suff },
-
-	/* TODO: add more */
-
-	{ 0, 0, 0 },
-};
-
-int
-main(int argc, char *argv[])
-{
-	struct test_case *tc;
-	uintmax_t val;
-	int ec;
-	const char *e;
-
-	(void)argc;
-	for (ec = 0, tc = test_cases; tc->str; ++tc) {
-		e = str2bytes(tc->str, &val, tc->rel);
-		if (e != tc->err) {
-			printf("%s: str2bytes(\"%s\", %ju) (%s) != (%s)\n",
-			    *argv, tc->str, tc->rel, tc->err, e);
-			++ec;
-		} else if (e == NULL && val != tc->val) {
-			printf("%s: str2bytes(\"%s\", %ju) %ju != %ju (%s)\n",
-			    *argv, tc->str, tc->rel, val, tc->val, e);
-			++ec;
-		}
-	}
-	/* TODO: test invalid strings */
-	if (!ec)
-		printf("OK\n");
-	return (ec > 0);
-}
-#endif
diff --git a/lib/libvarnish/vnum.c b/lib/libvarnish/vnum.c
new file mode 100644
index 0000000..7940e9b
--- /dev/null
+++ b/lib/libvarnish/vnum.c
@@ -0,0 +1,197 @@
+/*-
+ * Copyright (c) 2008-2009 Varnish Software AS
+ * All rights reserved.
+ *
+ * Author: Poul-Henning Kamp <phk at phk.freebsd.dk>
+ *
+ * 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 THE AUTHOR 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 AUTHOR 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.
+ *
+ * Deal with numbers with data storage suffix scaling
+ */
+
+#include "config.h"
+
+#include <math.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+
+#include "vnum.h"
+
+static const char err_miss_num[] = "Missing number";
+static const char err_invalid_num[] = "Invalid number";
+static const char err_abs_req[] = "Absolute number required";
+static const char err_invalid_suff[] = "Invalid suffix";
+
+const char *
+VNUM_2bytes(const char *p, uintmax_t *r, uintmax_t rel)
+{
+	double fval;
+	char *end;
+
+	if (p == NULL || *p == '\0')
+		return (err_miss_num);
+
+	fval = strtod(p, &end);
+	if (end == p || !isfinite(fval))
+		return (err_invalid_num);
+
+	if (*end == '\0') {
+		*r = (uintmax_t)fval;
+		return (NULL);
+	}
+
+	if (end[0] == '%' && end[1] == '\0') {
+		if (rel == 0)
+			return (err_abs_req);
+		fval *= rel / 100.0;
+	} else {
+		/* accept a space before the multiplier */
+		if (end[0] == ' ' && end[1] != '\0')
+			++end;
+
+		switch (end[0]) {
+		case 'k': case 'K':
+			fval *= (uintmax_t)1 << 10;
+			++end;
+			break;
+		case 'm': case 'M':
+			fval *= (uintmax_t)1 << 20;
+			++end;
+			break;
+		case 'g': case 'G':
+			fval *= (uintmax_t)1 << 30;
+			++end;
+			break;
+		case 't': case 'T':
+			fval *= (uintmax_t)1 << 40;
+			++end;
+			break;
+		case 'p': case 'P':
+			fval *= (uintmax_t)1 << 50;
+			++end;
+			break;
+		case 'e': case 'E':
+			fval *= (uintmax_t)1 << 60;
+			++end;
+			break;
+		default:
+			break;
+		}
+
+		/* [bB] is a generic suffix of no effect */
+		if (end[0] == 'b' || end[0] == 'B')
+			end++;
+
+		if (end[0] != '\0')
+			return (err_invalid_suff);
+	}
+
+	*r = (uintmax_t)round(fval);
+	return (NULL);
+}
+
+#ifdef NUM_C_TEST
+/* Compile with: "cc -o foo -DNUM_C_TEST -I../.. -I../../include num.c -lm" */
+#include "vas.h"
+#include <math.h>
+#include <stdio.h>
+#include <string.h>
+
+struct test_case {
+	const char *str;
+	uintmax_t rel;
+	uintmax_t val;
+	const char *err;
+} test_cases[] = {
+	{ "1",			(uintmax_t)0,	(uintmax_t)1 },
+	{ "1B",			(uintmax_t)0,	(uintmax_t)1<<0 },
+	{ "1 B",		(uintmax_t)0,	(uintmax_t)1<<0 },
+	{ "1.3B",		(uintmax_t)0,	(uintmax_t)1 },
+	{ "1.7B",		(uintmax_t)0,	(uintmax_t)2 },
+
+	{ "1024",		(uintmax_t)0,	(uintmax_t)1024 },
+	{ "1k",			(uintmax_t)0,	(uintmax_t)1<<10 },
+	{ "1kB",		(uintmax_t)0,	(uintmax_t)1<<10 },
+	{ "1.3kB",		(uintmax_t)0,	(uintmax_t)1331 },
+	{ "1.7kB",		(uintmax_t)0,	(uintmax_t)1741 },
+
+	{ "1048576",		(uintmax_t)0,	(uintmax_t)1048576 },
+	{ "1M",			(uintmax_t)0,	(uintmax_t)1<<20 },
+	{ "1MB",		(uintmax_t)0,	(uintmax_t)1<<20 },
+	{ "1.3MB",		(uintmax_t)0,	(uintmax_t)1363149 },
+	{ "1.7MB",		(uintmax_t)0,	(uintmax_t)1782579 },
+
+	{ "1073741824",		(uintmax_t)0,	(uintmax_t)1073741824 },
+	{ "1G",			(uintmax_t)0,	(uintmax_t)1<<30 },
+	{ "1GB",		(uintmax_t)0,	(uintmax_t)1<<30 },
+	{ "1.3GB",		(uintmax_t)0,	(uintmax_t)1395864371 },
+	{ "1.7GB",		(uintmax_t)0,	(uintmax_t)1825361101 },
+
+	{ "1099511627776",	(uintmax_t)0,	(uintmax_t)1099511627776ULL },
+	{ "1T",			(uintmax_t)0,	(uintmax_t)1<<40 },
+	{ "1TB",		(uintmax_t)0,	(uintmax_t)1<<40 },
+	{ "1.3TB",		(uintmax_t)0,	(uintmax_t)1429365116109ULL },
+	{ "1.7TB",		(uintmax_t)0,	(uintmax_t)1869169767219ULL },
+
+	{ "1%",			(uintmax_t)1024,	(uintmax_t)10 },
+	{ "2%",			(uintmax_t)1024,	(uintmax_t)20 },
+	{ "3%",			(uintmax_t)1024,	(uintmax_t)31 },
+
+	/* Check the error checks */
+	{ "",			0,	0,	err_miss_num },
+	{ "m",			0,	0,	err_invalid_num },
+	{ "4%",			0,	0,	err_abs_req },
+	{ "3*",			0,	0,	err_invalid_suff },
+
+	/* TODO: add more */
+
+	{ 0, 0, 0 },
+};
+
+int
+main(int argc, char *argv[])
+{
+	struct test_case *tc;
+	uintmax_t val;
+	int ec;
+	const char *e;
+
+	(void)argc;
+	for (ec = 0, tc = test_cases; tc->str; ++tc) {
+		e = VNUM_2bytes(tc->str, &val, tc->rel);
+		if (e != tc->err) {
+			printf("%s: VNUM_2bytes(\"%s\", %ju) (%s) != (%s)\n",
+			    *argv, tc->str, tc->rel, tc->err, e);
+			++ec;
+		} else if (e == NULL && val != tc->val) {
+			printf("%s: VNUM_2bytes(\"%s\", %ju) %ju != %ju (%s)\n",
+			    *argv, tc->str, tc->rel, val, tc->val, e);
+			++ec;
+		}
+	}
+	/* TODO: test invalid strings */
+	if (!ec)
+		printf("OK\n");
+	return (ec > 0);
+}
+#endif



More information about the varnish-commit mailing list