From 49bd4b5c76ba90bb4d38912f79fa2d34771f347e Mon Sep 17 00:00:00 2001 From: Stephen Seo Date: Fri, 26 Jul 2024 16:18:07 +0900 Subject: [PATCH] Improve file-count logs --- src/archiver.c | 23 +++++++++++++++++++---- src/archiver.h | 1 + src/helpers.c | 10 ++++++++++ src/helpers.h | 2 ++ 4 files changed, 32 insertions(+), 4 deletions(-) diff --git a/src/archiver.c b/src/archiver.c index 58fe5ba..c1a7b97 100644 --- a/src/archiver.c +++ b/src/archiver.c @@ -40,6 +40,8 @@ #include "helpers.h" #define TEMP_FILENAME_CMP "%s%ssimple_archiver_compressed_%u.tmp" +#define FILE_COUNTS_OUTPUT_FORMAT_STR_0 "\nFile %%%uu of %%%uu.\n" +#define FILE_COUNTS_OUTPUT_FORMAT_STR_1 "[%%%uu/%%%uu]\n" #if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN || \ SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_MAC || \ @@ -871,7 +873,10 @@ int write_files_fn(void *data, void *ud) { simple_archiver_list_free(&to_write); } - fprintf(stderr, "[%10u/%10u]\n", ++(state->count), state->max); + char format_str[64]; + snprintf(format_str, 64, FILE_COUNTS_OUTPUT_FORMAT_STR_1, state->digits, + state->digits); + fprintf(stderr, format_str, ++(state->count), state->max); return 0; } @@ -996,6 +1001,9 @@ SDArchiverState *simple_archiver_init_state(const SDArchiverParsed *parsed) { state->parsed = parsed; state->out_f = NULL; state->map = NULL; + state->count = 0; + state->max = 0; + state->digits = 10; return state; } @@ -1105,6 +1113,7 @@ int simple_archiver_write_all(FILE *out_f, SDArchiverState *state, state->max = filenames->count; state->out_f = out_f; state->map = abs_filenames; + state->digits = simple_archiver_helper_num_digits(state->max); fprintf(stderr, "Begin archiving...\n"); __attribute__(( cleanup(simple_archiver_internal_chdir_back2))) char *original_cwd = NULL; @@ -1118,7 +1127,10 @@ int simple_archiver_write_all(FILE *out_f, SDArchiverState *state, } #endif } - fprintf(stderr, "[%10u/%10u]\n", state->count, state->max); + char format_str[64]; + snprintf(format_str, 64, FILE_COUNTS_OUTPUT_FORMAT_STR_1, state->digits, + state->digits); + fprintf(stderr, format_str, state->count, state->max); if (simple_archiver_list_get(filenames, write_files_fn, state)) { // Error occurred. fprintf(stderr, "Error ocurred writing file(s) to archive.\n"); @@ -1226,7 +1238,10 @@ int simple_archiver_parse_archive_info(FILE *in_f, int do_extract, simple_archiver_helper_32_bit_be(&u32); fprintf(stderr, "File count is %u\n", u32); - uint32_t size = u32; + const uint32_t size = u32; + const unsigned int digits = simple_archiver_helper_num_digits(size); + char format_str[128]; + snprintf(format_str, 128, FILE_COUNTS_OUTPUT_FORMAT_STR_0, digits, digits); int skip = 0; __attribute__((cleanup(simple_archiver_hash_map_free))) SDArchiverHashMap *hash_map = NULL; @@ -1244,7 +1259,7 @@ int simple_archiver_parse_archive_info(FILE *in_f, int do_extract, } } for (uint32_t idx = 0; idx < size; ++idx) { - fprintf(stderr, "\nFile %10u of %10u.\n", idx + 1, size); + fprintf(stderr, format_str, idx + 1, size); if (feof(in_f) || ferror(in_f)) { return SDAS_INVALID_FILE; } else if (fread(&u16, 2, 1, in_f) != 1) { diff --git a/src/archiver.h b/src/archiver.h index 8d2de1a..97b69d1 100644 --- a/src/archiver.h +++ b/src/archiver.h @@ -34,6 +34,7 @@ typedef struct SDArchiverState { SDArchiverHashMap *map; unsigned int count; unsigned int max; + unsigned int digits; } SDArchiverState; enum SDArchiverStateReturns { diff --git a/src/helpers.c b/src/helpers.c index 3e2df43..98709a6 100644 --- a/src/helpers.c +++ b/src/helpers.c @@ -216,3 +216,13 @@ char *simple_archiver_helper_cut_substr(const char *s, unsigned int start_idx, return new_s; } } + +unsigned int simple_archiver_helper_num_digits(unsigned int value) { + unsigned int digits = 0; + do { + ++digits; + value /= 10; + } while (value != 0); + + return digits; +} diff --git a/src/helpers.h b/src/helpers.h index 643d54f..4629c99 100644 --- a/src/helpers.h +++ b/src/helpers.h @@ -52,4 +52,6 @@ int simple_archiver_helper_make_dirs(const char *file_path); char *simple_archiver_helper_cut_substr(const char *s, unsigned int start_idx, unsigned int end_idx); +unsigned int simple_archiver_helper_num_digits(unsigned int value); + #endif