From 0e59c5f27cc3badd3e48a87bba39bdac9077e1a5 Mon Sep 17 00:00:00 2001 From: Shav Kinderlehrer Date: Mon, 10 Apr 2023 20:14:18 -0400 Subject: Breakup monolithic code --- src/lib.c | 37 ------------------------------------- src/lib/file.c | 41 +++++++++++++++++++++++++++++++++++++++++ src/lib/lib.c | 37 +++++++++++++++++++++++++++++++++++++ src/main.c | 56 +++++++++++++++++--------------------------------------- 4 files changed, 95 insertions(+), 76 deletions(-) delete mode 100644 src/lib.c create mode 100644 src/lib/file.c create mode 100644 src/lib/lib.c (limited to 'src') diff --git a/src/lib.c b/src/lib.c deleted file mode 100644 index b7ee492..0000000 --- a/src/lib.c +++ /dev/null @@ -1,37 +0,0 @@ -#include -#include -#include - -void die(const char *message) { - perror(message); - exit(1); -} - -char *formatBytes(double *bytes) { - char *SIZES[] = {"bytes", "kB", "MB", "GB"}; - - size_t size = *bytes; - size_t div = 0; - size_t rem = 0; - - while (size >= 1024 && div < (sizeof SIZES / sizeof *SIZES)) { - rem = (size % 1024); - div++; - size /= 1024; - } - - *bytes = (float)size + (float)rem / 1024.0; - - return SIZES[div]; -} - -int intlen(unsigned i) { - int l = 1; - - while (i > 9) { - l++; - i /= 10; - } - - return l; -} 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/lib.c b/src/lib/lib.c new file mode 100644 index 0000000..b358ed6 --- /dev/null +++ b/src/lib/lib.c @@ -0,0 +1,37 @@ +#include +#include +#include + +void die(const char *message) { + perror(message); + exit(1); +} + +char *formatBytes(unsigned bytes, float *rounded) { + char *SIZES[] = {"bytes", "kB", "MB", "GB"}; + + unsigned size = bytes; + unsigned div = 0; + unsigned rem = 0; + + while (size >= 1024 && div < (sizeof SIZES / sizeof *SIZES)) { + rem = (size % 1024); + div++; + size /= 1024; + } + + *rounded = (float)size + (float)rem / 1024.0; + + return SIZES[div]; +} + +int intlen(unsigned i) { + int l = 1; + + while (i > 9) { + l++; + i /= 10; + } + + return l; +} 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; } -- cgit v1.2.3