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