dlltest.c 4.3 KB

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