www.pudn.com > RakNet-2.52.zip > dlltest.c


/* 
   minibz2 
      libbz2.dll test program. 
      by Yoshioka Tsuneo(QWF00133@nifty.ne.jp/tsuneo-y@is.aist-nara.ac.jp) 
      This file is Public Domain. 
      welcome any email to me. 
 
   usage: minibz2 [-d] [-{1,2,..9}] [[srcfilename] destfilename] 
*/ 
 
#define BZ_IMPORT 
#include  
#include  
#include "bzlib.h" 
#ifdef _WIN32 
#include  
#endif 
 
 
#ifdef _WIN32 
 
#define BZ2_LIBNAME "libbz2-1.0.2.DLL"  
 
#include  
static int BZ2DLLLoaded = 0; 
static HINSTANCE BZ2DLLhLib; 
int BZ2DLLLoadLibrary(void) 
{ 
   HINSTANCE hLib; 
 
   if(BZ2DLLLoaded==1){return 0;} 
   hLib=LoadLibrary(BZ2_LIBNAME); 
   if(hLib == NULL){ 
      fprintf(stderr,"Can't load %s\n",BZ2_LIBNAME); 
      return -1; 
   } 
   BZ2_bzlibVersion=GetProcAddress(hLib,"BZ2_bzlibVersion"); 
   BZ2_bzopen=GetProcAddress(hLib,"BZ2_bzopen"); 
   BZ2_bzdopen=GetProcAddress(hLib,"BZ2_bzdopen"); 
   BZ2_bzread=GetProcAddress(hLib,"BZ2_bzread"); 
   BZ2_bzwrite=GetProcAddress(hLib,"BZ2_bzwrite"); 
   BZ2_bzflush=GetProcAddress(hLib,"BZ2_bzflush"); 
   BZ2_bzclose=GetProcAddress(hLib,"BZ2_bzclose"); 
   BZ2_bzerror=GetProcAddress(hLib,"BZ2_bzerror"); 
 
   if (!BZ2_bzlibVersion || !BZ2_bzopen || !BZ2_bzdopen 
       || !BZ2_bzread || !BZ2_bzwrite || !BZ2_bzflush 
       || !BZ2_bzclose || !BZ2_bzerror) { 
      fprintf(stderr,"GetProcAddress failed.\n"); 
      return -1; 
   } 
   BZ2DLLLoaded=1; 
   BZ2DLLhLib=hLib; 
   return 0; 
 
} 
int BZ2DLLFreeLibrary(void) 
{ 
   if(BZ2DLLLoaded==0){return 0;} 
   FreeLibrary(BZ2DLLhLib); 
   BZ2DLLLoaded=0; 
} 
#endif /* WIN32 */ 
 
void usage(void) 
{ 
   puts("usage: minibz2 [-d] [-{1,2,..9}] [[srcfilename] destfilename]"); 
} 
 
int main(int argc,char *argv[]) 
{ 
   int decompress = 0; 
   int level = 9; 
   char *fn_r = NULL; 
   char *fn_w = NULL; 
 
#ifdef _WIN32 
   if(BZ2DLLLoadLibrary()<0){ 
      fprintf(stderr,"Loading of %s failed.  Giving up.\n", BZ2_LIBNAME); 
      exit(1); 
   } 
   printf("Loading of %s succeeded.  Library version is %s.\n", 
          BZ2_LIBNAME, BZ2_bzlibVersion() ); 
#endif 
   while(++argv,--argc){ 
      if(**argv =='-' || **argv=='/'){ 
         char *p; 
 
         for(p=*argv+1;*p;p++){ 
            if(*p=='d'){ 
               decompress = 1; 
            }else if('1'<=*p && *p<='9'){ 
               level = *p - '0'; 
            }else{ 
               usage(); 
               exit(1); 
            } 
         } 
      }else{ 
         break; 
      } 
   } 
   if(argc>=1){ 
      fn_r = *argv; 
      argc--;argv++; 
   }else{ 
      fn_r = NULL; 
   } 
   if(argc>=1){ 
      fn_w = *argv; 
      argc--;argv++; 
   }else{ 
      fn_w = NULL; 
   } 
   { 
      int len; 
      char buff[0x1000]; 
      char mode[10]; 
 
      if(decompress){ 
         BZFILE *BZ2fp_r = NULL; 
         FILE *fp_w = NULL; 
 
         if(fn_w){ 
            if((fp_w = fopen(fn_w,"wb"))==NULL){ 
               printf("can't open [%s]\n",fn_w); 
               perror("reason:"); 
               exit(1); 
            } 
         }else{ 
            fp_w = stdout; 
         } 
         if((fn_r == NULL && (BZ2fp_r = BZ2_bzdopen(fileno(stdin),"rb"))==NULL) 
            || (fn_r != NULL && (BZ2fp_r = BZ2_bzopen(fn_r,"rb"))==NULL)){ 
            printf("can't bz2openstream\n"); 
            exit(1); 
         } 
         while((len=BZ2_bzread(BZ2fp_r,buff,0x1000))>0){ 
            fwrite(buff,1,len,fp_w); 
         } 
         BZ2_bzclose(BZ2fp_r); 
         if(fp_w != stdout) fclose(fp_w); 
      }else{ 
         BZFILE *BZ2fp_w = NULL; 
         FILE *fp_r = NULL; 
 
         if(fn_r){ 
            if((fp_r = fopen(fn_r,"rb"))==NULL){ 
               printf("can't open [%s]\n",fn_r); 
               perror("reason:"); 
               exit(1); 
            } 
         }else{ 
            fp_r = stdin; 
         } 
         mode[0]='w'; 
         mode[1] = '0' + level; 
         mode[2] = '\0'; 
 
         if((fn_w == NULL && (BZ2fp_w = BZ2_bzdopen(fileno(stdout),mode))==NULL) 
            || (fn_w !=NULL && (BZ2fp_w = BZ2_bzopen(fn_w,mode))==NULL)){ 
            printf("can't bz2openstream\n"); 
            exit(1); 
         } 
         while((len=fread(buff,1,0x1000,fp_r))>0){ 
            BZ2_bzwrite(BZ2fp_w,buff,len); 
         } 
         BZ2_bzclose(BZ2fp_w); 
         if(fp_r!=stdin)fclose(fp_r); 
      } 
   } 
#ifdef _WIN32 
   BZ2DLLFreeLibrary(); 
#endif 
   return 0; 
}