xref: /netbsd-src/external/bsd/bzip2/dist/dlltest.c (revision 4f9a14591a53924af02e2a35ceb2ac984e9c0ffe)
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