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

char **wordlist = (char **) NULL;
int num_words = 0;

char *xstrdup (char *str)
{
	char *ptr;

	ptr = strdup(str);
	assert (ptr);
	return ptr;
}

void *xrealloc (void *ptr, int num)
{
	void *ptr2;

	ptr2 = realloc(ptr, num);
	assert (ptr2);
	return ptr2;
}

void append_word (char *word)
{
	int i;

	for (i = 0; i < num_words; i++)
		if (!strcmp(wordlist[i], word))
			return;

	wordlist = (char **) xrealloc(wordlist, (num_words + 1) * sizeof(char *));
	wordlist[num_words++] = xstrdup(word);
}

char tolower_pl (char ch)
{
	int i = 0;
	static char duze[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZÊÓ¯¡¦£¯¬ÆÑ";
	static char male[] = "abcdefghijklmnopqrstuvwxyzêó¿±¶³¿¼æñ";

	while (duze[i])
		if (ch == duze[i] || ch == male[i])
			return male[i];
		else
			i++;

	return 0;
}

char *load_word (void)
{
	char ch, done = 0;
	char *word = (char *) NULL;
	int i = 0;

	while (!done) {
		ch = tolower_pl(fgetc(stdin));
		if (feof(stdin) || !ch)
			break;
		word = (char *) xrealloc(word, i + 1);
		word[i++] = ch;
	}

	if (word) {
		word = (char *) xrealloc(word, i + 1);
		word[i] = (char) NULL;
	}

	return word;
}

void load_wordlist (void)
{
	char *word;

	while (!feof(stdin)) {
		word = load_word();
		if (feof(stdin) || !word)
			continue;
		append_word (word);
		free (word);
	}
}

void free_wordlist (void)
{
	int i;

	if (!num_words)
		return;

	for (i = 0; i < num_words; i++)
		free (wordlist[i]);

	free (wordlist);
}

void process (void)
{
	int num_to_gen = rand() % 100 + 100;
	static char chars[] = ".,;";
	int rndval;

	while (num_to_gen--) {
		printf ("%s", wordlist[rand() % num_words]);
		rndval = rand() & 15;
		if (rndval < 3)
			printf ("%c", chars[rndval]);
		printf (" ");
	}

	printf ("\n");
}

int main (int argc, char **argv)
{
	load_wordlist();
	process();
	free_wordlist();
}
