/* $Id: ip4_cidr.c,v 1.9 2005/07/05 21:15:46 gsson Exp $ */
/*
 * Copyright (c) 2005 Henrik Gustafsson <henrik.gustafsson@fnord.se>
 *
 * Permission to use, copy, modify, and distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

#include <stdlib.h>
#include <stdio.h>
#include "ip4_cidr.h"

const u_int32_t prefix_mask[] = {
	0x00000000,
	0x80000000,
	0xC0000000,
	0xE0000000,
	0xF0000000,
	0xF8000000,
	0xFC000000,
	0xFE000000,
	0xFF000000,
	0xFF800000,
	0xFFC00000,
	0xFFE00000,
	0xFFF00000,
	0xFFF80000,
	0xFFFC0000,
	0xFFFE0000,
	0xFFFF0000,
	0xFFFF8000,
	0xFFFFC000,
	0xFFFFE000,
	0xFFFFF000,
	0xFFFFF800,
	0xFFFFFC00,
	0xFFFFFE00,
	0xFFFFFF00,
	0xFFFFFF80,
	0xFFFFFFC0,
	0xFFFFFFE0,
	0xFFFFFFF0,
	0xFFFFFFF8,
	0xFFFFFFFC,
	0xFFFFFFFE,
	0xFFFFFFFF
};

u_int32_t
ip4_cidr_top_address(u_int32_t address, u_int8_t prefix) {
	return (address & prefix_mask[prefix]) | ~prefix_mask[prefix];
}


int
ip4_cidr_suffix(u_int32_t address) {
	int i;
	for(i=1; i < 32+1; i++){
		if(address & prefix_mask[i]) return (32-i);
	}
	return 0;
}

int
ip4_cidr_prefix(u_int32_t address) {
	int i;
	for (i = 32; i >= 0; i--) {
		if (address & ~prefix_mask[i]) return (i+1);
	}
	return 0;
}

void ip4_cidr_output(FILE *f, u_int32_t address, u_int8_t prefix)
{
        fprintf(f, "%d.%d.%d.%d/%d", address >> 24 & 255, address >> 16 & 255, address >> 8 & 255, address & 255, prefix);
}


syntax highlighted by Code2HTML, v. 0.9.1