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