>>27
The above example is how i separate real code representation:
//====Headers
#define VERSION "Infinity Compressor 1.11 Single number range\n"
//..\gcc -O2 main.c -lmpfr -lgmp -o a.exe
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <float.h>
#include <time.h>
#include <gmp.h> //using libgmp.a
#include <mpfr.h>
//======Types
int i;
#define u1 unsigned char
#define u2 unsigned short
#define u4 unsigned int
#define u8 unsigned long long
#define s1 signed char
#define s2 signed short
#define s4 signed int
#define s8 signed long long
#define f2 short float
#define f4 float
#define f8 double
#define f10 long double
#define v0 void
u8 fsize(u1* filename){
FILE* tfile=fopen(filename,"rb");
if(!tfile){perror(filename);return 0;}
fseek(tfile,0,SEEK_END);
u8 sz=(u8)(ftell(tfile));fclose(tfile);return sz;}
u1* getcontent(u1*filename){//file to buffer
u8 size=fsize(filename);//
if(!size){perror("Zero length content"); return NULL;}
u1* res=malloc(size);
if(!res){perror("Malloc failure");return NULL;}
FILE* inpfile=fopen(filename,"rb");
if(!inpfile){perror("File cannot be read");return NULL;}
u8 findex=(u8)fread(res,1,size,inpfile);fclose(inpfile);
if(findex!=size){perror("size mismatch");return NULL;}
return res;}
v0 readcontent(u1* filename,u1* storage){
if(!filename){perror("Invalid filename"); return;}
u8 inpsize=fsize(filename);
if(!inpsize){perror("File empty");return;}
FILE* in=fopen(filename,"rb");
if(!in){perror(filename);return;}
storage=realloc(storage,inpsize);
if(!storage){perror("Malloc failure");return;}
u8 findex=(u8)fread(storage,1,inpsize,in);
fclose(in);
if(findex!=inpsize){perror("Read size mismatch");return;}}
v0 writecontent(u1* filename,u1* content,u8 size){
FILE* out=fopen(filename,"wb");
if(!out){perror(filename);return;}
u8 findex=(u8)fwrite(content,1,size,out);fclose(out);
if(findex!=size) perror("Write size mismatch");}
v0 buf2mpz(u1* string,mpz_t num,u8 size){
if(!string){perror("NULL string");return;}
if(!num){perror("Invalid mpz_t");return;}
if(!size){perror("Zero-length string");return;}
mpz_import(num,size, 1,1, -1, 0,string);
}
u1* mpz2buf(mpz_t num){
u1* res=malloc( (mpz_sizeinbase(num,16)/2)+2);
mpz_export(res,NULL,1,1,-1,0,num);return res;}
#define loop(loopx,loopy) for(loopx=0;loopx<loopy;loopx++)
#define fextension(string) strrchr(string,'.')?:".???"
#define isbit(xint,ypos) ((xint)&(1<<ypos))
#define frop(x,filename) FILE* x=fopen(filename,"rb")
#define fwop(x,filename) FILE* x=fopen(filename,"wb")
#define outx(x,fil) fwrite(&x,1,sizeof(x),fil);
#define mpz(x) mpz_t x;mpz_init(x);
#define mpf(x) mpfr_t x;mpfr_init(x);
//static array
#define mpfr(x) MPFR_DECL_INIT(x, 53) //returns float
#define DEBUG 1 //debug
#define DEBUG2 1 //symbolics
#define DEBUG3 1 //verbose
/* 635 original x2
MINSUBPOWER POWERPREC SIZE
300 1024 >.1554 bytes
210 > 768 >1755
200 768 >1560
150 >512 > 1441 bytes(best)
110 > 400 >1648
75 < 256 > 1608
*/
#define POWERPREC 1024*8 ///200 //more=slower, more precise
#define FIXEDPOW "1e-100"
#define fdisp(x) puts("");mpf_out_str(stdout,10, 0,x);
//===========MAIN======================
#define setch(o,ch,pos) (o|=ch<<(pos<<1)) // pos 0-3,ch=0-3
#define getbb(o,pos) ((o>>(pos<<1))&3) //get 001100
>>2 &3
#define getb0(b) (b&3)
#define getb1(b) ((b
>>2)&3)
#define getb2(b) ((b
>>4)&3)
#define getb3(b) ((b
>>6)&3)
#define pr MPFR_RNDN //correct
#define prz MPFR_RNDZ //lower to get below target
#define MAXPOW "12"
#define MINPOW "0.01"
#define NUMBERBASE 16
#define BASEADDINT 1
#define BASESUBPOWER "1e100"
#define MAXSUBPOWER "1"
#define MINSUBPOWER "1e-300"// "1e-100"//has to be limit of powerprec
#define SCALEMODMAX "18446744073709551615"
#define SCALEMULT 8*64 // bytes
#define SCALEFACTOR 1000000000 /*no scale*/
#define resetpow mpfr_set_str(Power,"2",10,pr);mpfr_set_str(Powermin,MINPOW,10,pr);mpfr_set_str(Powermax,MAXPOW,10,pr);mpfr_div_2ui(Powermax,Powermax,1,pr);mpfr_set_str(Powerold,"0",10,pr);
#define storehex(pow) ;mpfr_set(powbase,pow,pr);mpfr_out_str(output,NUMBERBASE,0,pow,pr);fprintf(output,"\n");
#define storedelta(pow) ;mpfr_sub(powbase,powbase,Power,pr);mpfr_out_str(output, NUMBERBASE,0,powbase,pr);fprintf(output,"\n");mpfr_set(powbase,pow,pr);
#define store(pow) ;if(first){storehex(pow);first=0;}else{storedelta(pow);};
#define avg(pow) mpfr_add(pow,Powermax,Powermin,pr);mpfr_div_2ui(pow,Power,1,pr);
#define cubepow(pow) ;mpfr_pow(powres,pow,pow,pr);mpfr_pow(Result,pow,powres,pr);;
#define quadpow(pow) ;mpfr_pow(powres,pow,pow,pr);mpfr_pow(powres2,pow,powres,pr);mpfr_pow(Result,pow,powres2,pr);;
#define pentapow(pow) ; ;mpfr_pow(powres,pow,pow,pr);mpfr_pow(powres2,pow,powres,pr);mpfr_pow(powres3,pow,powres2,pr);mpfr_pow(Result,pow,powres3,pr);;
#define logchain(x) ;mpfr_log(Power,low,pr);for(i=0;i<x;i++)mpfr_log(Power,Power,pr);
#define reduce2(a,b,res) ;mpfr_sub(a,a,res,pr);mpfr_sub(b,b,res,pr);
#define swapsave(minmax) mpfr_set(Powerold,Power,pr);mpfr_swap(minmax,Power);
#define disp3 ;if(DEBUG3){mpfr_out_str(stdout,10,0,Power,pr);};
#define disp2 ;if(DEBUG3){mpfr_out_str(stdout,10,0,Result,pr);};
#define SYMBLOW 'X'
#define SYMBHI 'O'
#define LOOPPLUS '+'
#define LOOPMINUS '-'
#define SYM(x) if(DEBUG2)putchar(x);
#define SUCCESS "\nEncoding complete"
#define SYNTAX "Syntax:cmp inputfile [-d=decode]"
#define FIXEDCHUNK 1
#define CHUNKSIZE 1024
#define BADCHUNKSIZE "Chunk size invalid must be:1024"
//========MAIN===
//code is from another compressor i wrote
v0 main(int argc,char**argv){
if(!argv[1]){puts(SYNTAX);exit(1);}
//-----DECODE--TODO-----
if(argv[2] && !strcmp(argv[2],"-d")){//decode Data
FILE* inp=fopen(argv[1],"rb");
if(!inp){perror("No file");exit(2);}
//get filesize
u8 outsize;sscanf(argv[1],"Result.%llu.cmp",&outsize);
if(DEBUG)printf("\nFilesize:%llu",outsize);
u8 bitlen=outsize*8;mpfr_set_default_prec(bitlen);
mpf(Result);mpfr_inp_str(Result,inp, NUMBERBASE,pr);
mpf(Res2);
mpfr_exp2(Res2,Result,pr);
//mpfr_exp10(Result,Result,pr);
//read powers and signs.
//todo
mpz(Z);
mpfr_get_z(Z,Res2,pr);
//mpfr_get_z(Z,Result,pr);
FILE* output=fopen("Decode.dat","wb");
mpz_out_str(stdout,16,Z);
mpz_out_raw(output, Z);//slightly larger
//fwrite(&out,1,outsize,output);//end: does not work
exit(10);
}
//------INPUT--------
if(DEBUG3)printf(VERSION);
/*
>> MPFR_RNDN: round to nearest (roundTiesToEven in IEEE 754-2008),
MPFR_RNDZ: round toward zero (roundTowardZero in IEEE 754-2008),
MPFR_RNDU: round toward plus infinity (roundTowardPositive in IEEE 754-2008),
MPFR_RNDD: round toward minus infinity (roundTowardNegative in IEEE 754-2008),
MPFR_RNDA: round away from zero.
*/
u8 inpsize=fsize(argv[1]);
if(FIXEDCHUNK && inpsize!=CHUNKSIZE){puts(BADCHUNKSIZE);exit(8);}
u8 bitlen=inpsize*8;
s1* filename=malloc(120);
sprintf(filename,"Result.%d.cmp",inpsize);
FILE* output=fopen(filename,"wb");
s4 check,checklow,checkhi,checkold;
if(!inpsize){perror("input size invalid");return;};
u1* input=getcontent(argv[1]);
//convert to mpz
mpfr_set_default_prec( bitlen);
mpz(Z);buf2mpz(input,Z,inpsize);
mpf(median);//Z->median
mpfr_set_z(median,Z,pr);
//base =1+ 1e-100
mpf(scalemodmax);//1/8 filesize max: expand window
mpf(scalemod);//stored scalemod(final)
mpfr_set_str(scalemodmax,SCALEMODMAX,10,pr);
mpfr_mul_2ui(scalemodmax,scalemodmax,SCALEMULT,pr);
mpfr_t powbase;mpfr_init2(powbase,POWERPREC);
mpfr_t base;mpfr_init2(base,POWERPREC);
mpfr_set_str(base,BASESUBPOWER,10,pr);//same
mpfr_t baseadd;mpfr_init2(baseadd,POWERPREC);
mpfr_set_str(baseadd,FIXEDPOW,10,pr);
mpfr_add_ui(base,base,BASEADDINT,pr);
check=mpfr_cmp_ui (base,1);
if(check==0){puts("Invalid precision");exit(1);}
//create initial bounds
mpf(low);mpfr_set(low,median,pr);
//mpfr_sub(low,low,scalemodmax,pr);
mpfr_mul_2ui(low,low,SCALEFACTOR,pr);
mpf(hi);mpfr_set(hi,median,pr);
mpfr_add_ui(hi,hi,1,pr);
//mpfr_add(hi,hi,scalemodmax,pr);
mpfr_mul_2ui(hi,hi,SCALEFACTOR,pr);
//search for closest base match to window
mpf(Result);u4 first=1;// delta used(delta:11*-8 bytes)
mpfr_t powsub;mpfr_init2(powsub,POWERPREC);
mpfr_set_str(powsub,MINSUBPOWER,10,pr);
if(mpfr_cmp_si(powsub,0)<1){puts("Minimum precision required <e-100");exit(23);}
mpfr_t powres3;mpfr_init2(powres3,POWERPREC*8);
mpfr_t powres2;mpfr_init2(powres2,POWERPREC*4);
mpfr_t powres;mpfr_init2(powres,POWERPREC*2);
mpfr_t Power;mpfr_init2(Power,POWERPREC);
mpfr_t Powermin;mpfr_init2(Powermin,POWERPREC);
mpfr_t Powermax;mpfr_init2(Powermax,POWERPREC);
mpfr_t Powerold;mpfr_init2(Powerold,POWERPREC);
resetpow;//mpfr_atan is the range for Infinity-> pi <>-pi
loop://find one which fits just below window:low
avg(Power);
pentapow(Power);
check=mpfr_cmp(Result,low);//has to be below
checkhi=mpfr_cmp(Result,hi);//or inside window
if(mpfr_cmp(Powerold,Power)==0){//final match
if(check<0){//below, stalled::increase precision!
SYM(SYMBLOW);;reduce2(low,hi,Result);storehex(Power);resetpow;goto loop;}else{//above or inside?
SYM(SYMBHI);;;//reduce result.
if(checkhi>0){reduce2(Powermin,Powermax,powsub);
goto loop;}else{goto end;}}}
if(check>0){SYM(LOOPPLUS);
swapsave(Powermax);goto loop;};//if max found set powermax
if(check<0){SYM(LOOPMINUS);swapsave(Powermin);goto loop;};
//match found;exit
end:;storehex(Power);puts(SUCCESS);;}