Ripped from Mandrake. http://bugs.gentoo.org/show_bug.cgi?id=82192 --- bzip2-1.0.2.org/bzip2.1 +++ bzip2-1.0.2/bzip2.1 @@ -235,6 +235,10 @@ Suppress non-essential warning messages. Messages pertaining to I/O errors and other critical events will not be suppressed. .TP +.B \-p --show-progress +Show percentage of input-file done and while compressing show the percentage +of the original file the new file is. +.TP .B \-v --verbose Verbose mode -- show the compression ratio for each file processed. Further \-v's increase the verbosity level, spewing out lots of --- bzip2-1.0.2.org/bzip2.c +++ bzip2-1.0.2/bzip2.c @@ -145,6 +145,7 @@ #include #include #include +#include #include #include "bzlib.h" @@ -301,6 +302,7 @@ Char progNameReally[FILE_NAME_LEN]; FILE *outputHandleJustInCase; Int32 workFactor; +Char showProgress; static void panic ( Char* ) NORETURN; static void ioError ( void ) NORETURN; @@ -425,6 +427,12 @@ UInt32 nbytes_in_lo32, nbytes_in_hi32; UInt32 nbytes_out_lo32, nbytes_out_hi32; Int32 bzerr, bzerr_dummy, ret; + double fileSize = 0; /* initialized to make the compiler stop crying */ + /* double because big files might otherwhise give + * overflows. not long long since not all compilers + * support that one + */ + time_t startTime, currentTime; SET_BINARY_MODE(stream); SET_BINARY_MODE(zStream); @@ -432,12 +440,21 @@ if (ferror(stream)) goto errhandler_io; if (ferror(zStream)) goto errhandler_io; + if ((srcMode == SM_F2F || srcMode == SM_F2O) && showProgress == True) { + (void)fseek(stream, 0, SEEK_END); + fileSize = (double)ftell(stream); + rewind(stream); + if (verbosity >= 1) + fprintf(stderr, "Input-file size: %ld\n", (long)fileSize); + } + bzf = BZ2_bzWriteOpen ( &bzerr, zStream, blockSize100k, verbosity, workFactor ); if (bzerr != BZ_OK) goto errhandler; if (verbosity >= 2) fprintf ( stderr, "\n" ); + time(&startTime); while (True) { if (myfeof(stream)) break; @@ -446,13 +463,32 @@ if (nIbuf > 0) BZ2_bzWrite ( &bzerr, bzf, (void*)ibuf, nIbuf ); if (bzerr != BZ_OK) goto errhandler; + if ((srcMode == SM_F2F || srcMode == SM_F2O) && showProgress == True) + { + time(¤tTime); + + if ((currentTime - startTime) > 1) { /* show progress every 2 seconds */ + double curInPos = (double)ftell(stream); + double curOutPos = (double)ftell(zStream); + + startTime = currentTime; + + fprintf(stderr, "%.2f%% done", (curInPos * 100.0) / fileSize); + if (srcMode == SM_F2F) + { + fprintf(stderr, ", new size: %.2f%%", (curOutPos * 100.0) / curInPos); + } + + fprintf(stderr, " \r"); + } + } } 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; @@ -526,6 +562,8 @@ UChar unused[BZ_MAX_UNUSED]; Int32 nUnused; UChar* unusedTmp; + double fileSize = 0; /* initialized to make the compiler stop crying */ + time_t startTime, currentTime; nUnused = 0; streamNo = 0; @@ -533,9 +571,19 @@ SET_BINARY_MODE(stream); SET_BINARY_MODE(zStream); + if ((srcMode == SM_F2F || srcMode == SM_F2O) && showProgress == True) { + long dummy = ftell(zStream); + (void)fseek(zStream, 0, SEEK_END); + fileSize = (double)ftell(zStream); + (void)fseek(zStream, dummy, SEEK_SET); + if (verbosity >= 1) + fprintf(stderr, "Input-file size: %ld\n", (long)fileSize); + } + if (ferror(stream)) goto errhandler_io; if (ferror(zStream)) goto errhandler_io; + time(&startTime); while (True) { bzf = BZ2_bzReadOpen ( @@ -551,6 +599,17 @@ if ((bzerr == BZ_OK || bzerr == BZ_STREAM_END) && nread > 0) fwrite ( obuf, sizeof(UChar), nread, stream ); if (ferror(stream)) goto errhandler_io; + + if ((srcMode == SM_F2F || srcMode == SM_F2O) && showProgress == True) { + time(¤tTime); + if ((currentTime - startTime) >= 2) + { + double curInPos = (double)ftell(zStream); + startTime = currentTime; + + fprintf(stderr, "%.2f%% done\r", (curInPos * 100.0) / fileSize); + } + } } if (bzerr != BZ_STREAM_END) goto errhandler; @@ -1872,6 +1931,7 @@ deleteOutputOnInterrupt = False; exitValue = 0; i = j = 0; /* avoid bogus warning from egcs-1.1.X */ + showProgress = False; /*-- Set up signal handlers for mem access errors --*/ signal (SIGSEGV, mySIGSEGVorSIGBUScatcher); @@ -1949,6 +2009,7 @@ case 'k': keepInputFiles = True; break; case 's': smallMode = True; break; case 'q': noisy = False; break; + case 'p': showProgress = True; break; case '1': blockSize100k = 1; break; case '2': blockSize100k = 2; break; case '3': blockSize100k = 3; break; @@ -1985,6 +2046,7 @@ if (ISFLAG("--keep")) keepInputFiles = True; else if (ISFLAG("--small")) smallMode = True; else if (ISFLAG("--quiet")) noisy = False; else + if (ISFLAG("--show-progress")) showProgress = True; else if (ISFLAG("--version")) license(); else if (ISFLAG("--license")) license(); else if (ISFLAG("--exponential")) workFactor = 1; else