// This source and compression method apply to GNU General Public License. // Copyright (C) August , 2010 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 August , 15 , 2010 // // // to Dusica and Dzinleski Borce // // #include #include #include #define BuffL 64 //(128) #define BtM 8*256 #define TBEnd 8 int b12=((0xffff>>4 )<<4 ); int b11=((0xffff>>5 )<<5 ); int b10=((0xffff>>6 )<<6 ); int b09=((0xffff>>7 )<<7 ); int b08=((0xffff>>8 )<<8 ); int b07=((0xffff>>9 )<<9 ); int b06=((0xffff>>10)<<10); int b05=((0xffff>>11)<<11); int b04=((0xffff>>12)<<12); 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][3]; int ba16i=0; __int64 fc=0; int bl08[16][256]; int bl08i=0; int mm[16][3]; int md[16][30000][2]; int mdi[16]; int ddf[70000][2]; int ddfi=0; int dd[70000][4]; int ddi=0; int ca[BuffL]; int cai=0; bool br[BtM]; int bri=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 p_1(int ns) { int i,j,k,l,m,n,p,q; int a,b,c,d; int b8o,b8e,b16o,b16e; int nH,nL; int mx,mxi; b8o=0; b8o|=1<<0; b8o|=1<<2; b8o|=1<<4; b8o|=1<<6; b8e=0; b8e|=1<<1; b8e|=1<<3; b8e|=1<<5; b8e|=1<<7; 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;ba16[i][j][k][l][2]=0; }}}} f1=fopen(infn,"rb"); while(!feof(f1)) { nH=getc(f1);if(!feof(f1)){nL=getc(f1);}else{nL=0;}n=((nH<<8)&0xff00)|(nL&0x00ff); if(ba16[(n&0xf000)>>12][(n&0x0f00)>>8][(n&0x00f0)>>4][(n&0x000f)>>0][0]==-1) { a=n&ns;b=n; d=((((b16e&a)>>1)^((b16e&(b&0xffff))>>1))<<1)|((b16o&a)^(b16o&(b&0xffff))); 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; ba16[(n&0xf000)>>12][(n&0x0f00)>>8][(n&0x00f0)>>4][(n&0x000f)>>0][2]=d; ++ba16i; }else{ ++ba16[(n&0xf000)>>12][(n&0x0f00)>>8][(n&0x00f0)>>4][(n&0x000f)>>0][1]; } } fclose(f1); printf("\n%d\n\n",ba16i); for(i=0;i<16;++i){for(j=0;j<16;++j){ mx=-1; for(k=0;k<16;++k){for(l=0;l<16;++l){ n=(i<<12)|(j<<8)|(k<<4)|(l<<0); if(ba16[(n&0xf000)>>12][(n&0x0f00)>>8][(n&0x00f0)>>4][(n&0x000f)>>0][0]!=-1) { if(mx==-1) { mxi=(i<<12)|(j<<8)|(k<<4)|(l<<0); mx=ba16[(n&0xf000)>>12][(n&0x0f00)>>8][(n&0x00f0)>>4][(n&0x000f)>>0][2]; }else{ if ( mx< ba16[(n&0xf000)>>12][(n&0x0f00)>>8][(n&0x00f0)>>4][(n&0x000f)>>0][2] ) { mxi=(i<<12)|(j<<8)|(k<<4)|(l<<0); mx=ba16[(n&0xf000)>>12][(n&0x0f00)>>8][(n&0x00f0)>>4][(n&0x000f)>>0][2]; } } } }} if(mx!=-1) { if(ddi==0) { dd[ddi][0]=mxi;dd[ddi][1]=mx; dd[ddi][2]=ba16[(mxi&0xf000)>>12][(mxi&0x0f00)>>8][(mxi&0x00f0)>>4][(mxi&0x000f)>>0][1]; dd[ddi][3]=ba16[(mxi&0xf000)>>12][(mxi&0x0f00)>>8][(mxi&0x00f0)>>4][(mxi&0x000f)>>0][2]; ++ddi; }else{ for(a=0;a>12][(dd[a][0]&0x0f00)>>8][(dd[a][0]&0x00f0)>>4][(dd[a][0]&0x000f)>>0][1]; dd[ddi][3]+=ba16[(dd[a][0]&0xf000)>>12][(dd[a][0]&0x0f00)>>8][(dd[a][0]&0x00f0)>>4][(dd[a][0]&0x000f)>>0][2]; break; } } if(a==ddi) { dd[ddi][0]=mxi;dd[ddi][1]=mx; dd[ddi][2]=ba16[(mxi&0xf000)>>12][(mxi&0x0f00)>>8][(mxi&0x00f0)>>4][(mxi&0x000f)>>0][1]; dd[ddi][3]=ba16[(mxi&0xf000)>>12][(mxi&0x0f00)>>8][(mxi&0x00f0)>>4][(mxi&0x000f)>>0][2]; ++ddi; } } } }} for(a=0;a>8)&0xf0)>>4), ((((dd[i][1]&0xff00)>>8)&0x0f)>>0), ((((dd[i][1]&0x00ff)>>0)&0xf0)>>4), ((((dd[i][1]&0x00ff)>>0)&0x0f)>>0), log(((double)dd[i][3]/(double)dd[i][2])) ); } printf("\n"); for(i=0;i=3.00&&6.9>=log(((double)dd[i][3]/(double)dd[i][2]))) { printf("%d %d %d %d %d %d\t%e\n",dd[i][0],dd[i][1], ((((dd[i][1]&0xff00)>>8)&0xf0)>>4), ((((dd[i][1]&0xff00)>>8)&0x0f)>>0), ((((dd[i][1]&0x00ff)>>0)&0xf0)>>4), ((((dd[i][1]&0x00ff)>>0)&0x0f)>>0), log(((double)dd[i][3]/(double)dd[i][2])) ); } } printf("\n"); j=0; for(i=0;i=3.00&&6.9>=log(((double)dd[i][3]/(double)dd[i][2]))) { dd[j][0]=dd[i][0];dd[j][1]=dd[i][1];dd[j][2]=dd[i][2];dd[j][3]=dd[i][3];++j; } } ddi=j; printf("\n"); for(i=0;id){mx=d;mxi=i;}}} } if(mx==-1){dd[ddi][0]=n;dd[ddi][1]=0;mx=0;mxi=ddi;++ddi;} if(ddfi==0){ddf[ddfi][0]=mx;ddf[ddfi][1]=mxi;c=ddfi;++ddfi;}else{ for(i=0;i>8),((dd[ddf[c][1]][0]-ddf[c][0])&0x00ff)); 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",ddi); printf("\n%d\n\n",ddfi); 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); }