:: commit f25cc45a638e5bedcc58ebaeea59b0a1e526c98c

Kamila Szewczyk <27734421+kspalaiologos@users.noreply.github.com> — 2022-10-27 08:21

parents: 528946ac71

WIP on #64 (#66)

diff --git a/src/main.c b/src/main.c
index 30812d9..af9e018 100644
--- a/src/main.c
+++ b/src/main.c
@@ -61,6 +61,7 @@ static void help() {
             "  -t, --test        verify validity of compressed data\n"
             "  -h, --help        display an usage overview\n"
             "  -f, --force       force overwriting output if it already exists\n"
+            "  -v, --verbose     verbose mode (display more information)\n"
             "  -V, --version     display version information\n"
             "Extra flags:\n"
             "  -c, --stdout      force writing to standard output\n"
@@ -139,7 +140,9 @@ static void close_out_file(FILE * des) {
     }
 }
 
-static int process(FILE * input_des, FILE * output_des, int mode, int block_size, int workers) {
+static int process(FILE * input_des, FILE * output_des, int mode, int block_size, int workers, int verbose, char * file_name) {
+    uint64_t bytes_read = 0, bytes_written = 0;
+
     if ((mode == MODE_ENCODE && isatty(fileno(output_des))) ||
         ((mode == MODE_DECODE || mode == MODE_TEST) && isatty(fileno(input_des)))) {
         fprintf(stderr, "Refusing to read/write binary data from/to the terminal.\n");
@@ -154,6 +157,8 @@ static int process(FILE * input_des, FILE * output_des, int mode, int block_size
 
             write_neutral_s32(byteswap_buf, block_size);
             xwrite(byteswap_buf, 4, 1, output_des);
+
+            bytes_written += 9;
             break;
         case MODE_DECODE:
         case MODE_TEST: {
@@ -175,6 +180,7 @@ static int process(FILE * input_des, FILE * output_des, int mode, int block_size
                 return 1;
             }
 
+            bytes_read += 9;
             break;
         }
     }
@@ -205,6 +211,7 @@ static int process(FILE * input_des, FILE * output_des, int mode, int block_size
             s32 read_count;
             while (!feof(input_des)) {
                 read_count = xread(buffer, 1, block_size, input_des);
+                bytes_read += read_count;
 
                 s32 new_size = bz3_encode_block(state, buffer, read_count);
                 if (new_size == -1) {
@@ -217,6 +224,7 @@ static int process(FILE * input_des, FILE * output_des, int mode, int block_size
                 write_neutral_s32(byteswap_buf, read_count);
                 xwrite(byteswap_buf, 4, 1, output_des);
                 xwrite(buffer, new_size, 1, output_des);
+                bytes_written += 8 + new_size;
             }
             fflush(output_des);
         } else if (mode == MODE_DECODE) {
@@ -228,11 +236,13 @@ static int process(FILE * input_des, FILE * output_des, int mode, int block_size
                 xread_noeof(&byteswap_buf, 1, 4, input_des);
                 old_size = read_neutral_s32(byteswap_buf);
                 xread_noeof(buffer, 1, new_size, input_des);
+                bytes_read += 8 + new_size;
                 if (bz3_decode_block(state, buffer, new_size, old_size) == -1) {
                     fprintf(stderr, "Failed to decode a block: %s\n", bz3_strerror(state));
                     return 1;
                 }
                 xwrite(buffer, old_size, 1, output_des);
+                bytes_written += old_size;
             }
             fflush(output_des);
         } else if (mode == MODE_TEST) {
@@ -243,6 +253,7 @@ static int process(FILE * input_des, FILE * output_des, int mode, int block_size
                 xread_noeof(&byteswap_buf, 1, 4, input_des);
                 old_size = read_neutral_s32(byteswap_buf);
                 xread_noeof(buffer, 1, new_size, input_des);
+                bytes_read += 8 + new_size;
                 if (bz3_decode_block(state, buffer, new_size, old_size) == -1) {
                     fprintf(stderr, "Failed to decode a block: %s\n", bz3_strerror(state));
                     return 1;
@@ -282,6 +293,7 @@ static int process(FILE * input_des, FILE * output_des, int mode, int block_size
                 s32 i = 0;
                 for (; i < workers; i++) {
                     size_t read_count = xread(buffers[i], 1, block_size, input_des);
+                    bytes_read += read_count;
                     sizes[i] = old_sizes[i] = read_count;
                     if (read_count < block_size) {
                         i++;
@@ -301,6 +313,7 @@ static int process(FILE * input_des, FILE * output_des, int mode, int block_size
                     write_neutral_s32(byteswap_buf, old_sizes[j]);
                     xwrite(byteswap_buf, 4, 1, output_des);
                     xwrite(buffers[j], sizes[j], 1, output_des);
+                    bytes_written += 8 + sizes[j];
                 }
             }
             fflush(output_des);
@@ -313,6 +326,7 @@ static int process(FILE * input_des, FILE * output_des, int mode, int block_size
                     xread_noeof(&byteswap_buf, 1, 4, input_des);
                     old_sizes[i] = read_neutral_s32(byteswap_buf);
                     xread_noeof(buffers[i], 1, sizes[i], input_des);
+                    bytes_read += 8 + sizes[i];
                 }
                 bz3_decode_blocks(states, buffers, sizes, old_sizes, i);
                 for (s32 j = 0; j < i; j++) {
@@ -323,6 +337,7 @@ static int process(FILE * input_des, FILE * output_des, int mode, int block_size
                 }
                 for (s32 j = 0; j < i; j++) {
                     xwrite(buffers[j], old_sizes[j], 1, output_des);
+                    bytes_written += old_sizes[j];
                 }
             }
             fflush(output_des);
@@ -335,6 +350,7 @@ static int process(FILE * input_des, FILE * output_des, int mode, int block_size
                     xread_noeof(&byteswap_buf, 1, 4, input_des);
                     old_sizes[i] = read_neutral_s32(byteswap_buf);
                     xread_noeof(buffers[i], 1, sizes[i], input_des);
+                    bytes_read += 8 + sizes[i];
                 }
                 bz3_decode_blocks(states, buffers, sizes, old_sizes, i);
                 for (s32 j = 0; j < i; j++) {
@@ -353,6 +369,16 @@ static int process(FILE * input_des, FILE * output_des, int mode, int block_size
     }
 #endif
 
+    if(verbose) {
+        if(file_name) fprintf(stderr, " %s:", file_name);
+        if(mode == MODE_ENCODE)
+            fprintf(stderr, "\t%ld -> %ld bytes, %.2f%%, %.2f bpb\n", bytes_read, bytes_written, (double)bytes_written * 100.0 / bytes_read, (double)bytes_written * 8.0 / bytes_read);
+        else if(mode == MODE_DECODE)
+            fprintf(stderr, "\t%ld -> %ld bytes, %.2f%%, %.2f bpb\n", bytes_read, bytes_written, (double)bytes_read * 100.0 / bytes_written, (double)bytes_read * 8.0 / bytes_written);
+        else
+            fprintf(stderr, "OK, %ld bytes read.\n", bytes_read);
+    }
+
     return 0;
 }
 
@@ -426,15 +452,15 @@ int main(int argc, char * argv[]) {
     int force = 0;
 
     // command line arguments
-    int force_stdstreams = 0, workers = 0, batch = 0;
+    int force_stdstreams = 0, workers = 0, batch = 0, verbose = 0;
 
     // the block size
     u32 block_size = MiB(16);
 
 #ifdef PTHREAD
-    const char * short_options = "Bb:cdefhj:tVz";
+    const char * short_options = "Bb:cdefhj:tvVz";
 #else
-    const char * short_options = "Bb:cdefhtVz";
+    const char * short_options = "Bb:cdefhtvVz";
 #endif
 
     static struct option long_options[] = { { "encode", no_argument, 0, 'e' },
@@ -444,6 +470,7 @@ int main(int argc, char * argv[]) {
                                             { "force", no_argument, 0, 'f' },
                                             { "help", no_argument, 0, 'h' },
                                             { "version", no_argument, 0, 'V' },
+                                            { "verbose", no_argument, 0, 'v' },
                                             { "block", required_argument, 0, 'b' },
                                             { "batch", no_argument, 0, 'B' },
 #ifdef PTHREAD
@@ -484,6 +511,9 @@ int main(int argc, char * argv[]) {
             case 'B':
                 batch = 1;
                 break;
+            case 'v':
+                verbose = 1;
+                break;
             case 'b':
                 if (!is_numeric(optarg)) {
                     fprintf(stderr, "bzip3: invalid block size: %s\n", optarg);
@@ -534,7 +564,7 @@ int main(int argc, char * argv[]) {
                     }
 
                     FILE * output_des = open_output(output_name, force);
-                    process(input_des, output_des, mode, block_size, workers);
+                    process(input_des, output_des, mode, block_size, workers, verbose, arg);
 
                     fclose(input_des);
                     close_out_file(output_des);
@@ -562,7 +592,7 @@ int main(int argc, char * argv[]) {
                     }
 
                     FILE * output_des = open_output(output_name, force);
-                    process(input_des, output_des, mode, block_size, workers);
+                    process(input_des, output_des, mode, block_size, workers, verbose, arg);
 
                     fclose(input_des);
                     close_out_file(output_des);
@@ -575,7 +605,7 @@ int main(int argc, char * argv[]) {
                     char * arg = argv[optind++];
 
                     FILE * input_des = open_input(arg);
-                    process(input_des, NULL, mode, block_size, workers);
+                    process(input_des, NULL, mode, block_size, workers, verbose, arg);
                     fclose(input_des);
                 }
                 break;
@@ -654,7 +684,7 @@ int main(int argc, char * argv[]) {
     output_des = mode != MODE_TEST ? open_output(output, force) : NULL;
     input_des = open_input(input);
 
-    int r = process(input_des, output_des, mode, block_size, workers);
+    int r = process(input_des, output_des, mode, block_size, workers, verbose, input);
 
     fclose(input_des);
     close_out_file(output_des);
tab: 248 wrap: offon