/*
 * kenny -- a command-line kennyfier
 * Copyright 2002 Kohan Ikin <syneryder@namesuppressed.com>
 * Ported to C by Colin Leroy <colin@colino.net>
 * To compile use `gcc -o kenny kenny.c`
 * To run use `kenny "my string here"`
 *
 * Thanks to:
 *	Peter Palmreuther <pit@zentrumderarbeit.org> for a 
 *	reverse-translation bugfix.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 * 
 * You should have received a copy of the GNU Lesser General Public
 * License along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

#include <stdio.h>

#define NORMAL 		0
#define KENNYSPEAK 	1
#define FALSE		0
#define TRUE		1

void usage (void)
{
	printf("kenny STRING\n");
}

int is_kennyspeak (char *str) 
{
	int i=0;
	for (i=0; i < strlen(str); i++) {
		if ((*str >= 'a' && *str <= 'z' && *str != 'm' && *str != 'f' && *str != 'p')
		 || (*str >= 'A' && *str <= 'Z' && *str != 'M' && *str != 'F' && *str != 'P')) 
			return FALSE;
		*str++;
	}
	return TRUE;
}

char *to_kennyspeak (char *str)
{
	char *kenny_text = NULL;
	kenny_text = (char *)malloc(strlen(str)*3 + 1);
	while (str != NULL && *str != '\0') {
		if (*str < 'A' || (*str > 'Z' && *str < 'a') || *str > 'z') {
			sprintf(kenny_text, "%s%c", kenny_text, *str);
		} else {
			char *add = NULL;
			add = (char *)malloc(3*sizeof(char));
			switch (*str) {
				case 'e': sprintf(add, "mpp"); break;
				case 't': sprintf(add, "fmp"); break;
				case 'a': sprintf(add, "mmm"); break;
				case 'o': sprintf(add, "ppf"); break;
				case 'i': sprintf(add, "mff"); break;
				case 'n': sprintf(add, "ppp"); break;
				case 's': sprintf(add, "fmm"); break;
				case 'h': sprintf(add, "mfp"); break;
				case 'r': sprintf(add, "pff"); break;
				case 'd': sprintf(add, "mpm"); break;
				case 'l': sprintf(add, "pmf"); break;
				case 'c': sprintf(add, "mmf"); break;
				case 'u': sprintf(add, "fmf"); break;
				case 'm': sprintf(add, "ppm"); break;
				case 'w': sprintf(add, "fpp"); break;
				case 'f': sprintf(add, "mpf"); break;
				case 'g': sprintf(add, "mfm"); break;
				case 'y': sprintf(add, "ffm"); break;
				case 'p': sprintf(add, "pfm"); break;
				case 'b': sprintf(add, "mmp"); break;
				case 'v': sprintf(add, "fpm"); break;
				case 'k': sprintf(add, "pmp"); break;
				case 'j': sprintf(add, "pmm"); break;
				case 'x': sprintf(add, "fpf"); break;
				case 'q': sprintf(add, "pfp"); break;
				case 'z': sprintf(add, "ffp"); break;
				case 'E': sprintf(add, "Mpp"); break;
				case 'T': sprintf(add, "Fmp"); break;
				case 'A': sprintf(add, "Mmm"); break;
				case 'O': sprintf(add, "Ppf"); break;
				case 'I': sprintf(add, "Mff"); break;
				case 'N': sprintf(add, "Ppp"); break;
				case 'S': sprintf(add, "Fmm"); break;
				case 'H': sprintf(add, "Mfp"); break;
				case 'R': sprintf(add, "Pff"); break;
				case 'D': sprintf(add, "Mpm"); break;
				case 'L': sprintf(add, "Pmf"); break;
				case 'C': sprintf(add, "Mmf"); break;
				case 'U': sprintf(add, "Fmf"); break;
				case 'M': sprintf(add, "Ppm"); break;
				case 'W': sprintf(add, "Fpp"); break;
				case 'F': sprintf(add, "Mpf"); break;
				case 'G': sprintf(add, "Mfm"); break;
				case 'Y': sprintf(add, "Ffm"); break;
				case 'P': sprintf(add, "Pfm"); break;
				case 'B': sprintf(add, "Mmp"); break;
				case 'V': sprintf(add, "Fpm"); break;
				case 'K': sprintf(add, "Pmp"); break;
				case 'J': sprintf(add, "Pmm"); break;
				case 'X': sprintf(add, "Fpf"); break;
				case 'Q': sprintf(add, "Pfp"); break;
				case 'Z': sprintf(add, "Ffp"); break;
			}
			sprintf(kenny_text, "%s%s",kenny_text,add);
			free(add);
			add = NULL;
		}
		*str++;
	}
	return kenny_text;
}

char *to_normal (char *str)
{
	char *normal_text = NULL;
	char *temp = NULL;
	int i =0;
	int str_length = strlen(str);
	normal_text = (char *)malloc(strlen(str)/2 + 1);
	temp = (char *)malloc(2*sizeof(char));

	while (i < str_length) {
		char add;
		if (i < str_length - 2)
			sprintf(temp,"%c%c",*(str+1),*(str+2));
		if (*str < 'A' || (*str > 'Z' && *str < 'a') || *str > 'z') {
			sprintf(normal_text, "%s%c", normal_text, *str);
			*(str++);
			i++;
			continue;
		} else if (*str == 'm') {
			     if (!strncmp(temp, "pp", 2)) add = 'e';
			else if (!strncmp(temp, "mm", 2)) add = 'a';
			else if (!strncmp(temp, "ff", 2)) add = 'i';
			else if (!strncmp(temp, "fp", 2)) add = 'h';
			else if (!strncmp(temp, "pm", 2)) add = 'd';
			else if (!strncmp(temp, "mf", 2)) add = 'c';
			else if (!strncmp(temp, "pf", 2)) add = 'f';
			else if (!strncmp(temp, "fm", 2)) add = 'g';
			else if (!strncmp(temp, "mp", 2)) add = 'b';
		} else if (*str == 'p') {
			     if (!strncmp(temp, "pf", 2)) add = 'o';
			else if (!strncmp(temp, "pp", 2)) add = 'n';
			else if (!strncmp(temp, "ff", 2)) add = 'r';
			else if (!strncmp(temp, "mf", 2)) add = 'l';
			else if (!strncmp(temp, "pm", 2)) add = 'm';
			else if (!strncmp(temp, "fm", 2)) add = 'p';
			else if (!strncmp(temp, "mp", 2)) add = 'k';
			else if (!strncmp(temp, "mm", 2)) add = 'j';
			else if (!strncmp(temp, "fp", 2)) add = 'q';
		} else if (*str == 'f') {
			     if (!strncmp(temp, "mp", 2)) add = 't';
			else if (!strncmp(temp, "mm", 2)) add = 's';
			else if (!strncmp(temp, "mf", 2)) add = 'u';
			else if (!strncmp(temp, "pp", 2)) add = 'w';
			else if (!strncmp(temp, "fm", 2)) add = 'y';
			else if (!strncmp(temp, "pm", 2)) add = 'v';
			else if (!strncmp(temp, "pf", 2)) add = 'x';
			else if (!strncmp(temp, "fp", 2)) add = 'z';
		} else if (*str == 'M') {
			     if (!strncmp(temp, "pp", 2)) add = 'E';
			else if (!strncmp(temp, "mm", 2)) add = 'A';
			else if (!strncmp(temp, "ff", 2)) add = 'I';
			else if (!strncmp(temp, "fp", 2)) add = 'H';
			else if (!strncmp(temp, "pm", 2)) add = 'D';
			else if (!strncmp(temp, "mf", 2)) add = 'C';
			else if (!strncmp(temp, "pf", 2)) add = 'F';
			else if (!strncmp(temp, "fm", 2)) add = 'G';
			else if (!strncmp(temp, "mp", 2)) add = 'B';
		} else if (*str == 'P') {
			     if (!strncmp(temp, "pf", 2)) add = 'O';
			else if (!strncmp(temp, "pp", 2)) add = 'N';
			else if (!strncmp(temp, "ff", 2)) add = 'R';
			else if (!strncmp(temp, "mf", 2)) add = 'L';
			else if (!strncmp(temp, "pm", 2)) add = 'M';
			else if (!strncmp(temp, "fm", 2)) add = 'P';
			else if (!strncmp(temp, "mp", 2)) add = 'K';
			else if (!strncmp(temp, "mm", 2)) add = 'J';
			else if (!strncmp(temp, "fp", 2)) add = 'Q';
		} else if (*str == 'F') {
			     if (!strncmp(temp, "mp", 2)) add = 'T';
			else if (!strncmp(temp, "mm", 2)) add = 'S';
			else if (!strncmp(temp, "mf", 2)) add = 'U';
			else if (!strncmp(temp, "pp", 2)) add = 'W';
			else if (!strncmp(temp, "fm", 2)) add = 'Y';
			else if (!strncmp(temp, "pm", 2)) add = 'V';
			else if (!strncmp(temp, "pf", 2)) add = 'X';
			else if (!strncmp(temp, "fp", 2)) add = 'Z';
		}
		sprintf(normal_text,"%s%c",normal_text,add);
		*(str+=3);
		i+=3;
	}
	return normal_text;
}

int main (int argc, char *argv[])
{
	if (argc < 2 || !strncmp(argv[1],"--help",6)) {
		usage();
	} else if (!strncmp(argv[1],"greggles is a steggles",22)) {
		printf("oh yes he is\n");
	} else if (!strncmp(argv[1],"hellokohan",10)) {
		printf("fittzuzfa!\n");
	} else if (!strncmp(argv[1],"ik!",3)) {
		printf("\"ik!\" is not an easter egg.\n");
	} else if (!strncmp(argv[1],"ik",2)) {
		printf("\"ik\" was Simon's idea, not mine!\n");
	} else if (!strncmp(argv[1],"ingy",4)) {
		printf("\"Sad eggs....\"\n\n- Ingy\nwww.ingy.net\n");
	} else if (!strncmp(argv[1],"CS302",5)) {
		printf("Pat Quincy Upbottom\n");
	} else if (!strncmp(argv[1],"Aeolas",6)) {
		printf("Aeolas thinks KennySpeak sounds like "
                       "someone getting head....\n\n"
                       "http://pub28.ezboard.com/ftweetysnestofr"
                       "eaksfrm1.showMessage?topicID=701.topic\n");
	} else if (is_kennyspeak(argv[1])) {
		printf("%s\n", to_normal(argv[1]));
	} else {
		printf("%s\n", to_kennyspeak(argv[1]));
	}
	return 0;
}

