#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <ctype.h>

void usage(void);

int displaykey=0;
char* string;

#define VERSIONINFO "Cryptoquip Scrambler v2.0 by Edwin Olson, eolson@mit.edu"
#define BUFFSIZE 4096

void showusage(char *name);
void dointeractive(void);
void scramble(char *string, int displaykey);

int main(int argc, char *argv[])
{
	int loop;
	
	/* seed the random number generator */
   srand( (unsigned)time( NULL ) );
	
	for (loop=1;loop<argc;loop++)
	{
		/* let's take a look at the arguments! */
		if (!strcmp("-k",argv[loop]))
		{
			displaykey=1;
			continue;
		}
		
		if (!strcmp("-h",argv[loop]) || !strcmp("-?",argv[loop]))
		{
			showusage(argv[0]);
			return(0);
		}
		
		string=argv[loop];
	}
	
	if (argc<=1)
	{	
		dointeractive();
		return(0);
	}
	
	/* we got this far, so we know we should just do the commandline stuff */
	
	scramble(string,displaykey);
}

void showusage(char *name)
{
	printf("%s\n",VERSIONINFO);
	printf("usage: %s \"message to scramble\" -k\n\n",name);
	
	printf("\t-k display the letter mappings\n");
	printf("use no options for interactive usage\n");
}

void dointeractive()
{
	char buffer[BUFFSIZE];
	char response[4];

	printf("%s\n\n",VERSIONINFO);
	
	printf("Enter the string to scramble below (4K max):\n");
	
	fgets(buffer,BUFFSIZE-1,stdin);
	
	while (1)
	{
		scramble(buffer,1);
		printf("Scramble this same string again? ");
		fgets(response,4,stdin);
		if (toupper(response[0])!='Y')
			break;
	}
}

void scramble(char *string, int displaykey)
{
	char map[256];
	char loop;
	int	idx;
	int len;
	int isuppercase;

   /* zero the array */
	for (loop='A';loop<='Z';loop++)
	   map[loop]=0;

	/* okay, fill in the array */
	for (loop='A';loop<='Z';loop++)
	{
		idx=abs(rand()%26);
		while (map[idx+'A']!=0)
			idx=(idx+1)%26;
		map[idx+'A']=loop;
	}

	/* show the key if they were interested */
	if (displaykey)
	{
	for (loop='A';loop<='Z';loop++)
		printf("%c=%c\t",loop,map[loop]);
	}

	printf("\n\n");

	/* display the scrambled puzzle! */
	len=strlen(string);

	for (loop=0;loop<len;loop++)
	{
		if (isalpha(string[loop]))
		{
		isuppercase=(string[loop]==toupper(string[loop]));
		if (isuppercase)
			printf("%c",map[string[loop]]);
		else
			printf("%c",tolower(map[toupper(string[loop])]));
		}
		else
			printf("%c",string[loop]);
	}

	printf("\n\n");
}
