
/* 
	Base64-gyel kódolt állomány dekódolása
	stdin-ről stdout-ra.
	gg630504.hg9ieg.2009-10-05
	http://en.wikipedia.org/wiki/Base64
	linux.ubuntu.gcc
*/

#include <stdio.h>

int		mcKodtablaMcMp[256]; /* -1: nem base64; egyébként az érték */
int		iBe;		/* -1: nem base64; 0..2: index */

 /* kezdeti értékek beállítása --------------------------------------*/
void		VKezdV( void );
void		VKezdV( void )
 {
 int		i;
 char		szKod[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

 for( i = 0; i<256; ++i )
	mcKodtablaMcMp[i] = -1;
 for( i = 0; szKod[i]>0; ++i )
	mcKodtablaMcMp[szKod[i]] = i;
 iBe = -1;
 }

 /* dekódoló --------------------------------------------------------*/
int main()
 {
 int		mcBe;		/* beolvasott metakarakter */
 int		mcKod;		/* Kodtabla aktuális elemének értéke */
 char		mcKi;		/* dekódolt karakter(rész) */

 VKezdV();

 while( (mcBe = fgetc( stdin )) >=0 )
	{
	mcKod = mcKodtablaMcMp[mcBe];
	if( mcKod<0 )
		{ /* nem base64 karakter */
		if( mcBe=='=' && iBe>=1 ) 
			{ /* de 4-es csoport vége: nem kell kiírni */
			switch( iBe ) {
			case 1:			
				iBe = 2;
				break;
			case 2:			
				iBe = -1; 
				break;
				}
			}
		else	{
			iBe = -1;
			fputc( mcBe, stdout ); 
			}
		}
	else	{
		switch( iBe ) {
		case -1:
			mcKi = mcKod<<2;
			iBe = 0;
			break;
		case 0:
			mcKi |= mcKod>>4;
			fputc( mcKi, stdout );
			mcKi = mcKod<<4;
			iBe = 1;
			break;
		case 1:
			mcKi |= mcKod>>2;
			fputc( mcKi, stdout );
			mcKi = mcKod<<6;
			iBe = 2;
			break;
		case 2:
			mcKi |= mcKod;
			fputc( mcKi, stdout );
			iBe = -1; 
			break;
			}
		}
	}

 return( 0 );
 }

 /* vége */

