/* Program name: vcode
   Author      : S. MANDON
   Date        :   03 01 2007
   codage/decodage selon l'algo de Blaise de Vigenère,
   exploitant la "rotation" sur des char.
   */

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

void erreurecriture(void)            ;
void erreurlire(void)                ;
void printhelp(void)                 ;
void codage(char *, char *, char *)  ;
void decodage(char *, char *, char *);


void erreurecriture()
{
   printf("WARNING: Unable to write file\n");
   exit(1);
}

void erreurlire()
{
   printf("WARNING: Unable to read file\n");
   exit(1);
}

void printhelp()
{
   printf("Author: Stan Mandon (smandon@hotmail.com)\n");
   printf("SYNTAX:\n");
   printf("vcode <file to read> <file to write> e(ncrypt)|d(ecrypt) \"key\"\n");
   printf("Example (encrypting): vcode message.txt encryptedmessage.txt e \"what a nice key !\"\n");
   printf("Example (decrypting): vcode encryptedmessage.txt decryptedmessage.txt d \"what a nice key !\"\n");
   printf("Enjoy !\n");
   exit(1);
}

void codage(char *filetoread, char *filetowrite, char *clef)
{
   FILE *lire, *ecrire        ;
   int lgclef = strlen(clef)  ;
   unsigned int indiceclef = 0;
   unsigned char c            ;
   unsigned long t1, t2;
   time_t tt;

   lire = fopen(filetoread, "rb");
   if(lire == NULL) erreurlire();
   ecrire = fopen(filetowrite, "wb");
   if(ecrire == NULL) erreurecriture();

   t1 = time(&tt);
   for(  ; !feof(lire) ;  )
   {
      if(indiceclef >= (lgclef)) indiceclef = 0;
      c = fgetc(lire) + clef[indiceclef];
      if(!feof(lire)) fputc((int)c, ecrire);
      indiceclef++;
   }
   t2 = time(&tt);
   fclose(ecrire);
   fclose(lire);
   printf("Encoding/decoding duration: %ld seconds  (%f) minutes\n", (t2-t1), (float)(((float)t2-(float)t1)/(float)60));
}

void decodage(char *filetoread, char *filetowrite, char *clef)
{
   FILE *lire, *ecrire        ;
   int lgclef = strlen(clef)  ;
   unsigned int indiceclef = 0;
   unsigned char c            ;
   unsigned long t1, t2;
   time_t tt;

   lire = fopen(filetoread, "rb");
   if (lire == NULL) erreurlire();
   ecrire = fopen(filetowrite, "wb");
   if(ecrire == NULL) erreurecriture();

   t1 = time(&tt);
   for(  ; !feof(lire) ;  )
   {
      if(indiceclef >= (lgclef)) indiceclef = 0;
      c = fgetc(lire) - clef[indiceclef];
      if(!feof(lire)) fputc((int)c, ecrire);
      indiceclef++;
   }
   t2 = time(&tt);
   fclose(ecrire);
   fclose(lire);
   printf("Encoding/decoding duration: %ld seconds  (%f) minutes\n", (t2-t1), (float)(((float)t2-(float)t1)/(float)60));
}

int main(int argc, char *argv[])
{
   if(argc < 5) printhelp();
   if((strcmp(argv[3], "e")) && (strcmp(argv[3], "d"))) printhelp();
   if(!strcmp(argv[3], "e")) codage(argv[1], argv[2], argv[4]);
   if(!strcmp(argv[3], "d")) decodage(argv[1], argv[2], argv[4]);

   printf("Congratulations !\n");
   printf("OPERATION SUCCESSFUL\n");
   return 0;
}

