1172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich/*
2172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich   minibz2
3172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich      libbz2.dll test program.
4172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich      by Yoshioka Tsuneo (tsuneo@rr.iij4u.or.jp)
5172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich      This file is Public Domain.  Welcome any email to me.
6172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich
7172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich   usage: minibz2 [-d] [-{1,2,..9}] [[srcfilename] destfilename]
8172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich*/
9172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich
10172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich#define BZ_IMPORT
11172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich#include <stdio.h>
12172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich#include <stdlib.h>
13172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich#include "bzlib.h"
14172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich#ifdef _WIN32
15172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich#include <io.h>
16172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich#endif
17172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich
18172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich
19172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich#ifdef _WIN32
20172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich
21172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich#define BZ2_LIBNAME "libbz2-1.0.2.DLL"
22172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich
23172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich#include <windows.h>
24172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevichstatic int BZ2DLLLoaded = 0;
25172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevichstatic HINSTANCE BZ2DLLhLib;
26172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevichint BZ2DLLLoadLibrary(void)
27172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich{
28172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich   HINSTANCE hLib;
29172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich
30172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich   if(BZ2DLLLoaded==1){return 0;}
31172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich   hLib=LoadLibrary(BZ2_LIBNAME);
32172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich   if(hLib == NULL){
33172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich      fprintf(stderr,"Can't load %s\n",BZ2_LIBNAME);
34172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich      return -1;
35172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich   }
36172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich   BZ2_bzlibVersion=GetProcAddress(hLib,"BZ2_bzlibVersion");
37172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich   BZ2_bzopen=GetProcAddress(hLib,"BZ2_bzopen");
38172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich   BZ2_bzdopen=GetProcAddress(hLib,"BZ2_bzdopen");
39172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich   BZ2_bzread=GetProcAddress(hLib,"BZ2_bzread");
40172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich   BZ2_bzwrite=GetProcAddress(hLib,"BZ2_bzwrite");
41172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich   BZ2_bzflush=GetProcAddress(hLib,"BZ2_bzflush");
42172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich   BZ2_bzclose=GetProcAddress(hLib,"BZ2_bzclose");
43172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich   BZ2_bzerror=GetProcAddress(hLib,"BZ2_bzerror");
44172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich
45172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich   if (!BZ2_bzlibVersion || !BZ2_bzopen || !BZ2_bzdopen
46172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich       || !BZ2_bzread || !BZ2_bzwrite || !BZ2_bzflush
47172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich       || !BZ2_bzclose || !BZ2_bzerror) {
48172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich      fprintf(stderr,"GetProcAddress failed.\n");
49172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich      return -1;
50172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich   }
51172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich   BZ2DLLLoaded=1;
52172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich   BZ2DLLhLib=hLib;
53172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich   return 0;
54172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich
55172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich}
56172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevichint BZ2DLLFreeLibrary(void)
57172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich{
58172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich   if(BZ2DLLLoaded==0){return 0;}
59172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich   FreeLibrary(BZ2DLLhLib);
60172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich   BZ2DLLLoaded=0;
61172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich}
62172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich#endif /* WIN32 */
63172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich
64172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevichvoid usage(void)
65172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich{
66172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich   puts("usage: minibz2 [-d] [-{1,2,..9}] [[srcfilename] destfilename]");
67172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich}
68172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich
69172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevichint main(int argc,char *argv[])
70172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich{
71172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich   int decompress = 0;
72172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich   int level = 9;
73172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich   char *fn_r = NULL;
74172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich   char *fn_w = NULL;
75172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich
76172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich#ifdef _WIN32
77172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich   if(BZ2DLLLoadLibrary()<0){
78172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich      fprintf(stderr,"Loading of %s failed.  Giving up.\n", BZ2_LIBNAME);
79172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich      exit(1);
80172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich   }
81172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich   printf("Loading of %s succeeded.  Library version is %s.\n",
82172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich          BZ2_LIBNAME, BZ2_bzlibVersion() );
83172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich#endif
84172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich   while(++argv,--argc){
85172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich      if(**argv =='-' || **argv=='/'){
86172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich         char *p;
87172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich
88172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich         for(p=*argv+1;*p;p++){
89172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich            if(*p=='d'){
90172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich               decompress = 1;
91172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich            }else if('1'<=*p && *p<='9'){
92172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich               level = *p - '0';
93172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich            }else{
94172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich               usage();
95172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich               exit(1);
96172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich            }
97172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich         }
98172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich      }else{
99172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich         break;
100172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich      }
101172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich   }
102172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich   if(argc>=1){
103172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich      fn_r = *argv;
104172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich      argc--;argv++;
105172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich   }else{
106172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich      fn_r = NULL;
107172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich   }
108172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich   if(argc>=1){
109172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich      fn_w = *argv;
110172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich      argc--;argv++;
111172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich   }else{
112172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich      fn_w = NULL;
113172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich   }
114172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich   {
115172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich      int len;
116172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich      char buff[0x1000];
117172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich      char mode[10];
118172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich
119172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich      if(decompress){
120172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich         BZFILE *BZ2fp_r = NULL;
121172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich         FILE *fp_w = NULL;
122172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich
123172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich         if(fn_w){
124172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich            if((fp_w = fopen(fn_w,"wb"))==NULL){
125172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich               printf("can't open [%s]\n",fn_w);
126172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich               perror("reason:");
127172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich               exit(1);
128172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich            }
129172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich         }else{
130172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich            fp_w = stdout;
131172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich         }
132172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich         if((fn_r == NULL && (BZ2fp_r = BZ2_bzdopen(fileno(stdin),"rb"))==NULL)
133172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich            || (fn_r != NULL && (BZ2fp_r = BZ2_bzopen(fn_r,"rb"))==NULL)){
134172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich            printf("can't bz2openstream\n");
135172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich            exit(1);
136172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich         }
137172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich         while((len=BZ2_bzread(BZ2fp_r,buff,0x1000))>0){
138172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich            fwrite(buff,1,len,fp_w);
139172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich         }
140172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich         BZ2_bzclose(BZ2fp_r);
141172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich         if(fp_w != stdout) fclose(fp_w);
142172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich      }else{
143172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich         BZFILE *BZ2fp_w = NULL;
144172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich         FILE *fp_r = NULL;
145172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich
146172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich         if(fn_r){
147172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich            if((fp_r = fopen(fn_r,"rb"))==NULL){
148172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich               printf("can't open [%s]\n",fn_r);
149172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich               perror("reason:");
150172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich               exit(1);
151172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich            }
152172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich         }else{
153172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich            fp_r = stdin;
154172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich         }
155172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich         mode[0]='w';
156172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich         mode[1] = '0' + level;
157172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich         mode[2] = '\0';
158172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich
159172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich         if((fn_w == NULL && (BZ2fp_w = BZ2_bzdopen(fileno(stdout),mode))==NULL)
160172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich            || (fn_w !=NULL && (BZ2fp_w = BZ2_bzopen(fn_w,mode))==NULL)){
161172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich            printf("can't bz2openstream\n");
162172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich            exit(1);
163172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich         }
164172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich         while((len=fread(buff,1,0x1000,fp_r))>0){
165172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich            BZ2_bzwrite(BZ2fp_w,buff,len);
166172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich         }
167172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich         BZ2_bzclose(BZ2fp_w);
168172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich         if(fp_r!=stdin)fclose(fp_r);
169172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich      }
170172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich   }
171172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich#ifdef _WIN32
172172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich   BZ2DLLFreeLibrary();
173172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich#endif
174172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich   return 0;
175172b266ed7845eac2edc7e7f8a72371356a9a277Nick Kralevich}
176