1172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich/* 2172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich minibz2 3172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich libbz2.dll test program. 4172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich by Yoshioka Tsuneo (tsuneo@rr.iij4u.or.jp) 5172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich This file is Public Domain. Welcome any email to me. 6172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich 7172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich usage: minibz2 [-d] [-{1,2,..9}] [[srcfilename] destfilename] 8172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich*/ 9172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich 10172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich#define BZ_IMPORT 11172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich#include <stdio.h> 12172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich#include <stdlib.h> 13172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich#include "bzlib.h" 14172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich#ifdef _WIN32 15172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich#include <io.h> 16172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich#endif 17172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich 18172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich 19172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich#ifdef _WIN32 20172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich 21172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich#define BZ2_LIBNAME "libbz2-1.0.2.DLL" 22172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich 23172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich#include <windows.h> 24172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevichstatic int BZ2DLLLoaded = 0; 25172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevichstatic HINSTANCE BZ2DLLhLib; 26172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevichint BZ2DLLLoadLibrary(void) 27172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich{ 28172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich HINSTANCE hLib; 29172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich 30172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich if(BZ2DLLLoaded==1){return 0;} 31172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich hLib=LoadLibrary(BZ2_LIBNAME); 32172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich if(hLib == NULL){ 33172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich fprintf(stderr,"Can't load %s\n",BZ2_LIBNAME); 34172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich return -1; 35172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich } 36172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich BZ2_bzlibVersion=GetProcAddress(hLib,"BZ2_bzlibVersion"); 37172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich BZ2_bzopen=GetProcAddress(hLib,"BZ2_bzopen"); 38172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich BZ2_bzdopen=GetProcAddress(hLib,"BZ2_bzdopen"); 39172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich BZ2_bzread=GetProcAddress(hLib,"BZ2_bzread"); 40172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich BZ2_bzwrite=GetProcAddress(hLib,"BZ2_bzwrite"); 41172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich BZ2_bzflush=GetProcAddress(hLib,"BZ2_bzflush"); 42172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich BZ2_bzclose=GetProcAddress(hLib,"BZ2_bzclose"); 43172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich BZ2_bzerror=GetProcAddress(hLib,"BZ2_bzerror"); 44172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich 45172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich if (!BZ2_bzlibVersion || !BZ2_bzopen || !BZ2_bzdopen 46172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich || !BZ2_bzread || !BZ2_bzwrite || !BZ2_bzflush 47172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich || !BZ2_bzclose || !BZ2_bzerror) { 48172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich fprintf(stderr,"GetProcAddress failed.\n"); 49172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich return -1; 50172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich } 51172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich BZ2DLLLoaded=1; 52172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich BZ2DLLhLib=hLib; 53172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich return 0; 54172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich 55172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich} 56172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevichint BZ2DLLFreeLibrary(void) 57172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich{ 58172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich if(BZ2DLLLoaded==0){return 0;} 59172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich FreeLibrary(BZ2DLLhLib); 60172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich BZ2DLLLoaded=0; 61172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich} 62172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich#endif /* WIN32 */ 63172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich 64172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevichvoid usage(void) 65172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich{ 66172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich puts("usage: minibz2 [-d] [-{1,2,..9}] [[srcfilename] destfilename]"); 67172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich} 68172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich 69172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevichint main(int argc,char *argv[]) 70172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich{ 71172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich int decompress = 0; 72172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich int level = 9; 73172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich char *fn_r = NULL; 74172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich char *fn_w = NULL; 75172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich 76172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich#ifdef _WIN32 77172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich if(BZ2DLLLoadLibrary()<0){ 78172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich fprintf(stderr,"Loading of %s failed. Giving up.\n", BZ2_LIBNAME); 79172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich exit(1); 80172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich } 81172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich printf("Loading of %s succeeded. Library version is %s.\n", 82172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich BZ2_LIBNAME, BZ2_bzlibVersion() ); 83172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich#endif 84172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich while(++argv,--argc){ 85172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich if(**argv =='-' || **argv=='/'){ 86172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich char *p; 87172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich 88172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich for(p=*argv+1;*p;p++){ 89172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich if(*p=='d'){ 90172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich decompress = 1; 91172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich }else if('1'<=*p && *p<='9'){ 92172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich level = *p - '0'; 93172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich }else{ 94172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich usage(); 95172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich exit(1); 96172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich } 97172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich } 98172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich }else{ 99172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich break; 100172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich } 101172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich } 102172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich if(argc>=1){ 103172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich fn_r = *argv; 104172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich argc--;argv++; 105172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich }else{ 106172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich fn_r = NULL; 107172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich } 108172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich if(argc>=1){ 109172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich fn_w = *argv; 110172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich argc--;argv++; 111172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich }else{ 112172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich fn_w = NULL; 113172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich } 114172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich { 115172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich int len; 116172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich char buff[0x1000]; 117172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich char mode[10]; 118172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich 119172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich if(decompress){ 120172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich BZFILE *BZ2fp_r = NULL; 121172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich FILE *fp_w = NULL; 122172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich 123172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich if(fn_w){ 124172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich if((fp_w = fopen(fn_w,"wb"))==NULL){ 125172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich printf("can't open [%s]\n",fn_w); 126172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich perror("reason:"); 127172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich exit(1); 128172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich } 129172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich }else{ 130172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich fp_w = stdout; 131172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich } 132172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich if((fn_r == NULL && (BZ2fp_r = BZ2_bzdopen(fileno(stdin),"rb"))==NULL) 133172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich || (fn_r != NULL && (BZ2fp_r = BZ2_bzopen(fn_r,"rb"))==NULL)){ 134172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich printf("can't bz2openstream\n"); 135172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich exit(1); 136172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich } 137172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich while((len=BZ2_bzread(BZ2fp_r,buff,0x1000))>0){ 138172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich fwrite(buff,1,len,fp_w); 139172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich } 140172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich BZ2_bzclose(BZ2fp_r); 141172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich if(fp_w != stdout) fclose(fp_w); 142172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich }else{ 143172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich BZFILE *BZ2fp_w = NULL; 144172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich FILE *fp_r = NULL; 145172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich 146172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich if(fn_r){ 147172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich if((fp_r = fopen(fn_r,"rb"))==NULL){ 148172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich printf("can't open [%s]\n",fn_r); 149172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich perror("reason:"); 150172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich exit(1); 151172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich } 152172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich }else{ 153172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich fp_r = stdin; 154172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich } 155172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich mode[0]='w'; 156172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich mode[1] = '0' + level; 157172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich mode[2] = '\0'; 158172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich 159172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich if((fn_w == NULL && (BZ2fp_w = BZ2_bzdopen(fileno(stdout),mode))==NULL) 160172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich || (fn_w !=NULL && (BZ2fp_w = BZ2_bzopen(fn_w,mode))==NULL)){ 161172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich printf("can't bz2openstream\n"); 162172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich exit(1); 163172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich } 164172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich while((len=fread(buff,1,0x1000,fp_r))>0){ 165172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich BZ2_bzwrite(BZ2fp_w,buff,len); 166172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich } 167172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich BZ2_bzclose(BZ2fp_w); 168172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich if(fp_r!=stdin)fclose(fp_r); 169172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich } 170172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich } 171172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich#ifdef _WIN32 172172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich BZ2DLLFreeLibrary(); 173172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich#endif 174172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich return 0; 175172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich} 176