// Ta program prebere vsebino Winchester diska, kot jo je poslal HDDump3.asm,
// in naredi sliko, ki jo je mogocxe uporabljati v emulatorju, analizirati s
// hex editorjem, itd.

#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>

FILE* Vhod;
FILE* Izhod;
uint8_t Buffer[3 * (256 + 1)];  // Buffer za 1 sektor; se dekodira na mestu

void Napaka (char* Kaj)
{
	fclose(Vhod);
	fclose(Izhod);

	if(Kaj)
		fputs(Kaj, stderr);

	exit(2);
}

uint8_t Glasuj (uint8_t* Ptr)
{
	uint8_t A;
	uint8_t B;
	uint8_t C;

	A = Ptr[0];
	B = Ptr[1];

	if(A != B)
	{
		// A in B se ne ujemata; C odlocxa.

		C = Ptr[2];
fprintf(stderr, "nestrinjanje, A %d, B %d, C %d\n", A, B, C);
		if(A == C)
			return A;
		else if(B == C)
			return B;
		else
			// Vsi so razlicxni.
			// TODO - s tem se bomo ukvarjali, cxe se bo dejansko zgodilo.
			Napaka("Motnja v prenosu - naredi sxe en dump\n");
	}

	// Cxe A == B, potem je vrednost C itak napacxna in torej nepomembna.
	return A;
}

int main (int argc, char** argv)
{
	size_t Koliko;
	unsigned int iIzvor;
	unsigned int iCilj;
	uint8_t Checksum;
	uint8_t Rezultat;

	if(argc != 3)
	{
		puts("Uporaba: ParseDmp vhod izhod");
		return 0;
	}

	Vhod = fopen(argv[1], "rb");
	if(!Vhod)
	{
		fputs("Vhodne datoteke ni mogocxe odpreti\n", stderr);
		return 1;
	}
	Izhod = fopen(argv[2], "wb");
	if(!Izhod)
	{
		fputs("Izhodne datoteke ni mogocxe odpreti\n", stderr);
		fclose(Vhod);
		return 1;
	}

	for(;;)
	{
		Koliko = fread(Buffer, 1, sizeof(Buffer), Vhod);
		if(!Koliko)
			break;
		if(Koliko < sizeof(Buffer))
		{
			fprintf(
				stderr,
				"%d odvecxnih bajtov; nepopoln dump?\n",
				sizeof(Buffer) - Koliko
			);
			break;
		}

		Checksum = 0;
		iIzvor = 0;
		iCilj = 0;
		while(iIzvor < sizeof(Buffer) - 3 /* brez checksuma */)
		{
//fprintf(stderr, "iIzvor je %d, iCilj je %d\n", iIzvor, iCilj);
			Rezultat = Glasuj(&Buffer[iIzvor]);
			Checksum += Rezultat;
			Buffer[iCilj] = Rezultat;

			iIzvor += 3;
			iCilj++;
		}
//fprintf(stderr, "iIzvor je %d, iCilj je %d\n", iIzvor, iCilj);
		Rezultat = Glasuj(&Buffer[iIzvor]);
		if(Checksum != Rezultat)
		{
			// Izracxunani checksum se ne ujema s Partnerjevim.
			// TODO - s tem se bomo ukvarjali, cxe se bo dejansko zgodilo.
			fprintf(
				stderr,
				"Napacxen checksum na %d; nasx je %d, prebran je %d\n",
				ftell(Vhod) - 3,
				Checksum,
				Rezultat
			);
			//Napaka(NULL);
		}

		if(fwrite(Buffer, 256, 1, Izhod) != 1)
			Napaka("Napaka pri zapisovanju izhoda; disk poln?");
	}

	fclose(Vhod);
	fclose(Izhod);

	return 0;
}
