PROGRAM CodeBreakerHelper;

{Declarations module}
CONST MessMax = 255;
	  CharRange = 95;
	  TopCharCode = 126;
	  MaxKeys = 10;
	  
TYPE Message = ARRAY[1..MessMax] OF CHAR;
	 KeyCode = ARRAY[1..MaxKeys] OF INTEGER;
	 
VAR K, i, Count, NumKeysNeeded : INTEGER;
	FileName1 : STRING;
	InFile : TEXT;
	Mess, NewMess : Message;
	Key : KeyCode;
	Letter : CHAR;
	
PROCEDURE Decrypt(Shift : INTEGER; VAR Code : CHAR);
VAR NumCode : INTEGER;
BEGIN
	NumCode := ORD(Code) + Shift;
	IF NumCode > TopCharCode THEN
		NumCode := NumCode - CharRange;
	Code := CHR(NumCode);
END;

BEGIN  {program}

{File name prompt module}
WRITE('Enter the name of the file you would like to decrypt : ');
READLN(FileName1);

{Read File Module}
RESET(InFile, FileName1);
i := 0;
WHILE NOT EOF(InFile) DO
	BEGIN
		i := i + 1;
		READ(InFile, Mess[i]);
	END;
CLOSE(InFile);
WRITELN;

{Key code prompt module}
WRITE('Enter the number of encryption keys (maximum of 10) : ');
READLN(NumKeysNeeded);
WRITELN;
WRITELN('***WARNING*** Encryption keys must be entered in the proper order.');
FOR Count := 1 TO NumKeysNeeded DO
	BEGIN
		WRITE('Key number ', Count:1, ': ');
		READLN(Key[Count]);
	END;
	
{Decryption module}
FOR Count := 1 TO i DO
	BEGIN
		Letter := Mess[Count];
		Decrypt(Key[(((Count - 1) MOD NumKeysNeeded) + 1)], Letter);
		NewMess[Count] := Letter;
		
	END;
	
{Decrypted message display module}
WRITELN('The decrypted message is : ');
FOR Count := 1 TO i DO
	WRITE(NewMess[Count]);
WRITELN;

END.  {program}