#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <limits.h>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>

unsigned long entries, converted;

void capitalize(char *s) {
	int toup = 1;
	while (*s){
	if (toup != 1) { 
		(*s) = tolower(*s);
		if (isspace(*s)) toup = 1;
	} else {
		toup = 0;
	}
	s++;
	}
}


void convert_ip (char *addr) {
	unsigned long iptemp;
	sscanf(addr,"%lu",&iptemp);
	sprintf(addr, "%u.%u.%u.%u",
			(int)floor(iptemp/16777216),
			((int)floor(iptemp/65536)) % 256,
			((int)floor(iptemp/256)) % 256,
			(int)(iptemp % 256));
}

void convert(char *buf, FILE *f) {
	char *IP_deb=malloc(16), *IP_fin=malloc(16), *pays, *state, *ville, *ptr;
	char *sep="\t\n";
	
	ptr = strtok(buf,sep);
	snprintf(IP_deb,16,"%s",ptr);
	ptr = strtok(NULL,sep);
	snprintf(IP_fin,16,"%s",ptr);
	pays = strtok(NULL,sep);
	if (!pays) {
		pays="XX";
	}
	if (strncmp(pays,"XX",sizeof("XX"))) {
	state = strtok(NULL,sep);
	if (state){
		ville = strtok(NULL,sep);
		if (!ville){
			ville = state;
		}
	} else {
		ville="";
	}
	convert_ip(IP_deb);
	convert_ip(IP_fin);
	capitalize(ville);
	fprintf (f,"%s|%s|%s|%s\n",
		IP_deb,IP_fin,pays,ville);
	converted++;	
	}
	free(IP_deb);
	free(IP_fin);
}

int main(int argc, char **argv) {
	char buffer[LINE_MAX];
	FILE *inputfile;
	FILE  *outputfile;
	int ch;

	entries = converted = 0;
	inputfile = stdin;
	outputfile = stdout;

	while ((ch = getopt(argc,argv,"i:o:")) != - 1) {
	switch(ch) { 
		case 'i':
			if (strcmp("-", optarg)) {
			inputfile = fopen(optarg, "r");
			if (inputfile == NULL) {
			perror("fopen()");
			exit(EXIT_FAILURE);
				}
			}			
			break;
                case 'o':
			outputfile = fopen(optarg, "w");
			if (outputfile == NULL) {
			perror("fopen()");
			exit(EXIT_FAILURE);
			}
			break;
		}
	}

	while (1) {
	fgets(buffer, LINE_MAX, inputfile);
	if (feof(inputfile))
	break;
	convert(buffer,outputfile);
	entries++;
	};
	fprintf(stderr, "%lu entrees converties sur %lu\n.", converted, entries);
	return 0;
}
