/**********************************************************************
 * effectue un chiffrement de Vigenere
 *
 * Usage : vigenere [-de] <cle> <in_file> [<out_file>]
 **********************************************************************/
#include<stdio.h>

int main(int argc, char *argv[])
{
        unsigned int encrypt = 0;
  	FILE *fi,*fo;
	unsigned char* key;
        size_t key_len;

	/*Valid command line ???*/
	if (argc!=4 && argc!=5) {
          fprintf(stderr,"Usage : vigenere [-de] <cle> <in_file> [<out_file>]\n");
          return 1;
        }

	if (argv[1][1] == 'd')
          encrypt = 0;
        else if (argv[1][1] == 'e')
          encrypt = 1; 
        else {
          fprintf(stderr,"Usage : vigenere [-de] <cle> <in_file> [<out_file>]\n");
          return 1;
        }

	/*open files*/
	if ((fi=fopen(argv[3],"rb"))==NULL) {
		fprintf(stderr,"can't open input file\n");
	  	return 1;
  	}
	if (argc == 5){
	  	if ((fo=fopen(argv[4],"wb"))==NULL){
			fprintf(stderr,"can't open output file\n");
	  		return 1;
	  	}
	} else {
               fo = stdout;
	}

        key = argv[2];
  	key_len = strlen(key);

        {
          int i=0;
          unsigned int c;
          while ((c = getc(fi)) != EOF){
            if (encrypt) {
              fprintf(fo,"%c",(c+key[i]) % 256);
            } else {
              fprintf(fo,"%c",(c-key[i]+256) % 256);
            }
            i = (i+1) % key_len;
          }
        }
        fclose(fi);
  	fclose(fo);

  	return 0; 
}
