예제 #1
0
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;
};
예제 #2
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;
}