///////////////////////////////////////////////////////////
// BDP-S390 Firmware Modification Code:
//    Lookup Table Decoding
//--------------------------------------------------------
// Copyright (C) 2013 Malcolm Stagg
///////////////////////////////////////////////////////////

#include <stdio.h>
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <string.h>

using namespace std;

unsigned char lut[256];

#define LUTNAME "hex_substitution_01"
#define INFILE "MSB11-FW.ID"
#define OUTFILE "MSB11-FW.ID.dec"

int main(int argc, char * argv[]) {
	ifstream flut, infile;
	ofstream outfile;
	
	bool encode = false;
	
	if (argc != 5) {
		cout << "Usage: lut [(D)ecode/(E)ncode] [input filename] [lut filename] [output filename]" << endl;
		exit(1);
	}
	if (strcasecmp(argv[1], "D")==0)
		encode = false;
	else if (strcasecmp(argv[1], "E")==0)
		encode = true;
	else {
		cout << "Usage: lut [(D)ecode/(E)ncode] [input filename] [lut filename] [output filename]" << endl;
		exit(1);
	}
	char * infilename = argv[2];
	char * lutname = argv[3];
	char * outfilename = argv[4];

	flut.open(lutname);

	if (!flut) {
		cout << "cannot open LUT file" << endl;
		exit(1);
	}

	cout << "opened LUT..." << endl;
	int val1, val2;
	flut >> hex >> val1 >> val2;
	while (flut) {
		//cout << hex << val1 << " " << val2 << endl;
		if (!encode)
			lut[val1] = val2;
		else
			lut[val2] = val1;
		flut >> hex >> val1 >> val2;
	}
	flut.close();
	cout << "LUT complete!" << endl;
		
	infile.open(infilename, ifstream::binary);
	outfile.open(outfilename, ifstream::binary);

	if (!infile) {
		cout << "cannot open input file" << endl;
		exit(1);
	}
	if (!outfile) {
		cout << "cannot open output file" << endl;
		exit(1);
	}

	cout << "writing output file..." << endl;
	unsigned char c1, c2;
	c1 = infile.get();
	while (infile) {
		c2 = lut[c1];
		outfile.put(c2);
		c1 = infile.get();
	}
	infile.close();
	outfile.close();
	cout << "complete!" << endl;
}
