xref: /illumos-gate/usr/src/cmd/ipf/lib/count4bits.c (revision f3ac678143127d4c6c1793fadabb5ded04e127b6)
1*f3ac6781SToomas Soome /*
2*f3ac6781SToomas Soome  * Copyright (C) 1993-2001 by Darren Reed.
3*f3ac6781SToomas Soome  *
4*f3ac6781SToomas Soome  * See the IPFILTER.LICENCE file for details on licencing.
5*f3ac6781SToomas Soome  *
6*f3ac6781SToomas Soome  * $Id: count4bits.c,v 1.1 2002/06/15 04:46:39 darrenr Exp $
7*f3ac6781SToomas Soome  */
8*f3ac6781SToomas Soome 
9*f3ac6781SToomas Soome #include "ipf.h"
10*f3ac6781SToomas Soome 
11*f3ac6781SToomas Soome 
12*f3ac6781SToomas Soome /*
13*f3ac6781SToomas Soome  * count consecutive 1's in bit mask.  If the mask generated by counting
14*f3ac6781SToomas Soome  * consecutive 1's is different to that passed, return -1, else return #
15*f3ac6781SToomas Soome  * of bits.
16*f3ac6781SToomas Soome  */
count4bits(ip)17*f3ac6781SToomas Soome int	count4bits(ip)
18*f3ac6781SToomas Soome u_int	ip;
19*f3ac6781SToomas Soome {
20*f3ac6781SToomas Soome 	int cnt = 0, i, j;
21*f3ac6781SToomas Soome 	u_int ipn;
22*f3ac6781SToomas Soome 
23*f3ac6781SToomas Soome 	ip = ipn = ntohl(ip);
24*f3ac6781SToomas Soome 	for (i = 32; i; i--, ipn *= 2)
25*f3ac6781SToomas Soome 		if (ipn & 0x80000000)
26*f3ac6781SToomas Soome 			cnt++;
27*f3ac6781SToomas Soome 		else
28*f3ac6781SToomas Soome 			break;
29*f3ac6781SToomas Soome 	ipn = 0;
30*f3ac6781SToomas Soome 	for (i = 32, j = cnt; i; i--, j--) {
31*f3ac6781SToomas Soome 		ipn *= 2;
32*f3ac6781SToomas Soome 		if (j > 0)
33*f3ac6781SToomas Soome 			ipn++;
34*f3ac6781SToomas Soome 	}
35*f3ac6781SToomas Soome 	if (ipn == ip)
36*f3ac6781SToomas Soome 		return cnt;
37*f3ac6781SToomas Soome 	return -1;
38*f3ac6781SToomas Soome }
39