Name: FrozenVoid 2011-10-12 10:32
//====Headers
#include <iso646.h>
#include <assert.h>
#include <limits.h>
#include <stdbool.h>
#include <locale.h>
#include <setjmp.h>
#include <signal.h>
#include <stdarg.h>
#include <stddef.h>
#include <errno.h>
#include <ctype.h>
#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
#define u1 unsigned char
#define u2 unsigned short
#define u4 unsigned int
#define u8 unsigned long long
//====Bithacks
#define setb(o,p) (o|=(1<<p)) //byte| 1<< pos
#define clrb(o,p) (o&=(~(1<<p))) // byte | 11101111
#define togb(o,p) (o^=(1<<p))
#define chkb(o,p) ((o>>p)&1)
#define bitchar(bitchar_bit) (48|bitchar_bit) // 48|0 or 1
//====Func
static __inline__ u8 rdtsc(void){u8 x;
__asm__ volatile (".byte 0x0f, 0x31" : "=A" (x)); return x;}
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;}
void 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;}}
void 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");}
void 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);
}
#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--Does not work-----
if(argv[2] && !strcmp(argv[2],"-d")){//decode Data+Bitmap
u1* bitfile=(u1*)getcontent("Bitmapx16");
u1* datafile=(u1*)getcontent("Data");
u8 xsize=fsize("Bitmapx16");u8 btsize=fsize("Data");
FILE* result=fopen("Result","wb");
if(!bitfile||!datafile||!result){perror("File error");exit(2);}
//convert into n1 byte nib(avoids corruption)
u1* expbit=malloc(btsize*4);
u8 n8;for(n8=0;n8<btsize;n8++){
expbit[n8*4]=getb0(datafile[n8]);
expbit[n8*4+1]=getb1(datafile[n8]);
expbit[n8*4+2]=getb2(datafile[n8]);
expbit[n8*4+3]=getb3(datafile[n8]);}
u1 bitsave=0,s0,s1,s2,s3;//read output nib
u8 m,dpos=0;u4 a2,cbit;for(m=0;m<xsize;m++){
for(a2=0;a2<8;a2++){//read bit
cbit=chkb(bitfile[m],a2);//current bit:
if(cbit){//read three,write four, nib pos never changes due expbit array
s0=expbit[dpos++];s1=expbit[dpos++];s2=expbit[dpos++];
bitsave=(s0)|(s1<<2)|(s2<<4)|((s0^3)<<6);fputc(bitsave,result);
}else{//read four, write four,
s0=expbit[dpos++];s1=expbit[dpos++];s2=expbit[dpos++];s3=expbit[dpos++];
bitsave=(s0)|(s1<<2)|(s2<<4)|(s3<<6);fputc(bitsave,result);
}
}//iloop end
}
;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);
//====================================
; }