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