/* $Id: tableutil.c,v 1.31 2005/08/03 15:45:17 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 <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#include "table_fileop.h"
#include "types.h"
#include "ip4_range.h"

void usage(void);
void conf_parse_file(const char *file);
void conf_parse_str(const char *str);
void quickconvert(const char *type, const char *infile);

const char arg_p2b[]="p2b";
const char arg_text[]="text";

void
quickconvert(const char *type, const char *file) {
	ip4_range_list_t range_list;
	int load_ok = 0;

	ip4_range_list_init(&range_list);
	
	if (!strcmp(arg_p2b, type)) {
		if (!ip4_p2b_load(file, &range_list)) {
			load_ok = 1;
		}
	}
	else if (!strcmp(arg_text, type)) {
		if (!ip4_text_load(file, &range_list)) {
			load_ok = 1;
		}
	}
	else {
		usage();
		/* NOTREACHED */
	}
	
	if (load_ok) {
		ip4_range_list_output_cidr(stdout, &range_list);
	}
	
	ip4_range_list_destroy(&range_list);
}

int
main(int argc, char *const *argv) {
	int ch;
	char t = 0;
	if (argc < 3 || argc > 4) {
		usage();
	}
	
	while ((ch = getopt(argc, argv, "cfq")) != -1) {
		switch (ch) {
			case 'c':
			case 'f':
			case 'q': {
				if (t) usage();
				t = ch;
				break;
			}
			default: {
				usage();
				/* NOTREACHED */
				break;
			}
		}
	}
	
	argc -=optind;
	argv +=optind;
	
	switch (t) {
		case 'c': {
			conf_parse_str(argv[0]);
			return 0;
		}
		case 'f': {
			conf_parse_file(argv[0]);
			return 0;
		}
		case 'q': {
			if (argc == 2) {
				quickconvert(argv[0], argv[1]);
			}
			else if (argc == 1) {
				quickconvert(argv[0], NULL);
			}
			return 0;
		}
	}
	return 0;
}


__attribute__((__noreturn__)) void
usage(void) {
	extern char *__progname;

	fprintf(stderr, "usage: %s -q type [table]\n", __progname);
	fprintf(stderr, "       %s -c commands\n", __progname);
	fprintf(stderr, "       %s -f file\n", __progname);
	exit(1);
	/* NOTREACHED */
}


syntax highlighted by Code2HTML, v. 0.9.1