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