Sprinter-Core/src/bin/Altera0pak.c
Anatoliy Belyanskiy 0271ac3713 Creation
2023-06-12 05:56:21 +10:00

89 lines
1.9 KiB
C

/* Altera zero packer and depacker by Shaos (2017,2021) */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char** argv)
{
int b,i,n;
long l,maxzero,nonzero,nzero,sz,current=0;
FILE *f,*fo;
if(argc<3)
{
printf("\n\t%s imgfilename packedfilename\nor",argv[0]);
printf("\n\t%s -d packedfilename depackedfile\n",argv[0]);
return 0;
}
if(argv[1][0]=='-' && argv[1][1]=='d')
{
f = fopen(argv[2],"rb");
if(f==NULL) return -1;
if(argc==3) fo = fopen("Altera.bin","wb");
else fo = fopen(argv[3],"wb");
if(fo==NULL){fclose(f);return -2;}
fseek(f,0,SEEK_END);
sz = ftell(f);
printf("Size=%li\n",sz);
fseek(f,0,SEEK_SET);
printf("Depack %s (size=%li)\n",argv[2],sz);
for(l=0;l<sz;l++)
{
b = fgetc(f);
if(b) fputc(b,fo);
else
{
l++;
n = fgetc(f);
for(i=0;i<n;i++) fputc(0,fo);
}
}
fclose(fo);
fclose(f);
return 0;
}
f = fopen(argv[1],"rb");
if(f==NULL) return -1;
fseek(f,0,SEEK_END);
sz = ftell(f);
printf("Size=%li\n",sz);
fseek(f,0,SEEK_SET);
fo = fopen(argv[2],"wb");
if(fo==NULL){fclose(f);return -2;}
maxzero = nonzero = current = nzero = 0;
for(l=0;l<sz;l++)
{
b = fgetc(f);
if(b || nzero==255)
{
if(nzero)
{
if(nzero>maxzero) maxzero=nzero;
current+=2;
fputc(0,fo);
fputc(nzero,fo);
}
if(b)
{
nzero = 0;
nonzero++;
current++;
fputc(b,fo);
}
else nzero = 1;
}
else nzero++;
}
if(nzero)
{
if(nzero>maxzero) maxzero=nzero;
current+=2;
fputc(0,fo);
fputc(nzero,fo);
}
printf("maxzero=%li nonzero=%li current=%li\n",maxzero,nonzero,current);
fclose(fo);
fclose(f);
return 0;
}