/*      $NetBSD: dlltest.c,v 1.1.1.1 2012/05/07 00:21:46 wiz Exp $      */

/*
  minibz2
     libbz2.dll test program.
     by Yoshioka Tsuneo ([email protected])
     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

#define BZ2_LIBNAME "libbz2-1.0.2.DLL"

#include <windows.h>
static int BZ2DLLLoaded = 0;
static HINSTANCE BZ2DLLhLib;
int BZ2DLLLoadLibrary(void)
{
  HINSTANCE hLib;

  if(BZ2DLLLoaded==1){return 0;}
  hLib=LoadLibrary(BZ2_LIBNAME);
  if(hLib == NULL){
     fprintf(stderr,"Can't load %s\n",BZ2_LIBNAME);
     return -1;
  }
  BZ2_bzlibVersion=GetProcAddress(hLib,"BZ2_bzlibVersion");
  BZ2_bzopen=GetProcAddress(hLib,"BZ2_bzopen");
  BZ2_bzdopen=GetProcAddress(hLib,"BZ2_bzdopen");
  BZ2_bzread=GetProcAddress(hLib,"BZ2_bzread");
  BZ2_bzwrite=GetProcAddress(hLib,"BZ2_bzwrite");
  BZ2_bzflush=GetProcAddress(hLib,"BZ2_bzflush");
  BZ2_bzclose=GetProcAddress(hLib,"BZ2_bzclose");
  BZ2_bzerror=GetProcAddress(hLib,"BZ2_bzerror");

  if (!BZ2_bzlibVersion || !BZ2_bzopen || !BZ2_bzdopen
      || !BZ2_bzread || !BZ2_bzwrite || !BZ2_bzflush
      || !BZ2_bzclose || !BZ2_bzerror) {
     fprintf(stderr,"GetProcAddress failed.\n");
     return -1;
  }
  BZ2DLLLoaded=1;
  BZ2DLLhLib=hLib;
  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){
     fprintf(stderr,"Loading of %s failed.  Giving up.\n", BZ2_LIBNAME);
     exit(1);
  }
  printf("Loading of %s succeeded.  Library version is %s.\n",
         BZ2_LIBNAME, BZ2_bzlibVersion() );
#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((fn_r == NULL && (BZ2fp_r = BZ2_bzdopen(fileno(stdin),"rb"))==NULL)
           || (fn_r != NULL && (BZ2fp_r = BZ2_bzopen(fn_r,"rb"))==NULL)){
           printf("can't bz2openstream\n");
           exit(1);
        }
        while((len=BZ2_bzread(BZ2fp_r,buff,0x1000))>0){
           fwrite(buff,1,len,fp_w);
        }
        BZ2_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 = BZ2_bzdopen(fileno(stdout),mode))==NULL)
           || (fn_w !=NULL && (BZ2fp_w = BZ2_bzopen(fn_w,mode))==NULL)){
           printf("can't bz2openstream\n");
           exit(1);
        }
        while((len=fread(buff,1,0x1000,fp_r))>0){
           BZ2_bzwrite(BZ2fp_w,buff,len);
        }
        BZ2_bzclose(BZ2fp_w);
        if(fp_r!=stdin)fclose(fp_r);
     }
  }
#ifdef _WIN32
  BZ2DLLFreeLibrary();
#endif
  return 0;
}