#include<stdio.h>
#include<fcntl.h>
#include<unistd.h>



char tabla[] = {'A','B','C','D','E','F','G','H','I','J','K','L',
			'M','N','O','P','Q','R','S','T','U','V','W','X','Y',
			'Z','a','b','c','d','e','f','g','h','i','j','k','l',
			'm','n','o','p','q','r','s','t','u','v','w','x','y',
			'z','0','1','2','3','4','5','6','7','8','9','+','/',
			'='};



void codif_b64( char bytes[], char resp[], int leidos)
{

	char grupos[4];
	
			
	grupos[0] = (bytes[0] & 0xfc) >> 2;
	grupos[1] = (( bytes[0] & 0x03 ) << 4) | ( ( bytes[1] & 0xf0) >> 4 );
	grupos[2] = (( bytes[1] & 0x0f ) << 2) | ( ( bytes[2] & 0xc0) >> 6 );
	grupos[3] = bytes[2] & 0x3f;

	if( leidos == 1){
		grupos[3] = 64;
		grupos[2] = 64;
		grupos[1] = grupos[1] & 0xfc00;
	}else if( leidos == 2){
		grupos[3] = 64;
		grupos[2] = grupos[2] & 0xfc;
	}
	
	resp[0] = tabla[ grupos[0]];
	resp[1] = tabla[ grupos[1]];
	resp[2] = tabla[ grupos[2]];
	resp[3] = tabla[ grupos[3]];

}
			
int main( int argc, char **argv)
{
	char aux[3];
	char sal[4];
	char *cabecera;
	char *origen, *destino;
	int f_lect,f_esc,num_leidos=3,num_bloques=0;
	int arg;


	
	cabecera = (char *) malloc(64);
	origen = (char *) malloc(512);
	destino = (char *) malloc(512);
	
	while( (arg = getopt( argc, argv,"ad:o:")) != -1){
	    switch( arg){
		case 'a': fprintf(stderr,"fb64 -d destino -o origen\n");
			  break;
		case 'd': destino = optarg;
			  break;
		case 'o': origen = optarg;
			  break;
		case '?': fprintf(stderr,"fb64 -d destino -o origen\n");
			  break;

	    }
		

	}

	
	if( (f_lect = open(origen,O_RDONLY)) < 0 )
		perror("open1");
	bzero(cabecera,64);
	sprintf(cabecera,"begin-base64 644 %s\n",destino);
	fprintf(stdout,"%s",cabecera);

	while( num_leidos == 3){

		num_leidos = read(f_lect, aux, 3);
		codif_b64(aux,sal,num_leidos);
		fprintf(stdout,"%c%c%c%c",sal[0],sal[1],sal[2],sal[3]);
		num_bloques ++;
		if( (num_bloques % 15) == 0) fprintf(stdout,"\n");
	}
	fprintf(stdout,"\n====\n");	
}

	
	
	
	
