// This source and compression method apply to GNU General Public License. // Copyright (C) January , 2011 and later by Jasenko Dzinleski // This program is free software; you can redistribute it // and/or modify it under the terms of the GNU General Public License as // published by the Free Software Foundation; either version 2 of the // License, or (at your option) any later version. // This program is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // General Public License for more details. // You should have received a copy of the GNU General Public License along // with this program; if not, write to the Free Software Foundation, Inc., // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // // // written by Dzinleski Jasenko January , 14 , 2011 // // // to Dusica and Dzinleski Borce // // #include #include #include char infn[256]="War_and_Peace_NT.txt"; char outfn[256]="t_.txt"; char out1fn[256]="1_.mar"; char out2fn[256]="2_.mar"; char out3fn[256]="3_.mar"; char out4fn[256]="4_.mar"; FILE *f1,*f2,*f3,*f4,*f5,*f6; int ba16[16][16][16][16][2]; int ba16i=0; int ba16_[16][16][16][16][3]; int ba16i_=0; __int64 fc=0; int bl08[16][256]; int bl08i=0; int dn[0xffff][2]; int dni=0; bool bt32_1[32]; int bt32i_1=0; bool bt32_2[32]; int bt32i_2=0; __int64 bitc=0,bc=0,fb=0; int bytc=0,bytc1=0; bool df=false; bool nf=false; bool o_f=false; char c_l[256]="{[--]}{[hh][ee][cc][dd]}{[AZ][az][09][__][ ][..]}"; void pr32_(long d,bool b_[32],int b_i) { b_i=0; if((((((d&0xff000000)>>24)<<24)>>31)&0x1)==1){b_[b_i]=true;++b_i;}else{b_[b_i]=false;++b_i;} if((((((d&0xff000000)>>24)<<25)>>31)&0x1)==1){b_[b_i]=true;++b_i;}else{b_[b_i]=false;++b_i;} if((((((d&0xff000000)>>24)<<26)>>31)&0x1)==1){b_[b_i]=true;++b_i;}else{b_[b_i]=false;++b_i;} if((((((d&0xff000000)>>24)<<27)>>31)&0x1)==1){b_[b_i]=true;++b_i;}else{b_[b_i]=false;++b_i;} if((((((d&0xff000000)>>24)<<28)>>31)&0x1)==1){b_[b_i]=true;++b_i;}else{b_[b_i]=false;++b_i;} if((((((d&0xff000000)>>24)<<29)>>31)&0x1)==1){b_[b_i]=true;++b_i;}else{b_[b_i]=false;++b_i;} if((((((d&0xff000000)>>24)<<30)>>31)&0x1)==1){b_[b_i]=true;++b_i;}else{b_[b_i]=false;++b_i;} if((((((d&0xff000000)>>24)<<31)>>31)&0x1)==1){b_[b_i]=true;++b_i;}else{b_[b_i]=false;++b_i;} if((((((d&0x00ff0000)>>16)<<24)>>31)&0x1)==1){b_[b_i]=true;++b_i;}else{b_[b_i]=false;++b_i;} if((((((d&0x00ff0000)>>16)<<25)>>31)&0x1)==1){b_[b_i]=true;++b_i;}else{b_[b_i]=false;++b_i;} if((((((d&0x00ff0000)>>16)<<26)>>31)&0x1)==1){b_[b_i]=true;++b_i;}else{b_[b_i]=false;++b_i;} if((((((d&0x00ff0000)>>16)<<27)>>31)&0x1)==1){b_[b_i]=true;++b_i;}else{b_[b_i]=false;++b_i;} if((((((d&0x00ff0000)>>16)<<28)>>31)&0x1)==1){b_[b_i]=true;++b_i;}else{b_[b_i]=false;++b_i;} if((((((d&0x00ff0000)>>16)<<29)>>31)&0x1)==1){b_[b_i]=true;++b_i;}else{b_[b_i]=false;++b_i;} if((((((d&0x00ff0000)>>16)<<30)>>31)&0x1)==1){b_[b_i]=true;++b_i;}else{b_[b_i]=false;++b_i;} if((((((d&0x00ff0000)>>16)<<31)>>31)&0x1)==1){b_[b_i]=true;++b_i;}else{b_[b_i]=false;++b_i;} if((((((d&0x0000ff00)>>8)<<24)>>31)&0x1)==1){b_[b_i]=true;++b_i;}else{b_[b_i]=false;++b_i;} if((((((d&0x0000ff00)>>8)<<25)>>31)&0x1)==1){b_[b_i]=true;++b_i;}else{b_[b_i]=false;++b_i;} if((((((d&0x0000ff00)>>8)<<26)>>31)&0x1)==1){b_[b_i]=true;++b_i;}else{b_[b_i]=false;++b_i;} if((((((d&0x0000ff00)>>8)<<27)>>31)&0x1)==1){b_[b_i]=true;++b_i;}else{b_[b_i]=false;++b_i;} if((((((d&0x0000ff00)>>8)<<28)>>31)&0x1)==1){b_[b_i]=true;++b_i;}else{b_[b_i]=false;++b_i;} if((((((d&0x0000ff00)>>8)<<29)>>31)&0x1)==1){b_[b_i]=true;++b_i;}else{b_[b_i]=false;++b_i;} if((((((d&0x0000ff00)>>8)<<30)>>31)&0x1)==1){b_[b_i]=true;++b_i;}else{b_[b_i]=false;++b_i;} if((((((d&0x0000ff00)>>8)<<31)>>31)&0x1)==1){b_[b_i]=true;++b_i;}else{b_[b_i]=false;++b_i;} if(((((d&0x000000ff)<<24)>>31)&0x1)==1){b_[b_i]=true;++b_i;}else{b_[b_i]=false;++b_i;} if(((((d&0x000000ff)<<25)>>31)&0x1)==1){b_[b_i]=true;++b_i;}else{b_[b_i]=false;++b_i;} if(((((d&0x000000ff)<<26)>>31)&0x1)==1){b_[b_i]=true;++b_i;}else{b_[b_i]=false;++b_i;} if(((((d&0x000000ff)<<27)>>31)&0x1)==1){b_[b_i]=true;++b_i;}else{b_[b_i]=false;++b_i;} if(((((d&0x000000ff)<<28)>>31)&0x1)==1){b_[b_i]=true;++b_i;}else{b_[b_i]=false;++b_i;} if(((((d&0x000000ff)<<29)>>31)&0x1)==1){b_[b_i]=true;++b_i;}else{b_[b_i]=false;++b_i;} if(((((d&0x000000ff)<<30)>>31)&0x1)==1){b_[b_i]=true;++b_i;}else{b_[b_i]=false;++b_i;} if(((((d&0x000000ff)<<31)>>31)&0x1)==1){b_[b_i]=true;++b_i;}else{b_[b_i]=false;++b_i;} } int main(int argc,char *argv[]) { char fbyte; int i,j,k,l,m,n,p,r,nH,nL; int a,b,c,d,e; int ai,ci,di; int mx,mxi; int b8o,b8e,b16o,b16e; __int64 ga[4][2]; __int64 ds,dp; double nl; if(argv[1]!=NULL){strcpy(infn,argv[1]);f1=fopen(infn,"rb");if(f1!=NULL){fclose(f1);}else{return(0);}}else{return(0);} b16o=0; b16o|=1<<0; b16o|=1<<2; b16o|=1<<4; b16o|=1<<6; b16o|=1<<8; b16o|=1<<10; b16o|=1<<12; b16o|=1<<14; b16e=0; b16e|=1<<1; b16e|=1<<3; b16e|=1<<5; b16e|=1<<7; b16e|=1<<9; b16e|=1<<11; b16e|=1<<13; b16e|=1<<15; for(i=0;i<16;++i){for(j=0;j<16;++j){for(k=0;k<16;++k){for(l=0;l<16;++l){ ba16[i][j][k][l][0]=-1;ba16[i][j][k][l][1]=0; }}}}ba16i=0; for(i=0;i<0xffff;++i){dn[i][0]=-1;dn[i][1]=-1;} f1=fopen(infn,"rb"); j=0; while(!feof(f1)) { nH=getc(f1);++j;nL=getc(f1);++j; n=((nH<<8)&0xff00)|(nL&0x00ff); if(ba16[(n&0xf000)>>12][(n&0x0f00)>>8][(n&0x00f0)>>4][(n&0x000f)>>0][0]==-1) { ba16[(n&0xf000)>>12][(n&0x0f00)>>8][(n&0x00f0)>>4][(n&0x000f)>>0][0]=ba16i; ba16[(n&0xf000)>>12][(n&0x0f00)>>8][(n&0x00f0)>>4][(n&0x000f)>>0][1]=1; ++ba16i; }else{ ++ba16[(n&0xf000)>>12][(n&0x0f00)>>8][(n&0x00f0)>>4][(n&0x000f)>>0][1]; } } fclose(f1); for(i=0;i<16;++i){for(j=0;j<16;++j){for(k=0;k<16;++k){for(l=0;l<16;++l){ ba16_[i][j][k][l][0]=-1;ba16_[i][j][k][l][1]=0;ba16_[i][j][k][l][2]=0; }}}}ba16i_=0; for(i=0;i<16;++i){for(j=0;j<16;++j){for(k=0;k<16;++k){for(l=0;l<16;++l){ if(ba16[i][j][k][l][0]!=-1) { n=(i<<12)|(j<<8)|(k<<4)|(l<<0); ga[0][0]=0;ga[0][1]=0;for(c=0;c<16;++c){d=(c<<12)|(j<<8)|(k<<4)|(l<<0);if(n>1)^((b16e&(n&0xffff))>>1))<<1)|((b16o&d)^(b16o&(n&0xffff)));}} ga[1][0]=0;ga[1][1]=0;for(c=0;c<16;++c){d=(i<<12)|(c<<8)|(k<<4)|(l<<0);if(n>1)^((b16e&(n&0xffff))>>1))<<1)|((b16o&d)^(b16o&(n&0xffff)));}} ga[2][0]=0;ga[2][1]=0;for(c=0;c<16;++c){d=(i<<12)|(j<<8)|(c<<4)|(l<<0);if(n>1)^((b16e&(n&0xffff))>>1))<<1)|((b16o&d)^(b16o&(n&0xffff)));}} ga[3][0]=0;ga[3][1]=0;for(c=0;c<16;++c){d=(i<<12)|(j<<8)|(k<<4)|(c<<0);if(n>1)^((b16e&(n&0xffff))>>1))<<1)|((b16o&d)^(b16o&(n&0xffff)));}} ds=-1;for(a=0;a<4;++a){if(ds==-1){ds=ga[a][0];ai=0;}else{if(dsd&&ba16[c][j][k][l][0]!=-1){++ga[0][1];ga[0][0]+=((((b16e&d)>>1)^((b16e&(n&0xffff))>>1))<<1)|((b16o&d)^(b16o&(n&0xffff)));}} ga[1][0]=0;ga[1][1]=0;for(c=0;c<16;++c){d=(i<<12)|(c<<8)|(k<<4)|(l<<0);if(n>d&&ba16[i][c][k][l][0]!=-1){++ga[1][1];ga[1][0]+=((((b16e&d)>>1)^((b16e&(n&0xffff))>>1))<<1)|((b16o&d)^(b16o&(n&0xffff)));}} ga[2][0]=0;ga[2][1]=0;for(c=0;c<16;++c){d=(i<<12)|(j<<8)|(c<<4)|(l<<0);if(n>d&&ba16[i][j][c][l][0]!=-1){++ga[2][1];ga[2][0]+=((((b16e&d)>>1)^((b16e&(n&0xffff))>>1))<<1)|((b16o&d)^(b16o&(n&0xffff)));}} ga[3][0]=0;ga[3][1]=0;for(c=0;c<16;++c){d=(i<<12)|(j<<8)|(k<<4)|(c<<0);if(n>d&&ba16[i][j][k][c][0]!=-1){++ga[3][1];ga[3][0]+=((((b16e&d)>>1)^((b16e&(n&0xffff))>>1))<<1)|((b16o&d)^(b16o&(n&0xffff)));}} ds=-1;for(a=0;a<4;++a){if(ds==-1){ds=ga[a][0];di=0;}else{if(ds0&&ga[ai][0]>0&&ga[ci][0]>0&&ga[di][0]>0) { /* if(((n&0xff00)>>8)>=32&&((n&0xff00)>>8)<=126) { printf("%d\t%e\t%c" ,n ,log((double)ga[ai][0]/(double)ga[ci][0])-log((double)ga[di][0]/(double)ga[ci][0]) ,((n&0xff00)>>8) ); if((n&0x00ff)>=32&&(n&0x00ff)<=126) { printf("%c\n" ,(n&0x00ff) ); }else{ printf(".%03d.\n" ,(n&0x00ff) ); } }else{ printf("%d\t%e\t.%03d." ,n ,log((double)ga[ai][0]/(double)ga[ci][0])-log((double)ga[di][0]/(double)ga[ci][0]) ,((n&0xff00)>>8) ); if((n&0x00ff)>=32&&(n&0x00ff)<=126) { printf("%c\n" ,(n&0x00ff) ); }else{ printf(".%03d.\n" ,(n&0x00ff) ); } } */ p=100000-(int)((double)100*((double)100+(log((double)ga[ai][0]/(double)ga[ci][0])-log((double)ga[di][0]/(double)ga[ci][0])))); //printf("!%d!\n",p); p=(int)(p/10);p=(int)(p*10); if(ba16_[(p&0xf000)>>12][(p&0x0f00)>>8][(p&0x00f0)>>4][(p&0x000f)>>0][0]==-1) { ba16_[(p&0xf000)>>12][(p&0x0f00)>>8][(p&0x00f0)>>4][(p&0x000f)>>0][0]=ba16i_; ba16_[(p&0xf000)>>12][(p&0x0f00)>>8][(p&0x00f0)>>4][(p&0x000f)>>0][1]=1; ba16_[(p&0xf000)>>12][(p&0x0f00)>>8][(p&0x00f0)>>4][(p&0x000f)>>0][2]=n; ++ba16i_; }else{ ++ba16_[(p&0xf000)>>12][(p&0x0f00)>>8][(p&0x00f0)>>4][(p&0x000f)>>0][1]; } } } }}}} printf("\n\n"); for(i=0;i<16;++i){for(j=0;j<16;++j){for(k=0;k<16;++k){for(l=0;l<16;++l){ if(ba16_[i][j][k][l][0]!=-1) { n=(i<<12)|(j<<8)|(k<<4)|(l<<0); printf("%d\t%d\t%d\n" ,n ,ba16_[i][j][k][l][1] ,ba16_[i][j][k][l][2] ); if(ba16_[i][j][k][l][1]>=50){dn[ba16_[i][j][k][l][2]][0]=dni;++dni;} } }}}} printf("\n%d\n\n",dni); f1=fopen(infn,"rb"); while(!feof(f1)) { nH=getc(f1);nL=getc(f1); n=((nH<<8)&0xff00)|(nL&0x00ff);fc+=16; if(dn[n][0]!=-1){c=dn[n][0];}else{dn[n][0]=dni;c=dni;++dni;} pr32_(c ,bt32_1,bt32i_1); p=32;for(i=0;i<32;++i){if(bt32_1[i]){p=i;break;}} p=32-p;bitc+=p; } fclose(f1); printf("\n%d\n\n",dni); printf("compressed bytes %d , file bytes %d (%d)\n\n\n", (long)((double)bitc/8.0), (long)((double)fc/8.0), (long)((100*(double)((double)bitc/8.0))/(double)((double)fc/8.0))); return(0); }