#include "caesar.h"

/*
	s -> path source
	d -> path destination
	key -> key of encryption
	This function encrypt data
*/
int cryptCaesar(const char *s, const int key, const int countCharact, char *bufferDst) {
	char *buffer;
	int i;
	int error = countCharact;
	char c = 0;

	if(error == -1) return error;

	/* Allocation dynamique */
	buffer = malloc(countCharact + 1); /* + 1 for '\0' */

	/* Copy the data of file into the buffer[] */
	error = copyFile(s, buffer);
	if(error != 0) return error;

	/********* Encryption **********/
	for(i = 0; i < countCharact; i++) {
		int val = 0;
		/* For characters of A to Z */
		if(buffer[i] >= 'A' && buffer[i] <= 'Z') {
			c = buffer[i] - 'A';
			val = ((c + key) % 26) + 'A';
		}
		/* For characters of 'a' to 'z' */
		else if(buffer[i] >= 'a' && buffer[i] <= 'z') {
			c = buffer[i] - 'a';
				val = ((c + key) % 26) + 'A';
		}
		/* For others characters */
		else val = buffer[i];

		bufferDst[i] = val;
	}

	bufferDst[i] = '\0';

	/* Freedom the memory */
	free(buffer);

	return error;
}
/*
	s -> path source
	d -> path destination
	key -> key of decryption
	This function decryption by Cesar
*/
int decryptCaesar(const char *s, const int key, const int countCharact, char *bufferDst) {
	int error = countCharact;
	char *buffer;
	int i;

	if(error == -1)
		return error;

	/* Allocation dynamique */
	buffer = malloc(countCharact + 1); /* +1 for '\0' */

	/* Copy the data from file into buffer */
	error = copyFile(s, buffer);
	if(error != 0) return error;

	/********* Decryption **********/
	for(i = 0; i < countCharact; i++) {
		int val = 0;
		/* buffer[i] >= 'A' AND buffer[i] <= 'Z' */
		if(buffer[i] >= 65 && buffer[i] <= 90) {
			val = buffer[i] - key;
			/* val < 'A' */
			if(val < 65)
				val = val + 26;
		}
		else
			val = buffer[i];

		bufferDst[i] = val;
	}
	bufferDst[i] = '\0';

	/* Freedom the memory */
	free(buffer);

	return error;
}