| /* | |
| * Copyright (C) 2002-2007 by Darren Reed. | |
| * | |
| * See the IPFILTER.LICENCE file for details on licencing. | |
| * | |
| * $Id$ | |
| */ | |
| #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; | |
| } |