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