⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bzip2.c

📁 cygwin, 著名的在win32下模拟unix操作系统的东东
💻 C
📖 第 1 页 / 共 4 页
字号:
/*---------------------------------------------------*//*---------------------------------------------*/static Bool myfeof ( FILE* f ){   Int32 c = fgetc ( f );   if (c == EOF) return True;   ungetc ( c, f );   return False;}/*---------------------------------------------*/static void compressStream ( FILE *stream, FILE *zStream ){   BZFILE* bzf = NULL;   UChar   ibuf[5000];   Int32   nIbuf;   UInt32  nbytes_in_lo32, nbytes_in_hi32;   UInt32  nbytes_out_lo32, nbytes_out_hi32;   Int32   bzerr, bzerr_dummy, ret;   SET_BINARY_MODE(stream);   SET_BINARY_MODE(zStream);   if (ferror(stream)) goto errhandler_io;   if (ferror(zStream)) goto errhandler_io;   bzf = BZ2_bzWriteOpen ( &bzerr, zStream,                            blockSize100k, verbosity, workFactor );      if (bzerr != BZ_OK) goto errhandler;   if (verbosity >= 2) fprintf ( stderr, "\n" );   while (True) {      if (myfeof(stream)) break;      nIbuf = fread ( ibuf, sizeof(UChar), 5000, stream );      if (ferror(stream)) goto errhandler_io;      if (nIbuf > 0) BZ2_bzWrite ( &bzerr, bzf, (void*)ibuf, nIbuf );      if (bzerr != BZ_OK) goto errhandler;   }   BZ2_bzWriteClose64 ( &bzerr, bzf, 0,                         &nbytes_in_lo32, &nbytes_in_hi32,                        &nbytes_out_lo32, &nbytes_out_hi32 );   if (bzerr != BZ_OK) goto errhandler;   if (ferror(zStream)) goto errhandler_io;   ret = fflush ( zStream );   if (ret == EOF) goto errhandler_io;   if (zStream != stdout) {      ret = fclose ( zStream );      if (ret == EOF) goto errhandler_io;   }   if (ferror(stream)) goto errhandler_io;   ret = fclose ( stream );   if (ret == EOF) goto errhandler_io;   if (nbytes_in_lo32 == 0 && nbytes_in_hi32 == 0)       nbytes_in_lo32 = 1;   if (verbosity >= 1) {      Char   buf_nin[32], buf_nout[32];      UInt64 nbytes_in,   nbytes_out;      double nbytes_in_d, nbytes_out_d;      uInt64_from_UInt32s ( &nbytes_in,                             nbytes_in_lo32, nbytes_in_hi32 );      uInt64_from_UInt32s ( &nbytes_out,                             nbytes_out_lo32, nbytes_out_hi32 );      nbytes_in_d  = uInt64_to_double ( &nbytes_in );      nbytes_out_d = uInt64_to_double ( &nbytes_out );      uInt64_toAscii ( buf_nin, &nbytes_in );      uInt64_toAscii ( buf_nout, &nbytes_out );      fprintf ( stderr, "%6.3f:1, %6.3f bits/byte, "                        "%5.2f%% saved, %s in, %s out.\n",                nbytes_in_d / nbytes_out_d,                (8.0 * nbytes_out_d) / nbytes_in_d,                100.0 * (1.0 - nbytes_out_d / nbytes_in_d),                buf_nin,                buf_nout              );   }   return;   errhandler:   BZ2_bzWriteClose64 ( &bzerr_dummy, bzf, 1,                         &nbytes_in_lo32, &nbytes_in_hi32,                        &nbytes_out_lo32, &nbytes_out_hi32 );   switch (bzerr) {      case BZ_CONFIG_ERROR:         configError(); break;      case BZ_MEM_ERROR:         outOfMemory (); break;      case BZ_IO_ERROR:         errhandler_io:         ioError(); break;      default:         panic ( "compress:unexpected error" );   }   panic ( "compress:end" );   /*notreached*/}/*---------------------------------------------*/static Bool uncompressStream ( FILE *zStream, FILE *stream ){   BZFILE* bzf = NULL;   Int32   bzerr, bzerr_dummy, ret, nread, streamNo, i;   UChar   obuf[5000];   UChar   unused[BZ_MAX_UNUSED];   Int32   nUnused;   UChar*  unusedTmp;   nUnused = 0;   streamNo = 0;   SET_BINARY_MODE(stream);   SET_BINARY_MODE(zStream);   if (ferror(stream)) goto errhandler_io;   if (ferror(zStream)) goto errhandler_io;   while (True) {      bzf = BZ2_bzReadOpen (                &bzerr, zStream, verbosity,                (int)smallMode, unused, nUnused            );      if (bzf == NULL || bzerr != BZ_OK) goto errhandler;      streamNo++;      while (bzerr == BZ_OK) {         nread = BZ2_bzRead ( &bzerr, bzf, obuf, 5000 );         if (bzerr == BZ_DATA_ERROR_MAGIC) goto errhandler;         if ((bzerr == BZ_OK || bzerr == BZ_STREAM_END) && nread > 0)            fwrite ( obuf, sizeof(UChar), nread, stream );         if (ferror(stream)) goto errhandler_io;      }      if (bzerr != BZ_STREAM_END) goto errhandler;      BZ2_bzReadGetUnused ( &bzerr, bzf, (void**)(&unusedTmp), &nUnused );      if (bzerr != BZ_OK) panic ( "decompress:bzReadGetUnused" );      for (i = 0; i < nUnused; i++) unused[i] = unusedTmp[i];      BZ2_bzReadClose ( &bzerr, bzf );      if (bzerr != BZ_OK) panic ( "decompress:bzReadGetUnused" );      if (nUnused == 0 && myfeof(zStream)) break;   }   if (ferror(zStream)) goto errhandler_io;   ret = fclose ( zStream );   if (ret == EOF) goto errhandler_io;   if (ferror(stream)) goto errhandler_io;   ret = fflush ( stream );   if (ret != 0) goto errhandler_io;   if (stream != stdout) {      ret = fclose ( stream );      if (ret == EOF) goto errhandler_io;   }   if (verbosity >= 2) fprintf ( stderr, "\n    " );   return True;   errhandler:   BZ2_bzReadClose ( &bzerr_dummy, bzf );   switch (bzerr) {      case BZ_CONFIG_ERROR:         configError(); break;      case BZ_IO_ERROR:         errhandler_io:         ioError(); break;      case BZ_DATA_ERROR:         crcError();      case BZ_MEM_ERROR:         outOfMemory();      case BZ_UNEXPECTED_EOF:         compressedStreamEOF();      case BZ_DATA_ERROR_MAGIC:         if (zStream != stdin) fclose(zStream);         if (stream != stdout) fclose(stream);         if (streamNo == 1) {            return False;         } else {            if (noisy)            fprintf ( stderr,                       "\n%s: %s: trailing garbage after EOF ignored\n",                      progName, inName );            return True;                }      default:         panic ( "decompress:unexpected error" );   }   panic ( "decompress:end" );   return True; /*notreached*/}/*---------------------------------------------*/static Bool testStream ( FILE *zStream ){   BZFILE* bzf = NULL;   Int32   bzerr, bzerr_dummy, ret, nread, streamNo, i;   UChar   obuf[5000];   UChar   unused[BZ_MAX_UNUSED];   Int32   nUnused;   UChar*  unusedTmp;   nUnused = 0;   streamNo = 0;   SET_BINARY_MODE(zStream);   if (ferror(zStream)) goto errhandler_io;   while (True) {      bzf = BZ2_bzReadOpen (                &bzerr, zStream, verbosity,                (int)smallMode, unused, nUnused            );      if (bzf == NULL || bzerr != BZ_OK) goto errhandler;      streamNo++;      while (bzerr == BZ_OK) {         nread = BZ2_bzRead ( &bzerr, bzf, obuf, 5000 );         if (bzerr == BZ_DATA_ERROR_MAGIC) goto errhandler;      }      if (bzerr != BZ_STREAM_END) goto errhandler;      BZ2_bzReadGetUnused ( &bzerr, bzf, (void**)(&unusedTmp), &nUnused );      if (bzerr != BZ_OK) panic ( "test:bzReadGetUnused" );      for (i = 0; i < nUnused; i++) unused[i] = unusedTmp[i];      BZ2_bzReadClose ( &bzerr, bzf );      if (bzerr != BZ_OK) panic ( "test:bzReadGetUnused" );      if (nUnused == 0 && myfeof(zStream)) break;   }   if (ferror(zStream)) goto errhandler_io;   ret = fclose ( zStream );   if (ret == EOF) goto errhandler_io;   if (verbosity >= 2) fprintf ( stderr, "\n    " );   return True;   errhandler:   BZ2_bzReadClose ( &bzerr_dummy, bzf );   if (verbosity == 0)       fprintf ( stderr, "%s: %s: ", progName, inName );   switch (bzerr) {      case BZ_CONFIG_ERROR:         configError(); break;      case BZ_IO_ERROR:         errhandler_io:         ioError(); break;      case BZ_DATA_ERROR:         fprintf ( stderr,                   "data integrity (CRC) error in data\n" );         return False;      case BZ_MEM_ERROR:         outOfMemory();      case BZ_UNEXPECTED_EOF:         fprintf ( stderr,                   "file ends unexpectedly\n" );         return False;      case BZ_DATA_ERROR_MAGIC:         if (zStream != stdin) fclose(zStream);         if (streamNo == 1) {          fprintf ( stderr,                     "bad magic number (file not created by bzip2)\n" );            return False;         } else {            if (noisy)            fprintf ( stderr,                       "trailing garbage after EOF ignored\n" );            return True;                }      default:         panic ( "test:unexpected error" );   }   panic ( "test:end" );   return True; /*notreached*/}/*---------------------------------------------------*//*--- Error [non-] handling grunge                ---*//*---------------------------------------------------*//*---------------------------------------------*/staticvoid setExit ( Int32 v ){   if (v > exitValue) exitValue = v;}/*---------------------------------------------*/static void cadvise ( void ){   if (noisy)   fprintf (      stderr,      "\nIt is possible that the compressed file(s) have become corrupted.\n"        "You can use the -tvv option to test integrity of such files.\n\n"        "You can use the `bzip2recover' program to *attempt* to recover\n"        "data from undamaged sections of corrupted files.\n\n"    );}/*---------------------------------------------*/static void showFileNames ( void ){   if (noisy)   fprintf (      stderr,      "\tInput file = %s, output file = %s\n",      inName, outName    );}/*---------------------------------------------*/static void cleanUpAndFail ( Int32 ec ){   IntNative retVal;   if ( srcMode == SM_F2F         && opMode != OM_TEST        && deleteOutputOnInterrupt ) {      if (noisy)      fprintf ( stderr, "%s: Deleting output file %s, if it exists.\n",                progName, outName );      if (outputHandleJustInCase != NULL)         fclose ( outputHandleJustInCase );      retVal = remove ( outName );      if (retVal != 0)         fprintf ( stderr,                   "%s: WARNING: deletion of output file (apparently) failed.\n",                   progName );   }   if (noisy && numFileNames > 0 && numFilesProcessed < numFileNames) {      fprintf ( stderr,                 "%s: WARNING: some files have not been processed:\n"                "\t%d specified on command line, %d not processed yet.\n\n",                progName, numFileNames,                           numFileNames - numFilesProcessed );   }   setExit(ec);   exit(exitValue);}/*---------------------------------------------*/static void panic ( Char* s ){   fprintf ( stderr,             "\n%s: PANIC -- internal consistency error:\n"             "\t%s\n"             "\tThis is a BUG.  Please report it to me at:\n"             "\tjseward@acm.org\n",             progName, s );   showFileNames();   cleanUpAndFail( 3 );}/*---------------------------------------------*/static void crcError ( void ){   fprintf ( stderr,             "\n%s: Data integrity error when decompressing.\n",             progName );   showFileNames();   cadvise();   cleanUpAndFail( 2 );}/*---------------------------------------------*/static void compressedStreamEOF ( void ){   fprintf ( stderr,             "\n%s: Compressed file ends unexpectedly;\n\t"             "perhaps it is corrupted?  *Possible* reason follows.\n",             progName );   perror ( progName );   showFileNames();   cadvise();   cleanUpAndFail( 2 );}/*---------------------------------------------*/static void ioError ( void ){   fprintf ( stderr,             "\n%s: I/O or other error, bailing out.  "             "Possible reason follows.\n",             progName );   perror ( progName );   showFileNames();   cleanUpAndFail( 1 );}/*---------------------------------------------*/static void mySignalCatcher ( IntNative n ){   fprintf ( stderr,             "\n%s: Control-C or similar caught, quitting.\n",             progName );   cleanUpAndFail(1);}/*---------------------------------------------*/static void mySIGSEGVorSIGBUScatcher ( IntNative n ){   if (opMode == OM_Z)      fprintf (       stderr,      "\n%s: Caught a SIGSEGV or SIGBUS whilst compressing.\n"      "\n"      "   Possible causes are (most likely first):\n"      "   (1) This computer has unreliable memory or cache hardware\n"      "       (a surprisingly common problem; try a different machine.)\n"      "   (2) A bug in the compiler used to create this executable\n"      "       (unlikely, if you didn't compile bzip2 yourself.)\n"      "   (3) A real bug in bzip2 -- I hope this should never be the case.\n"      "   The user's manual, Section 4.3, has more info on (1) and (2).\n"      "   \n"      "   If you suspect this is a bug in bzip2, or are unsure about (1)\n"      "   or (2), feel free to report it to me at: jseward@acm.org.\n"      "   Section 4.3 of the user's manual describes the info a useful\n"      "   bug report should have.  If the manual is available on your\n"      "   system, please try and read it before mailing me.  If you don't\n"      "   have the manual or can't be bothered to read it, mail me anyway.\n"      "\n",      progName );      else      fprintf (       stderr,      "\n%s: Caught a SIGSEGV or SIGBUS whilst decompressing.\n"      "\n"      "   Possible causes are (most likely first):\n"      "   (1) The compressed data is corrupted, and bzip2's usual checks\n"      "       failed to detect this.  Try bzip2 -tvv my_file.bz2.\n"      "   (2) This computer has unreliable memory or cache hardware\n"      "       (a surprisingly common problem; try a different machine.)\n"      "   (3) A bug in the compiler used to create this executable\n"      "       (unlikely, if you didn't compile bzip2 yourself.)\n"      "   (4) A real bug in bzip2 -- I hope this should never be the case.\n"      "   The user's manual, Section 4.3, has more info on (2) and (3).\n"      "   \n"      "   If you suspect this is a bug in bzip2, or are unsure about (2)\n"      "   or (3), feel free to report it to me at: jseward@acm.org.\n"      "   Section 4.3 of the user's manual describes the info a useful\n"      "   bug report should have.  If the manual is available on your\n"      "   system, please try and read it before mailing me.  If you don't\n"      "   have the manual or can't be bothered to read it, mail me anyway.\n"      "\n",      progName );   showFileNames();   if (opMode == OM_Z)      cleanUpAndFail( 3 ); else      { cadvise(); cleanUpAndFail( 2 ); }}/*---------------------------------------------*/static void outOfMemory ( void ){   fprintf ( stderr,             "\n%s: couldn't allocate enough memory\n",             progName );   showFileNames();   cleanUpAndFail(1);}/*---------------------------------------------*/static void configError ( void )

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -