mirror of
https://sourceware.org/git/bzip2.git
synced 2026-01-26 09:57:51 +00:00
166 lines
3.6 KiB
C
166 lines
3.6 KiB
C
/*
|
|
minibz2
|
|
libbz2.dll test program.
|
|
by Yoshioka Tsuneo(QWF00133@nifty.ne.jp/tsuneo-y@is.aist-nara.ac.jp)
|
|
This file is Public Domain.
|
|
welcome any email to me.
|
|
|
|
usage: minibz2 [-d] [-{1,2,..9}] [[srcfilename] destfilename]
|
|
*/
|
|
|
|
#define BZ_IMPORT
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include "bzlib.h"
|
|
#ifdef _WIN32
|
|
#include <io.h>
|
|
#endif
|
|
|
|
|
|
#ifdef _WIN32
|
|
|
|
#include <windows.h>
|
|
static int BZ2DLLLoaded = 0;
|
|
static HINSTANCE BZ2DLLhLib;
|
|
int BZ2DLLLoadLibrary(void)
|
|
{
|
|
HINSTANCE hLib;
|
|
|
|
if(BZ2DLLLoaded==1){return 0;}
|
|
hLib=LoadLibrary("libbz2.dll");
|
|
if(hLib == NULL){
|
|
puts("Can't load libbz2.dll");
|
|
return -1;
|
|
}
|
|
BZ2DLLLoaded=1;
|
|
BZ2DLLhLib=hLib;
|
|
bzlibVersion=GetProcAddress(hLib,"bzlibVersion");
|
|
bzopen=GetProcAddress(hLib,"bzopen");
|
|
bzdopen=GetProcAddress(hLib,"bzdopen");
|
|
bzread=GetProcAddress(hLib,"bzread");
|
|
bzwrite=GetProcAddress(hLib,"bzwrite");
|
|
bzflush=GetProcAddress(hLib,"bzflush");
|
|
bzclose=GetProcAddress(hLib,"bzclose");
|
|
bzerror=GetProcAddress(hLib,"bzerror");
|
|
return 0;
|
|
|
|
}
|
|
int BZ2DLLFreeLibrary(void)
|
|
{
|
|
if(BZ2DLLLoaded==0){return 0;}
|
|
FreeLibrary(BZ2DLLhLib);
|
|
BZ2DLLLoaded=0;
|
|
}
|
|
#endif /* WIN32 */
|
|
|
|
void usage(void)
|
|
{
|
|
puts("usage: minibz2 [-d] [-{1,2,..9}] [[srcfilename] destfilename]");
|
|
}
|
|
|
|
int main(int argc,char *argv[])
|
|
{
|
|
int decompress = 0;
|
|
int level = 9;
|
|
char *fn_r = NULL;
|
|
char *fn_w = NULL;
|
|
|
|
#ifdef _WIN32
|
|
if(BZ2DLLLoadLibrary()<0){
|
|
puts("can't load dll");
|
|
exit(1);
|
|
}
|
|
#endif
|
|
while(++argv,--argc){
|
|
if(**argv =='-' || **argv=='/'){
|
|
char *p;
|
|
|
|
for(p=*argv+1;*p;p++){
|
|
if(*p=='d'){
|
|
decompress = 1;
|
|
}else if('1'<=*p && *p<='9'){
|
|
level = *p - '0';
|
|
}else{
|
|
usage();
|
|
exit(1);
|
|
}
|
|
}
|
|
}else{
|
|
break;
|
|
}
|
|
}
|
|
if(argc>=1){
|
|
fn_r = *argv;
|
|
argc--;argv++;
|
|
}else{
|
|
fn_r = NULL;
|
|
}
|
|
if(argc>=1){
|
|
fn_w = *argv;
|
|
argc--;argv++;
|
|
}else{
|
|
fn_w = NULL;
|
|
}
|
|
{
|
|
int len;
|
|
char buff[0x1000];
|
|
char mode[10];
|
|
|
|
if(decompress){
|
|
BZFILE *BZ2fp_r = NULL;
|
|
FILE *fp_w = NULL;
|
|
|
|
if(fn_w){
|
|
if((fp_w = fopen(fn_w,"wb"))==NULL){
|
|
printf("can't open [%s]\n",fn_w);
|
|
perror("reason:");
|
|
exit(1);
|
|
}
|
|
}else{
|
|
fp_w = stdout;
|
|
}
|
|
if((BZ2fp_r == NULL && (BZ2fp_r = bzdopen(fileno(stdin),"rb"))==NULL)
|
|
|| (BZ2fp_r != NULL && (BZ2fp_r = bzopen(fn_r,"rb"))==NULL)){
|
|
printf("can't bz2openstream\n");
|
|
exit(1);
|
|
}
|
|
while((len=bzread(BZ2fp_r,buff,0x1000))>0){
|
|
fwrite(buff,1,len,fp_w);
|
|
}
|
|
bzclose(BZ2fp_r);
|
|
if(fp_w != stdout) fclose(fp_w);
|
|
}else{
|
|
BZFILE *BZ2fp_w = NULL;
|
|
FILE *fp_r = NULL;
|
|
|
|
if(fn_r){
|
|
if((fp_r = fopen(fn_r,"rb"))==NULL){
|
|
printf("can't open [%s]\n",fn_r);
|
|
perror("reason:");
|
|
exit(1);
|
|
}
|
|
}else{
|
|
fp_r = stdin;
|
|
}
|
|
mode[0]='w';
|
|
mode[1] = '0' + level;
|
|
mode[2] = '\0';
|
|
|
|
if((fn_w == NULL && (BZ2fp_w = bzdopen(fileno(stdout),mode))==NULL)
|
|
|| (fn_w !=NULL && (BZ2fp_w = bzopen(fn_w,mode))==NULL)){
|
|
printf("can't bz2openstream\n");
|
|
exit(1);
|
|
}
|
|
while((len=fread(buff,1,0x1000,fp_r))>0){
|
|
bzwrite(BZ2fp_w,buff,len);
|
|
}
|
|
bzclose(BZ2fp_w);
|
|
if(fp_r!=stdin)fclose(fp_r);
|
|
}
|
|
}
|
|
#ifdef _WIN32
|
|
BZ2DLLFreeLibrary();
|
|
#endif
|
|
return 0;
|
|
}
|