#include <stdio.h>

// CAESAR KODIERUNG AUF 3 ARTEN

void cls()
{
	printf("\033[2J\033[;H");
	return;
}

int caesarcrypt1(char *mem, char offset)
{
	if(offset>='A'&&offset<='Z')
		offset-='A'-1;
	if(offset>='a'&&offset<='z')
		offset-='a'-1;
	if(offset<0||offset>26)
		return;
	do
	{
		if(*mem>='A' && *mem<= 'Z')
		{ 
			if((*mem)+offset<='Z')
				*mem=*mem+offset;
			else
				*mem='A'+(*mem+offset)-('Z')-1;
		}
		else
		{
			if((*mem)+offset<='z')
				*mem=*mem+offset;
			else
				*mem='a'+(*mem+offset)-('z')-1;
		}		
		mem++;
	} while(*mem);	
	return;
}


int caesarcrypt1_compact(char *mem, char offset)
{
	if(offset>='A'&&offset<='Z')
		offset-='A'-1;
	if(offset>='a'&&offset<='z')
		offset-='a'-1;
	if(offset<0||offset>26)
		return;
	do
	{
		if(*mem>='A' && *mem<= 'Z')
			*mem=*mem+offset<='Z' ? *mem+offset : 'A'+*mem+offset-'Z'-1;
		if(*mem>='a' && *mem<= 'z')
			*mem=*mem+offset<='z' ? *mem+offset : 'a'+*mem+offset-'z'-1;
	} while(*mem++);	
	return;
}



int caesarcrypt2(char *mem, char offset)
{
	if(offset>='A'&&offset<='Z')
		offset-='A'-1;
	if(offset>='a'&&offset<='z')
		offset-='a'-1;
	if(offset<0||offset>26)
		return;
	do
	{
		if(*mem>='A' && *mem<= 'Z')
			*mem='A'+(((*mem-'A')+offset)%26);
		if(*mem>='a' && *mem<= 'z')
			*mem='a'+(((*mem-'a')+offset)%26);
	} while(*mem++);	
	return;
}

int main(void)
{
	cls();
	printf("*** CAESAR VERSCHLUESSLUNG ***\n");
	char buffer[201], shift, *bptr=buffer;
	printf("PLAINTEXT [MAX 200]: ");
	fgets(buffer,200,stdin);	// MAX 200 Zeichen einlesen
	printf("SHIFT CHAR (A-Z): ");
	scanf("%c",&shift);		
	while((*bptr) != '\n')
		bptr++;			// Char-Array bis Newline durchlaufen
	*bptr=0;			// Newline entfernen (durch 0 ers.) ;)
					// Schlechter Coding-Style ;)
	printf("%s =>",buffer);		// Original-String ausgeben
	caesarcrypt2(buffer, shift);	// Kodieren mit "Modulo26"-Caesar
	printf(" %s\n",buffer);		// Kodierten String ausgeben

	return 0;
}
