From e195f586cd84ba71ed6a598dca0a5eee7b03d8f4 Mon Sep 17 00:00:00 2001 From: Enno Tensing Date: Tue, 21 Jan 2025 20:12:16 +0100 Subject: [PATCH] smu: Re-add processing from STDIN --- smu.c | 58 +++++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 45 insertions(+), 13 deletions(-) diff --git a/smu.c b/smu.c index 8164cff..7b17365 100644 --- a/smu.c +++ b/smu.c @@ -16,6 +16,7 @@ #include #include +#define CHARWIDTH 4 #define LENGTH(x) sizeof(x) / sizeof(x[0]) #define ADDC(b, i, a) \ do { \ @@ -119,7 +120,7 @@ char *read_file(const char *path, off64_t file_size) int fd = open(path, O_LARGEFILE | O_NONBLOCK); ssize_t bytes; - char *buf = calloc(file_size + 4, sizeof(char)); + char *buf = calloc(file_size + CHARWIDTH, sizeof(char)); if (!buf) { perror(""); @@ -714,6 +715,7 @@ int main(int argc, char *argv[]) char *buffer = NULL; const char *path = "STDIN"; int i; + int ret = EXIT_SUCCESS; for (i = 1; i < argc; i++) { if (!strcmp("-v", argv[i])) @@ -730,19 +732,49 @@ int main(int argc, char *argv[]) argv[0]); } - if (i < argc) + if (i < argc) { path = argv[i]; - off64_t len = get_file_size(path); - if (len == -1) { - eprint("%s: %s: %s\n", argv[0], path, strerror(errno)); - return EXIT_FAILURE; + off64_t len = get_file_size(path); + if (len == -1) { + eprint("%s: %s: %s\n", argv[0], path, strerror(errno)); + ret = EXIT_FAILURE; + goto exit; + } + buffer = read_file(path, len); + if (!buffer) { + perror(""); + ret = EXIT_FAILURE; + goto exit; + } + buffer[len] = '\0'; + process(buffer, buffer + len, 1); + free(buffer); + } else { + size_t buffer_size = 1024 * CHARWIDTH; + buffer = calloc(buffer_size + CHARWIDTH, sizeof(char)); + if (!buffer) { + perror(""); + ret = EXIT_FAILURE; + goto exit; + } + + size_t read_bytes; + while (1) { + read_bytes = read(STDIN_FILENO, buffer, buffer_size); + if (read_bytes <= 0) { + if (errno) { + perror(""); + ret = EXIT_FAILURE; + } + free(buffer); + break; + } + + buffer[read_bytes] = '\0'; + process(buffer, buffer + read_bytes, 1); + } } - buffer = read_file(path, len); - if (!buffer) - return EXIT_FAILURE; - buffer[len] = '\0'; - process(buffer, buffer + len, 1); - free(buffer); - return EXIT_SUCCESS; +exit: + return ret; }