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