unsigned char pack(unsigned char * bufferin, unsigned long sizein,unsigned char * bufferout, int * sizeout) { unsigned char* buffer; unsigned char* buffer2; unsigned long newsize; unsigned long newsize2; unsigned long newsize3; int mode; buffer=(unsigned char*)malloc(sizein*10); buffer2=(unsigned char*)malloc(sizein*10); // rlepack(bufferin,sizein,buffer2,&newsize2); //lzw_compress(bufferin,buffer2,sizein,&newsize); lzw_compress(bufferin,buffer,sizein,&newsize3); mode=0; if(sizein<=newsize3 ) mode = 0; //rien // if(newsize2<sizein && newsize2< newsize) mode=1; //rle //if(newsize<sizein && newsize< newsize2) mode=2; //lzw else mode =2; // if(newsize3<sizein && newsize3< newsize2 && newsize3< newsize) mode=3; //lzw+rle*/ //mode=2; //printf("mode : %d\n",mode); mode=0; switch(mode) { case 0: memcpy((buffer2),bufferin,sizein); //buffer2[0]=0x0; memcpy(bufferout,buffer2,sizein+1); *sizeout=sizein+1; break; case 1: rlepack(bufferin,sizein,buffer+1,(int*)&newsize); buffer[0]=0x2; memcpy(bufferout,buffer,newsize+1); *sizeout=newsize+1; break; case 2: lzw_compress(bufferin,buffer+1,sizein,(int*)&newsize); buffer[0]=0x1; memcpy(bufferout,buffer,newsize+1); *sizeout=newsize+1; break; case 3: rlepack(bufferin,sizein,buffer2,(int*)&newsize); lzw_compress(buffer2,buffer+1,newsize,(int*)&newsize2); buffer[0]=0x3; memcpy(bufferout,buffer,newsize2+1); *sizeout=newsize2+1; break; } // free(buffer); free(buffer2); return 0; };
/* use Postscript level 2 compression. Ship len bytes from str. */ int lzw_xship(FILE *f, int filter, char *str, int len) { static int fstate = 0; static lzw_stream_t *s = NULL; char outbuf[OUTSIZE]; int err; int n=0; if (filter && !fstate) { /* switch on filtering */ if (filter == 1) { n += fprintf(f, "currentfile /ASCII85Decode filter /LZWDecode filter cvx exec\n"); } s = lzw_init(); if (s == NULL) { fprintf(stderr, "lzw_init: %s\n", strerror(errno)); exit(1); } n += a85init(f); fstate = 1; } else if (!filter && fstate) { /* switch off filtering */ /* flush stream */ s->next_in = 0; s->avail_in = 0; do { s->next_out = outbuf; s->avail_out = OUTSIZE; err = lzw_compress(s, LZW_EOD); if (err) { fprintf(stderr, "lzw_compress: %s\n", strerror(errno)); exit(1); } n += a85write(f, outbuf, OUTSIZE - s->avail_out); } while (s->avail_out == 0); n += a85finish(f); lzw_free(s); s = NULL; fstate = 0; } if (!fstate) { fwrite(str, 1, len, f); return n+len; } /* do the actual compression */ s->next_in = str; s->avail_in = len; do { s->next_out = outbuf; s->avail_out = OUTSIZE; err = lzw_compress(s, LZW_NORMAL); if (err) { fprintf(stderr, "lzw_compress: %s\n", strerror(errno)); exit(1); } n += a85write(f, outbuf, OUTSIZE - s->avail_out); } while (s->avail_out == 0); return n; }