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

#include "bfcode.h"

char version[]={"$VER: BFDecode V1.0 (" __DATE__ ")"};

#define ISL(x) ((x)>='a' && (x)<='z')

FILE *infile,*outfile;

char buffer[256];

int readch(void)
{
	int ch;

	ch=fgetc(infile);
	if(ch==EOF) {
		printf("eof\n");
		exit(0);
	}
	return(ch);
}

long decodenibble(char *sym)
{
        int c;

	for(c=0; c<16; c++) {
		if(!strcmp(codetab[c],sym)) return(c);
	}
	printf("Decode-Error @ \"%s\"\n",sym);
	exit(10);
}

void readsym(void)
{
        int c=0,ch;

	do { ch=readch(); } while(!ISL(ch));
	buffer[c++]=ch;
	do { ch=readch(); buffer[c++]=ch; } while(ISL(ch));
	buffer[c-1]=0;
}

void main(int argc, char **argv)
{
   int c1,c2;

   printf("\x1b[1m%s\x1b[0m\n",&version[6]);

   if(argc!=3) {
      printf("Usage: %s infile outfile\n",argv[0]);
      exit(0);
   }
   if(!(infile=fopen(argv[1],"r"))) {
      printf("can't open input file %s\n",argv[1]);
      exit(10);
   }
   if(!(outfile=fopen(argv[2],"w"))) {
      printf("can't open output file %s\n",argv[2]);
      exit(10);
   }

	for(;;) {
                readsym();
		c1=decodenibble(buffer);
		readsym();
		c2=decodenibble(buffer);
                fputc(c1+(c2<<4),outfile);
	}
}
