| /* |
| minibz2 |
| libbz2.dll test program. |
| by Yoshioka Tsuneo (tsuneo@rr.iij4u.or.jp) |
| This file is Public Domain. Welcome any email to me. |
| |
| usage: minibz2 [-d] [-{1,2,..9}] [[srcfilename] destfilename] |
| */ |
| |
| #define BZ_IMPORT |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include "bzlib.h" |
| #ifdef _WIN32 |
| #include <io.h> |
| #endif |
| |
| |
| #ifdef _WIN32 |
| |
| #define BZ2_LIBNAME "libbz2-1.0.2.DLL" |
| |
| #include <windows.h> |
| 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; |
| } |