diff --git a/include/lib.h b/include/lib.h index 39dc03b..41a25d7 100644 --- a/include/lib.h +++ b/include/lib.h @@ -3,4 +3,6 @@ void die(const char *message); char* formatBytes(double *bytes); + +int intlen(unsigned i); #endif diff --git a/src/lib.c b/src/lib.c index 0a98435..b7ee492 100644 --- a/src/lib.c +++ b/src/lib.c @@ -24,3 +24,14 @@ char *formatBytes(double *bytes) { 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 b3724e3..124abdf 100644 --- a/src/main.c +++ b/src/main.c @@ -1,23 +1,21 @@ #include #include +#include #include "lib.h" #define INVERT_T "\x1b[7m" #define UINVERT_T "\x1b[27m" +#define GREY "\x1b[90m" +#define RESET "\x1b[0m" -int main(int argc, char *argv[]) { - if (argc < 2) { - printf("usage: catclone \n"); - die("args"); - } - - FILE *fp = fopen(argv[1], "r+b"); +int run(char *filename) { + FILE *fp = fopen(filename, "r+b"); if (fp == NULL) die("fopen"); - printf("%s%s%s\r\n", INVERT_T, argv[1], UINVERT_T); + printf("%s%s%s\r\n", INVERT_T, filename, UINVERT_T); int bufsize = 4; char *buf; @@ -27,7 +25,8 @@ int main(int argc, char *argv[]) { die("malloc"); double fsize = 0; - int offset = 0; + unsigned offset = 0; + unsigned lc = 0; char c; while (fread(&c, sizeof(char), 1, fp) > 0) { if (fsize == bufsize - 1) { @@ -42,17 +41,54 @@ int main(int argc, char *argv[]) { buf = new_buf; } + if (c == '\n') + lc++; + buf[offset++] = c; fsize++; } + fclose(fp); - printf("\r\n"); + int lcpad = intlen(lc); + + lc = 0; + char pc = '\0'; + for (int i = 0; i < offset; i++) { + c = buf[i]; + + if (pc == '\n' || i == 0) { + lc++; + int padlen = lcpad - intlen(lc); + char padding[padlen]; + memset(padding, '0', padlen); + printf("%s%s%d:%s ", GREY, padding, lc, RESET); + } + + pc = c; + printf("%c", c); + } char *format = formatBytes(&fsize); printf("%s%.2f %s%s\r\n", INVERT_T, fsize, format, UINVERT_T); - fclose(fp); + return 0; +} + +int main(int argc, char *argv[]) { + if (argc < 2) { + printf("usage: catclone \n"); + die("args"); + } + + for (int i = 1; i < argc; i++) { + if (run(argv[i]) != 0) + die("run"); + + if (i + 1 != argc) { + printf("\r\n"); + } + } return 0; }