netbsd/external/bsd/ipf/dist/lib/count4bits.c
2013-04-06 16:48:33 +02:00

41 lines
729 B
C

/* $NetBSD: count4bits.c,v 1.2 2012/07/22 14:27:36 darrenr Exp $ */
/*
* Copyright (C) 2012 by Darren Reed.
*
* See the IPFILTER.LICENCE file for details on licencing.
*
* Id: count4bits.c,v 1.1.1.2 2012/07/22 13:44:38 darrenr Exp $
*/
#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;
}