summaryrefslogtreecommitdiffstats
path: root/contrib/ipfilter/lib/count4bits.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/ipfilter/lib/count4bits.c')
-rw-r--r--contrib/ipfilter/lib/count4bits.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/contrib/ipfilter/lib/count4bits.c b/contrib/ipfilter/lib/count4bits.c
new file mode 100644
index 0000000..a847388
--- /dev/null
+++ b/contrib/ipfilter/lib/count4bits.c
@@ -0,0 +1,40 @@
+/* $FreeBSD$ */
+
+/*
+ * Copyright (C) 2012 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * $Id$
+ */
+
+#include "ipf.h"
+
+
+/*
+ * count consecutive 1's in bit mask. If the mask generated by counting
+ * consecutive 1's is different to that passed, return -1, else return #
+ * of bits.
+ */
+int count4bits(ip)
+ u_int ip;
+{
+ int cnt = 0, i, j;
+ u_int ipn;
+
+ ip = ipn = ntohl(ip);
+ for (i = 32; i; i--, ipn *= 2)
+ if (ipn & 0x80000000)
+ cnt++;
+ else
+ break;
+ ipn = 0;
+ for (i = 32, j = cnt; i; i--, j--) {
+ ipn *= 2;
+ if (j > 0)
+ ipn++;
+ }
+ if (ipn == ip)
+ return cnt;
+ return -1;
+}
OpenPOWER on IntegriCloud