/**
 * File: krypto.c
 * Author: Rainer Liis
 * Created: 29.01.2018
 * Last edit: 31.01.2018
 * 
 * Descrption: Encryption and decryption of text using caesar cipher.
 * 				Input from text file and output to a text file.
 * 				Encryption counts up, decryption counts down.
 */

#include <stdio.h>

void encrypt ();
void decrypt ();

int main (void)
{
	char valik;

	printf ("Do you wish to encrypt or decrypt?\n");

	// user enters choice

	do
	{
		printf ("Please enter a valid option(e/d):");
		scanf ("%c", &valik);
	} 
	while (valik != 'e' && valik != 'd');

	//depending on the choice, a function is started

	if (valik == 'e')
	{
		encrypt ();
	}
	else if (valik == 'd')
	{
		decrypt ();
	}
	else
	{
		printf ("option does not exist"); // if input is not one of
	}									  // the choices

	return 0;
}

void encrypt ()
{
	char ni[80] = "sisend.txt", no[80] = "tul.txt";
	char c;
	int key;
	int caesar;

	FILE *fi, *fo;
	fi = fopen (ni, "r");
	fo = fopen (no, "w");

	printf ("Enter the encryption key to encrypt: ");
	scanf ("%d", &key);

	key = key % 26; // in case the key is too large

	do
	{
		c = fgetc(fi);

		if (feof(fi)) // loop breaks when fgetc reaches end of file
		{
			break;
		}

        if (c == 32) // if c is space
        {
            caesar = 32;
        }
		if (c >= 65 && c <= 90) // if char is uppercase
		{ 
			if ((c + key) > 90)
			{
				caesar = c - (26 - key);
			}
			else
			{
				caesar = (int)c + key;
			}
		}
		else if (c >= 97 && c <= 122) // if char is lowercase
		{
			if ((c + key) > 122)
			{
				caesar = c - (26 - key);
			}
			else
			{
				caesar = (int)c + key;
			}
		}

		printf ("%c", caesar);
		fprintf (fo, "%c", caesar);
	}
	while (1);

	printf (" \n");
}

void decrypt ()
{
	char ni[80] = "sisend.txt", no[80] = "tul.txt";
	char c;
	int key;
	int caesar;

	FILE *fi, *fo;
	fi = fopen (ni, "r");
	fo = fopen (no, "w");

	printf("Enter the encryption key to decrypt: ");
	scanf ("%d", &key);

	key = key % 26; // in case the key is too large

	do
	{
		c = fgetc(fi);

		if (feof(fi)) // loop breaks when fgetc reaches end of file
		{
			break;
		}

        if (c == 32)
        {
            caesar = 32; // if c is space
        }
		if (c >= 65 && c <= 90) // if char is uppercase
		{ 
			if ((c - key) < 65)
			{
				caesar = c + (26 - key);
			}
			else
			{
				caesar = (int)c - key;
			}
		}
		else if (c >= 97 && c <= 122) // if char is lowercase
		{
			if ((c - key) < 97)
			{
				caesar = c + (26 - key);
			}
			else
			{
				caesar = (int)c - key;
			}
		}

		printf ("%c", caesar);
		fprintf (fo, "%c", caesar);
	}
	while (1);

	printf (" \n");
}