#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include "lendefs.h"
#include "relolz91.h"
int main(int argc, char**argv)
{
	extraname=malloc(strlen(argv[1]));
	if (strlen(argv[1])<3){fprintf(stderr,"ending of input file missing, must end with exe or com");return 1;}
	strcpy(extraname,argv[1]);
	extraname[strlen(extraname)-3]='c';
	extraname[strlen(extraname)-2]='o';
	extraname[strlen(extraname)-1]='m';
	targetname=malloc(strlen(argv[1]));
	strcpy(targetname,argv[1]);
	modifymode=3;
	relomode=1;
	infile=fopen(targetname,"r");
	outfile=fopen(extraname,"w");
	inattr.headersize=0x20;
	inattr.basic=inattr.headersize+getword(0x16)*(16);
	inattr.entrypnt=inattr.basic+getword(0x14);
	inattr.expansion=getword(inattr.basic+0xA)*(16);
	inattr.absauxsize=getword(inattr.basic+0xC);
	inattr.exesize=(getword(4)-1)*(0x200)+getword(2);
	inattr.jumppoint=inattr.basic+0xFC;
	inattr.relotab=inattr.basic+0x158;
	inattr.contentsize=inattr.basic-inattr.headersize;
	inattr.stacksegment=getword(0xe);
	inattr.trueentry_offset=getword(inattr.basic);
	inattr.trueentry_segment=getword(inattr.basic+0x2);
	inattr.truestack_offset=getword(inattr.basic+0x4);
	inattr.truestack_segment=getword(inattr.basic+0x6);
	relocount=0;
	fseek(infile,0,SEEK_SET);
	for (ilv1=0;ilv1<inattr.headersize;ilv1++)
	{
		fread(&ihv1,1,1,infile);
		fwrite(&ihv1,1,1,outfile);
	}
	getrelo();
	relotable_block=relocount*(4);
	relotable_kitt=0;
	if ((relotable_block%16)>0)
	{
		relotable_kitt=16-(relotable_block%16);
		relotable_block=relotable_block+relotable_kitt;
		ihv1=0;
		for (ilv1=0;ilv1<relotable_kitt;ilv1++)
			fwrite(&ihv1,1,1,outfile);
	}
	fseek(infile,inattr.headersize,SEEK_SET);
	for (ilv1=inattr.headersize;ilv1<inattr.basic;ilv1++)
	{
		fread(&ihv1,1,1,infile);
		fwrite(&ihv1,1,1,outfile);
	}
	ihv1=0;
	for (ilv1=0;ilv1<inattr.expansion;ilv1++)
		fwrite(&ihv1,1,1,outfile);
//were at inattr.basic+inattr.expansion;
	ilv1=inattr.basic;
	do
	{
		fread(&ihv1,1,1,infile);
		fwrite(&ihv1,1,1,outfile);
	}
	while (!feof(infile));
	outattr=inattr;
	outattr.headersize=outattr.headersize+relotable_block;
	outattr.basic=inattr.basic+inattr.expansion+relotable_block;
	outattr.exesize=inattr.exesize+inattr.expansion+relotable_block;
	if (relomode==1)
	{
		outattr.exesize=outattr.basic;
	}
	outattr.entrypnt=inattr.entrypnt+inattr.expansion+relotable_block;
	outattr.contentsize=inattr.contentsize+inattr.expansion;
	printf("basis: %X\n",inattr.basic);
	blockcount=outattr.contentsize/blocksize;
	addiblock=outattr.contentsize%blocksize;
	printf("Zahl der Blöcke: %i\n",blockcount);
	printf("Zusätzliche Bytes: %i\n",addiblock);
	putword(4,(outattr.exesize/0x200)+1);
	putword(2,outattr.exesize%0x200);
	putword(0x8,outattr.headersize/16);
	putword(0x16,((outattr.entrypnt-outattr.headersize)/16));
	putword(0x14,((outattr.entrypnt-outattr.headersize)%16));
	fseek(outfile,outattr.entrypnt,SEEK_SET);
	for (ilv1=0;ilv1<=0x1c;ilv1++)
	{
		fwrite(&(initdummy[ilv1]),sizeof(initdummy[ilv1]),1,outfile);
	}
	if (modifymode==3)
	{
		saverattr=outattr;
		fseek(outfile,saverattr.headersize,SEEK_SET);
		fseek(infile,inattr.headersize,SEEK_SET);
		innercode();
		fclose(infile);
		fseek(outfile,outattr.basic+0x1b,SEEK_SET);
		for (ilv1=0;ilv1<skippercoresize;ilv1++)
			fwrite(&(skippercore[ilv1]),1,1,outfile);
		ihv1=0x90;
		for (ilv1=skippercoresize;ilv1<skippersize;ilv1++)
			fwrite(&ihv1,1,1,outfile);
	}
	if (relomode==1)
	{
		putword(0xe,outattr.truestack_segment);
		putword(0x10,outattr.truestack_offset);
		putword(0x14,outattr.trueentry_offset);
		putword(0x16,outattr.trueentry_segment);
		putword(0x18,0x20);//start der relotabelle
		putword(0x6,relocount);
		fseek(outfile,outattr.basic,SEEK_SET);
		ftruncate(fileno(outfile),outattr.basic);
	}
	fclose(outfile);
	return 0;
}
