From 348aa301fda1ad1c8d7840e72c103e4453cc322d Mon Sep 17 00:00:00 2001 From: Peter Wu Date: Mon, 8 Jul 2013 22:01:21 +0200 Subject: revb: reverse all stdin (bufferred) --- revb.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 revb.c diff --git a/revb.c b/revb.c new file mode 100644 index 0000000..d4c47e4 --- /dev/null +++ b/revb.c @@ -0,0 +1,52 @@ +/* + * Print stdin fully reversed. Unlike util-linux rev(1), this program does not + * reverse lines, but buffers everything fully and then writes it on the end. + * Author: Peter Wu + * Date: 2012-11-07 + */ +#include +#include +#include +#include +#include + +#define READ_BLOCK 1024 +#define SIZE_INC (4 * READ_BLOCK) + +int main(void) { + unsigned len = 0; /* length of data */ + unsigned str_size = SIZE_INC; /* size of buffer */ + char *str = malloc(str_size); + if (!str) { + perror("malloc"); + return 1; + } + int n = 0; + do { + if (str_size - len < SIZE_INC) { + str_size += SIZE_INC; + str = realloc(str, str_size); + if (!str) { + fprintf(stderr, "Failed to enlarge buffer to %u: %s\n", str_size, strerror(errno)); + abort(); + } + } + n = read(STDIN_FILENO, str + len, READ_BLOCK); + if (n < 0) { + perror("read"); + goto free_str; + } else if (n) { + len += n; + } + } while (n); + + /* print in reverse */ + while (len) + putchar(str[--len]); + + free(str); + return 0; +free_str: + free(str); + return 1; +} -- cgit v1.2.1