00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #define BZ_IMPORT
00012 #include <stdio.h>
00013 #include <stdlib.h>
00014 #include "bzlib.h"
00015 #ifdef _WIN32
00016 #include <io.h>
00017 #endif
00018
00019
00020 #ifdef _WIN32
00021
00022 #include <windows.h>
00023 static int BZ2DLLLoaded = 0;
00024 static HINSTANCE BZ2DLLhLib;
00025 int BZ2DLLLoadLibrary(void)
00026 {
00027 HINSTANCE hLib;
00028
00029 if(BZ2DLLLoaded==1){return 0;}
00030 hLib=LoadLibrary("libbz2.dll");
00031 if(hLib == NULL){
00032 puts("Can't load libbz2.dll");
00033 return -1;
00034 }
00035 BZ2DLLLoaded=1;
00036 BZ2DLLhLib=hLib;
00037 bzlibVersion=GetProcAddress(hLib,"bzlibVersion");
00038 bzopen=GetProcAddress(hLib,"bzopen");
00039 bzdopen=GetProcAddress(hLib,"bzdopen");
00040 bzread=GetProcAddress(hLib,"bzread");
00041 bzwrite=GetProcAddress(hLib,"bzwrite");
00042 bzflush=GetProcAddress(hLib,"bzflush");
00043 bzclose=GetProcAddress(hLib,"bzclose");
00044 bzerror=GetProcAddress(hLib,"bzerror");
00045 return 0;
00046
00047 }
00048 int BZ2DLLFreeLibrary(void)
00049 {
00050 if(BZ2DLLLoaded==0){return 0;}
00051 FreeLibrary(BZ2DLLhLib);
00052 BZ2DLLLoaded=0;
00053 }
00054 #endif
00055
00056 void usage(void)
00057 {
00058 puts("usage: minibz2 [-d] [-{1,2,..9}] [[srcfilename] destfilename]");
00059 }
00060
00061 int main(int argc,char *argv[])
00062 {
00063 int decompress = 0;
00064 int level = 9;
00065 char *fn_r = NULL;
00066 char *fn_w = NULL;
00067
00068 #ifdef _WIN32
00069 if(BZ2DLLLoadLibrary()<0){
00070 puts("can't load dll");
00071 exit(1);
00072 }
00073 #endif
00074 while(++argv,--argc){
00075 if(**argv =='-' || **argv=='/'){
00076 char *p;
00077
00078 for(p=*argv+1;*p;p++){
00079 if(*p=='d'){
00080 decompress = 1;
00081 }else if('1'<=*p && *p<='9'){
00082 level = *p - '0';
00083 }else{
00084 usage();
00085 exit(1);
00086 }
00087 }
00088 }else{
00089 break;
00090 }
00091 }
00092 if(argc>=1){
00093 fn_r = *argv;
00094 argc--;argv++;
00095 }else{
00096 fn_r = NULL;
00097 }
00098 if(argc>=1){
00099 fn_w = *argv;
00100 argc--;argv++;
00101 }else{
00102 fn_w = NULL;
00103 }
00104 {
00105 int len;
00106 char buff[0x1000];
00107 char mode[10];
00108
00109 if(decompress){
00110 BZFILE *BZ2fp_r = NULL;
00111 FILE *fp_w = NULL;
00112
00113 if(fn_w){
00114 if((fp_w = fopen(fn_w,"wb"))==NULL){
00115 printf("can't open [%s]\n",fn_w);
00116 perror("reason:");
00117 exit(1);
00118 }
00119 }else{
00120 fp_w = stdout;
00121 }
00122 if((BZ2fp_r == NULL && (BZ2fp_r = bzdopen(fileno(stdin),"rb"))==NULL)
00123 || (BZ2fp_r != NULL && (BZ2fp_r = bzopen(fn_r,"rb"))==NULL)){
00124 printf("can't bz2openstream\n");
00125 exit(1);
00126 }
00127 while((len=bzread(BZ2fp_r,buff,0x1000))>0){
00128 fwrite(buff,1,len,fp_w);
00129 }
00130 bzclose(BZ2fp_r);
00131 if(fp_w != stdout) fclose(fp_w);
00132 }else{
00133 BZFILE *BZ2fp_w = NULL;
00134 FILE *fp_r = NULL;
00135
00136 if(fn_r){
00137 if((fp_r = fopen(fn_r,"rb"))==NULL){
00138 printf("can't open [%s]\n",fn_r);
00139 perror("reason:");
00140 exit(1);
00141 }
00142 }else{
00143 fp_r = stdin;
00144 }
00145 mode[0]='w';
00146 mode[1] = '0' + level;
00147 mode[2] = '\0';
00148
00149 if((fn_w == NULL && (BZ2fp_w = bzdopen(fileno(stdout),mode))==NULL)
00150 || (fn_w !=NULL && (BZ2fp_w = bzopen(fn_w,mode))==NULL)){
00151 printf("can't bz2openstream\n");
00152 exit(1);
00153 }
00154 while((len=fread(buff,1,0x1000,fp_r))>0){
00155 bzwrite(BZ2fp_w,buff,len);
00156 }
00157 bzclose(BZ2fp_w);
00158 if(fp_r!=stdin)fclose(fp_r);
00159 }
00160 }
00161 #ifdef _WIN32
00162 BZ2DLLFreeLibrary();
00163 #endif
00164 return 0;
00165 }