count4bits.c revision 145510
1145510Sdarrenr/* $NetBSD$ */ 2145510Sdarrenr 3145510Sdarrenr/* 4145510Sdarrenr * Copyright (C) 1993-2001 by Darren Reed. 5145510Sdarrenr * 6145510Sdarrenr * See the IPFILTER.LICENCE file for details on licencing. 7145510Sdarrenr * 8145510Sdarrenr * Id: count4bits.c,v 1.1 2002/06/15 04:46:39 darrenr Exp 9145510Sdarrenr */ 10145510Sdarrenr 11145510Sdarrenr#include "ipf.h" 12145510Sdarrenr 13145510Sdarrenr 14145510Sdarrenr/* 15145510Sdarrenr * count consecutive 1's in bit mask. If the mask generated by counting 16145510Sdarrenr * consecutive 1's is different to that passed, return -1, else return # 17145510Sdarrenr * of bits. 18145510Sdarrenr */ 19145510Sdarrenrint count4bits(ip) 20145510Sdarrenru_int ip; 21145510Sdarrenr{ 22145510Sdarrenr int cnt = 0, i, j; 23145510Sdarrenr u_int ipn; 24145510Sdarrenr 25145510Sdarrenr ip = ipn = ntohl(ip); 26145510Sdarrenr for (i = 32; i; i--, ipn *= 2) 27145510Sdarrenr if (ipn & 0x80000000) 28145510Sdarrenr cnt++; 29145510Sdarrenr else 30145510Sdarrenr break; 31145510Sdarrenr ipn = 0; 32145510Sdarrenr for (i = 32, j = cnt; i; i--, j--) { 33145510Sdarrenr ipn *= 2; 34145510Sdarrenr if (j > 0) 35145510Sdarrenr ipn++; 36145510Sdarrenr } 37145510Sdarrenr if (ipn == ip) 38145510Sdarrenr return cnt; 39145510Sdarrenr return -1; 40145510Sdarrenr} 41