Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "frozen\void.h"
- #define tstruct typedef struct
- #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) mpf_t x;mpf_init(x);
- //static array
- #define mpfr(x) MPFR_DECL_INIT(x, 53) //returns float
- #define DEBUG 1
- #define DEBUG2 1
- #define DEBUG3 0
- #define MAXCHAIN 100000 // more for bigger files/
- #define C8 "Output.dat"
- #define SCALE 1 //was 8*inpsize
- #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)
- //(1<<(pos<<1))
- //========MAIN===
- u4 int2b(u4 v){ // 32-bit value to find the log2 of
- static const unsigned int b[] = {0xAAAAAAAA, 0xCCCCCCCC, 0xF0F0F0F0,
- 0xFF00FF00, 0xFFFF0000};
- unsigned int r = (v & b[0]) != 0;
- r |= ((v & b[4]) != 0) << 4;
- r |= ((v & b[3]) != 0) << 3;
- r |= ((v & b[2]) != 0) << 2;
- r |= ((v & b[1]) != 0) << 1;
- return r;}
- main(int argc,char**argv){
- /*
- lx=x&0xf
- hx=(x&f0)>>4
- if hx^0xf==lx,setbit1
- */
- if(!argv[1]){printf("Syntax:cmp inputfile [-d=decode]");exit(1);}
- //-----DECODE-------
- if(argv[2] && !strcmp(argv[2],"-d")){//decode Data+Bitmap
- u4* bitfile=(u4*)getcontent("Bitmapx16");
- FILE* result=fopen("Result","wb");
- if(!bitfile||!result){perror("File error");exit(2);}
- ;printf("Decoded to file Result");exit(10);}
- //------INPUT--------
- u8 inpsize=fsize(argv[1]);if(!inpsize){perror("input size invalid");return;};
- u1* input=getcontent(argv[1]);
- u1* output=calloc(inpsize/8 +1,1);
- if(!input){perror("input invalid");return;}
- FILE* bitfile=fopen("Bitmapx16","wb");if(!bitfile){perror("File write failed");return;};
- FILE* datafile=fopen("Data","wb");if(!bitfile){perror("File write failed");return;};
- u8 c,total=0,opos=0;u4 j;u1 l0,l1,l2,l3,bitsave=0,bitpos=0,startnib=0;
- for(c=1;c<inpsize;c++){
- l0=getb0(input[c]);
- l1=getb1(input[c]);
- l2=getb2(input[c]);
- l3=getb3(input[c]); //opt
- if(l0^3==l3){ total++;
- switch(startnib){//
- case 0:;bitsave|=(l0);bitsave|=(l1<<2);bitsave|=(l2<<4);;startnib=3;break;
- case 1:;bitsave|=(l0<<2);bitsave|=(l1<<4);bitsave|=(l2<<6);
- fputc(bitsave,datafile);bitsave=0;startnib=0;break;
- case 2:;bitsave|=(l0<<4);bitsave|=(l1<<6);
- fputc(bitsave,datafile);bitsave=0;bitsave|=(l2);startnib=1;break;
- case 3:;bitsave|=(l0<<6);fputc(bitsave,datafile);bitsave=0;
- bitsave|=(l1);bitsave|=(l2<<2);startnib=2;break;;default:break;;}
- output[opos]|=(1<<(bitpos));}else{//save all
- switch(startnib){//no change in start nib
- case 0:;bitsave|=(l0);bitsave|=(l1<<2);bitsave|=(l2<<4);bitsave|=(l3<<6);
- fputc(bitsave,datafile);bitsave=0;;break;
- case 1:;bitsave|=(l0<<2);bitsave|=(l1<<4);bitsave|=(l2<<6);
- fputc(bitsave,datafile);bitsave=0;bitsave|=(l3);;break;
- case 2:;bitsave|=(l0<<4);bitsave|=(l1<<6);
- fputc(bitsave,datafile);bitsave=0;bitsave|=(l2);bitsave|=(l3<<2);;break;
- case 3:;bitsave|=(l0<<6);fputc(bitsave,datafile);bitsave=0;
- bitsave|=(l1);bitsave|=(l2<<2);bitsave|=(l2<<4);break;default:break;;;}
- }
- if(++bitpos==8){bitpos=0;opos++;}
- ;}
- fwrite(output,1,inpsize/8+1,bitfile);
- printf("Total bytes saved %llu ",total/4);
- //====================================
- ; }
- /*
- mpz bitstring is very slow...
- 00:11:11:00
- testbit(x0)
- 1 int= 1<<nib| (1<<nib2)<<16
- */
Add Comment
Please, Sign In to add comment