#include <stdio.h>

typedef struct node {
	char * slovo;
	char ** preklad;
	int prekladu;
	int velikost;
	struct node * l, * p;
} node;

/*tisk prvku stromu*/
int tisk_polozky(node * n)
{
	int i;

	printf("%s: ", n->slovo);
	for (i = 0; i < n->prekladu - 1; i++)
		printf("%s, ", n->preklad[i]);
	printf("%s\n", n->preklad[n->prekladu - 1]);
}

/*prida slovo do slovniku*/
int pridej_slovo(node ** n, char * slovo, char ** preklad, int prekladu)
{
	node * nn;
	int v, i, j, x;

	/* najdu kam se bude pridavat */
	while (*n) {
		v = strcmp(slovo, (*n)->slovo);
		if (v < 0)
			n = &(*n)->l;
		else if (v > 0)
			n = &(*n)->p;
		else {
			/* slovo jiz je ve slovniku, zkontroluju preklady */
			x = (*n)->prekladu;
			for (i = 0; i < prekladu; i++) {
				v = 0;
				/* zkontroluji jestli preklad je ve slovniku */
				for (j = 0; j < x; j++)
					if (!strcmp(preklad[i], (*n)->preklad[i]))
						v = 1;
				/* preklad neni ve slovniku, pridam ho */
				if (!v) {
					if ((*n)->prekladu == (*n)->velikost) { /* zvetsime pole prekladu */
						(*n)->velikost *= 2;
						if (!realloc((*n)->preklad, (*n)->velikost))
							return 1;
					}
					(*n)->preklad[(*n)->prekladu] = preklad[i];
					++(*n)->prekladu;
				}
			}
			return 0;
		}
	}

	nn = malloc(sizeof(node));
	if (!nn)
		return 1;
	nn->slovo = slovo;
	nn->preklad = preklad;
	nn->prekladu = prekladu;
	nn->velikost = 1024; /* jinou velikost pri puvodnim vstupu mit nemuze */
	nn->l = nn->p = 0;
	(*n) = nn;
	return 0;
}

/*dotaz do slovniku*/
int hledej_slovo(node * n, char * slovo)
{
	int v;

	if (n) {
		v = strcmp(slovo, n->slovo);
		if (v == 0) {
			tisk_polozky(n);
			return 0;
		}
		else {
			if (v < 0)
				return hledej_slovo(n->l, slovo);
			else
				return hledej_slovo(n->p, slovo);
		}
	}
	else 
		return 1;
}

/*inorder pruchod stromem a jeho tisk*/
int tisk_slovniku(node * n)
{
	if (n) {
		tisk_slovniku(n->l);
		tisk_polozky(n);
		tisk_slovniku(n->p);
	}
}

/*postorder pruchod stromem ktery vymaze vsechny vrcholy*/
void vymaz_slovnik(node * n)
{
	if (n) {
		vymaz_slovnik(n->l);
		vymaz_slovnik(n->p);
		free(n);
	}
}

int main()
{
	char c, * slovo, * buffer, ** preklad;
	node * slovnik;
	int i, p, e;

	slovnik = 0;
	buffer = malloc(1024);

	printf("> ");
	while ((c = getc(stdin)) != '\n') {
		switch(c) {
			case '+':
				i = 0;
				while ((c = getc(stdin)) != ' ' && c != '\n')
					buffer[i++] = c;
				buffer[i] = '\0';
				slovo = malloc(i + 1);
				strcpy(slovo, buffer);

				i = p = e = 0;
				preklad = malloc(1024);
				while ((c = getc(stdin)) != '\n') {
					if (c == ',') {
						buffer[i] = '\0';
						preklad[p] = malloc(i + 1);
						strcpy(preklad[p], buffer);
						i = 0;
						++p;
						if (getc(stdin) != ' ') {
							printf("neplatny prikaz\n");
							e = 1;
						}
					}
					else
						buffer[i++] = c;
				}
				buffer[i] = '\0';
				preklad[p] = malloc(i + 1);
				strcpy(preklad[p], buffer);

				if (!e && pridej_slovo(&slovnik, slovo, preklad, p + 1))
					printf("nedostatek pameti\n");
				break;
			case '?':
				i = 0;
				while ((c = getc(stdin)) != ' ' && c != '\n')
					buffer[i++] = c;
				buffer[i] = '\0';
				if (hledej_slovo(slovnik, buffer))
					printf("slovo neni ve slovniku\n");
				break;
			case '!':
				tisk_slovniku(slovnik);
				break;
		}
		while (c != '\n')
			c = getc(stdin);
		printf("> ");
	}
	vymaz_slovnik(slovnik);
	free(buffer);

	return 0;
}