#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <stdio.h>
#include <memory.h>
int main(int argc,char* argv[])
{
FILE *file;
unsigned char *src,*dst;
int i,pd,sec,off,sum,size,out_size,blocks,data_size;
if(argc<2)
{
printf("Error: No input file\n");
return 1;
}
file=fopen(argv[1],"rb");
if(!file)
{
printf("Error: Can't open file\n");
return 1;
}
fseek(file,0,SEEK_END);
size=ftell(file);
fseek(file,0,SEEK_SET);
src=(unsigned char*)malloc(size);
fread(src,size,1,file);
fclose(file);
if(memcmp(src,"SINCLAIR",8))
{
printf("Error: Wrong format\n");
free(src);
return 1;
}
sec=0;
off=9;
for(i=0;i<src[8];i++)
{
sec+=src[off+13];
off+=14;
}
data_size=sec<<8;
blocks=sec/255;
if(sec%255) blocks++;
dst=(unsigned char*)malloc(size);
memcpy(dst,"SINCLAIR",8);
dst[8]=blocks;
pd=9;
for(i=0;i<blocks;i++)
{
if(!i)
{
memcpy(&dst[pd],&src[9],14);
}
else
{
memcpy(&dst[pd],"data ",8);
dst[pd+8]=i-1+'0';
dst[pd+9]=0;
dst[pd+10]=0;
dst[pd+11]=0;
dst[pd+12]=0;
}
dst[pd+13]=sec>255?255:sec;
sec-=255;
pd+=14;
}
memcpy(&dst[pd],&src[off],data_size);
pd+=data_size;
free(src);
sum=0;
for(i=0;i<pd;i++) sum+=dst[i];
dst[pd++]=sum&255;
dst[pd++]=(sum>>8)&255;
dst[pd++]=(sum>>16)&255;
dst[pd++]=(sum>>24)&255;
out_size=pd;
file=fopen(argv[1],"wb");
if(!file)
{
printf("Error: Can't create file\n");
free(dst);
return 1;
}
fwrite(dst,out_size,1,file);
fclose(file);
free(dst);
}