/* 
 * ipcalc
 * (c) 2004 gophi@linux.net.pl
 *
 * przykłady użycia:
 *
 *  ipcalc q 127.0.0.1
 *  ipcalc h 7F000001
 *  ipcalc x 7F000001 (to samo co h)
 *  ipcalc d 2130706433
 *  ipcalc w dwa jeden trzy zero siedem zero sześć cztery trzy trzy
 *
 * wypluje wtedy (za każdym razem):
 *
 *  Dotted-Quad: 127.0.0.1
 *  Dec: 2130706433
 *  Hex: 7F000001
 *  Words: dwa jeden trzy zero siedem zero sześć cztery trzy trzy
 *
 * have fun.
 */

#include <string.h>
#include <stdio.h>

char parse_word (char *word)
{
	static char *words[] = {
		"zero", "jeden", "dwa", "trzy", "cztery",
		"pięć", "sześć", "siedem", "osiem", "dziewięć",
		NULL
	};
	int i = 0;

	while (words[i])
		if (!strcmp(word, words[i]))
			return i;
		else
			i++;

	return 0;	
}

unsigned long int parse_wordlist (int argc, char **argv)
{
	unsigned long int multip = 1, val;

	if (argc > 12 || argc <= 2)
		return 0;

	argc -= 2;
	argv += 2;
	for (val = 0; val < argc - 1; val++)
		multip *= 10;

	val = 0;

	while (argc) {
		val += parse_word(*argv++) * multip;
		multip /= 10;
		argc--;
	}

	return val;
}

void print_words (unsigned long int ip)
{
	static char *words[] = {
		"zero", "jeden", "dwa", "trzy", "cztery",
		"pięć", "sześć", "siedem", "osiem", "dziewięć"
	};
	int i = 0;
	char values[11];

	printf ("Words: ");

	snprintf (values, sizeof(values), "%lu", ip);

	while (values[i])
		printf ("%s ", words[values[i++] - '0']);

	printf ("\n");
}

int main (int argc, char **argv)
{
	unsigned long int ip;

	if (argc < 3)
		return -1;

	if (*argv[1] == 'q') {
		unsigned char quad[4];
		sscanf (argv[2], "%u.%u.%u.%u", &quad[0], &quad[1], &quad[2], &quad[3]);
		ip = (quad[0] << 24) | (quad[1] << 16) | (quad[2] << 8) | quad[3];
	} else if (*argv[1] == 'd')
		sscanf (argv[2], "%lu", &ip);
	else if (*argv[1] == 'h' || *argv[1] == 'x')
		sscanf (argv[2], "%lX", &ip);
	else if (*argv[1] == 'w')
		ip = parse_wordlist(argc, argv);
	else
		ip = 0;

	printf ("Dotted-Quad: ");
	printf ("%d.", ip >> 24);
	printf ("%d.", (ip >> 16) & 0xFF);
	printf ("%d.", (ip >> 8) & 0xFF);
	printf ("%d\n", ip & 0xFF);
	printf ("Dec: %lu\n", ip);
	printf ("Hex: %lX\n", ip);
	print_words (ip);
	
	return 0;
}
