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 Soomeint 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