From 0e59c5f27cc3badd3e48a87bba39bdac9077e1a5 Mon Sep 17 00:00:00 2001 From: Shav Kinderlehrer Date: Mon, 10 Apr 2023 20:14:18 -0400 Subject: [PATCH] Breakup monolithic code --- include/file.h | 12 ++++++++++ include/lib.h | 2 +- src/lib/file.c | 41 +++++++++++++++++++++++++++++++++ src/{ => lib}/lib.c | 10 ++++---- src/main.c | 56 ++++++++++++++------------------------------- 5 files changed, 76 insertions(+), 45 deletions(-) create mode 100644 include/file.h create mode 100644 src/lib/file.c rename src/{ => lib}/lib.c (71%) diff --git a/include/file.h b/include/file.h new file mode 100644 index 0000000..0d2e791 --- /dev/null +++ b/include/file.h @@ -0,0 +1,12 @@ +#include + +#ifndef FILE_H +#define FILE_H +struct filedata { + int lc; + unsigned len; + char *buf; +}; + +struct filedata readfile(FILE *fp); +#endif diff --git a/include/lib.h b/include/lib.h index 41a25d7..9554605 100644 --- a/include/lib.h +++ b/include/lib.h @@ -2,7 +2,7 @@ #define LIB_H void die(const char *message); -char* formatBytes(double *bytes); +char *formatBytes(unsigned bytes, float *rounded); int intlen(unsigned i); #endif diff --git a/src/lib/file.c b/src/lib/file.c new file mode 100644 index 0000000..3464866 --- /dev/null +++ b/src/lib/file.c @@ -0,0 +1,41 @@ +#include +#include + +#include "file.h" +#include "lib.h" + +struct filedata readfile(FILE *fp) { + struct filedata f; + + f.lc = 0; + f.len = 0; + + unsigned bufsize = 4; + + f.buf = malloc(bufsize); + if (f.buf == NULL) + die("malloc"); + + char c; + while (fread(&c, sizeof(char), 1, fp) > 0) { + if (f.len == bufsize - 1) { + bufsize *= 2; + + char *new_buf = realloc(f.buf, bufsize); + if (f.buf == NULL) { + free(f.buf); + die("realloc"); + } + + f.buf = new_buf; + } + + if (c == '\n') { + f.lc++; + } + + f.buf[f.len++] = c; + } + + return f; +} diff --git a/src/lib.c b/src/lib/lib.c similarity index 71% rename from src/lib.c rename to src/lib/lib.c index b7ee492..b358ed6 100644 --- a/src/lib.c +++ b/src/lib/lib.c @@ -7,12 +7,12 @@ void die(const char *message) { exit(1); } -char *formatBytes(double *bytes) { +char *formatBytes(unsigned bytes, float *rounded) { char *SIZES[] = {"bytes", "kB", "MB", "GB"}; - size_t size = *bytes; - size_t div = 0; - size_t rem = 0; + unsigned size = bytes; + unsigned div = 0; + unsigned rem = 0; while (size >= 1024 && div < (sizeof SIZES / sizeof *SIZES)) { rem = (size % 1024); @@ -20,7 +20,7 @@ char *formatBytes(double *bytes) { size /= 1024; } - *bytes = (float)size + (float)rem / 1024.0; + *rounded = (float)size + (float)rem / 1024.0; return SIZES[div]; } diff --git a/src/main.c b/src/main.c index be6a098..df7f609 100644 --- a/src/main.c +++ b/src/main.c @@ -1,8 +1,10 @@ +#include #include #include #include #include +#include "file.h" #include "lib.h" #define INVERT_T "\x1b[7m" @@ -19,64 +21,40 @@ int run(char *filename) { die("fopen"); if (tty) - fprintf(stderr, "%s%s%s\r\n", INVERT_T, filename, UINVERT_T); + fprintf(stderr, "%s%s%s\r\n", INVERT_T, basename(filename), UINVERT_T); - int bufsize = 4; - char *buf; + struct filedata f; + f = readfile(fp); - buf = malloc(bufsize); - if (buf == NULL) - die("malloc"); - - double fsize = 0; - unsigned offset = 0; - unsigned lc = 0; - char c; - while (fread(&c, sizeof(char), 1, fp) > 0) { - if (fsize == bufsize - 1) { - bufsize *= 2; - - char *new_buf = realloc(buf, bufsize); - if (buf == NULL) { - free(buf); - die("realloc"); - } - - buf = new_buf; - } - - if (c == '\n') - lc++; - - buf[offset++] = c; - fsize++; - } fclose(fp); - int lcpad = intlen(lc); + int lcpad = intlen(f.lc); - lc = 0; + f.lc = 0; char pc = '\0'; - for (int i = 0; (unsigned)i < offset; i++) { - c = buf[i]; + char c; + for (unsigned i = 0; i < f.len; i++) { + c = f.buf[i]; if (pc == '\n' || i == 0) { - lc++; - int padlen = lcpad - intlen(lc); + f.lc++; + int padlen = lcpad - intlen(f.lc); char padding[padlen]; memset(padding, ' ', padlen); + if (tty) - fprintf(stderr, "%s%s%d:%s ", GREY, padding, lc, RESET); + fprintf(stderr, "%s%s%d:%s ", GREY, padding, f.lc, RESET); } pc = c; printf("%c", c); } - char *format = formatBytes(&fsize); + float rounded; + char *format = formatBytes(f.len, &rounded); if (tty) - fprintf(stderr, "%s%.2f %s%s\r\n", INVERT_T, fsize, format, UINVERT_T); + fprintf(stderr, "%s%.2f %s%s\r\n", INVERT_T, rounded, format, UINVERT_T); return 0; }