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