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