summaryrefslogtreecommitdiff
blob: 2f389cfac982a8a37636e461520d6bce14551817 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
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 <signal.h>
 #include <math.h>
 #include <errno.h>
+#include <time.h>
 #include <ctype.h>
 #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(&currentTime);
+
+         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(&currentTime);
+            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