1 /*
2    minibz2
3       libbz2.dll test program.
4       by Yoshioka Tsuneo(QWF00133@nifty.ne.jp/tsuneo-y@is.aist-nara.ac.jp)
5       This file is Public Domain.
6       welcome any email to me.
7 
8    usage: minibz2 [-d] [-{1,2,..9}] [[srcfilename] destfilename]
9 */
10 
11 #define BZ_IMPORT
12 #include <stdio.h>
13 #include <stdlib.h>
14 #include "bzlib.h"
15 #ifdef _WIN32
16 #include <io.h>
17 #endif
18 
19 
20 #ifdef _WIN32
21 
22 #include <windows.h>
23 static int BZ2DLLLoaded = 0;
24 static HINSTANCE BZ2DLLhLib;
BZ2DLLLoadLibrary(void)25 int BZ2DLLLoadLibrary(void)
26 {
27    HINSTANCE hLib;
28 
29    if(BZ2DLLLoaded==1){return 0;}
30    hLib=LoadLibrary("libbz2.dll");
31    if(hLib == NULL){
32       puts("Can't load libbz2.dll");
33       return -1;
34    }
35    BZ2DLLLoaded=1;
36    BZ2DLLhLib=hLib;
37    bzlibVersion=GetProcAddress(hLib,"bzlibVersion");
38    bzopen=GetProcAddress(hLib,"bzopen");
39    bzdopen=GetProcAddress(hLib,"bzdopen");
40    bzread=GetProcAddress(hLib,"bzread");
41    bzwrite=GetProcAddress(hLib,"bzwrite");
42    bzflush=GetProcAddress(hLib,"bzflush");
43    bzclose=GetProcAddress(hLib,"bzclose");
44    bzerror=GetProcAddress(hLib,"bzerror");
45    return 0;
46 
47 }
BZ2DLLFreeLibrary(void)48 int BZ2DLLFreeLibrary(void)
49 {
50    if(BZ2DLLLoaded==0){return 0;}
51    FreeLibrary(BZ2DLLhLib);
52    BZ2DLLLoaded=0;
53 }
54 #endif /* WIN32 */
55 
usage(void)56 void usage(void)
57 {
58    puts("usage: minibz2 [-d] [-{1,2,..9}] [[srcfilename] destfilename]");
59 }
60 
main(int argc,char * argv[])61 int main(int argc,char *argv[])
62 {
63    int decompress = 0;
64    int level = 9;
65    char *fn_r = NULL;
66    char *fn_w = NULL;
67 
68 #ifdef _WIN32
69    if(BZ2DLLLoadLibrary()<0){
70       puts("can't load dll");
71       exit(1);
72    }
73 #endif
74    while(++argv,--argc){
75       if(**argv =='-' || **argv=='/'){
76          char *p;
77 
78          for(p=*argv+1;*p;p++){
79             if(*p=='d'){
80                decompress = 1;
81             }else if('1'<=*p && *p<='9'){
82                level = *p - '0';
83             }else{
84                usage();
85                exit(1);
86             }
87          }
88       }else{
89          break;
90       }
91    }
92    if(argc>=1){
93       fn_r = *argv;
94       argc--;argv++;
95    }else{
96       fn_r = NULL;
97    }
98    if(argc>=1){
99       fn_w = *argv;
100       argc--;argv++;
101    }else{
102       fn_w = NULL;
103    }
104    {
105       int len;
106       char buff[0x1000];
107       char mode[10];
108 
109       if(decompress){
110          BZFILE *BZ2fp_r = NULL;
111          FILE *fp_w = NULL;
112 
113          if(fn_w){
114             if((fp_w = fopen(fn_w,"wb"))==NULL){
115                printf("can't open [%s]\n",fn_w);
116                perror("reason:");
117                exit(1);
118             }
119          }else{
120             fp_w = stdout;
121          }
122          if((BZ2fp_r == NULL && (BZ2fp_r = bzdopen(fileno(stdin),"rb"))==NULL)
123             || (BZ2fp_r != NULL && (BZ2fp_r = bzopen(fn_r,"rb"))==NULL)){
124             printf("can't bz2openstream\n");
125             exit(1);
126          }
127          while((len=bzread(BZ2fp_r,buff,0x1000))>0){
128             fwrite(buff,1,len,fp_w);
129          }
130          bzclose(BZ2fp_r);
131          if(fp_w != stdout) fclose(fp_w);
132       }else{
133          BZFILE *BZ2fp_w = NULL;
134          FILE *fp_r = NULL;
135 
136          if(fn_r){
137             if((fp_r = fopen(fn_r,"rb"))==NULL){
138                printf("can't open [%s]\n",fn_r);
139                perror("reason:");
140                exit(1);
141             }
142          }else{
143             fp_r = stdin;
144          }
145          mode[0]='w';
146          mode[1] = '0' + level;
147          mode[2] = '\0';
148 
149          if((fn_w == NULL && (BZ2fp_w = bzdopen(fileno(stdout),mode))==NULL)
150             || (fn_w !=NULL && (BZ2fp_w = bzopen(fn_w,mode))==NULL)){
151             printf("can't bz2openstream\n");
152             exit(1);
153          }
154          while((len=fread(buff,1,0x1000,fp_r))>0){
155             bzwrite(BZ2fp_w,buff,len);
156          }
157          bzclose(BZ2fp_w);
158          if(fp_r!=stdin)fclose(fp_r);
159       }
160    }
161 #ifdef _WIN32
162    BZ2DLLFreeLibrary();
163 #endif
164    return 0;
165 }
166