/* -*- mode: c -*- * $Id: reversefile.gcc,v 1.9 2001/06/25 01:45:44 doug Exp $ * http://www.bagley.org/~doug/shootout/ */ #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXREAD 4096 int main(int argc, char *argv[]) { int nread, len = 0, size = (4 * MAXREAD); char *cp, *offset, *buf = malloc(size + 1); while (1) { if ((nread = read(0, (buf + len), MAXREAD)) > 0) { len += nread; if (MAXREAD > (size - len)) { size <<= 1; if (0 == (buf = realloc(buf, size + 1))) { fprintf(stderr, "realloc failed\n"); exit(1); } } } else { if ( 0 == nread) break; if (-1 == nread) { perror("read"); exit(1); } } } offset = buf + len; *offset = 0; for (cp = offset; cp > buf; --cp) { if ('\n' == *cp) { *offset = 0; if (cp < offset) fputs(offset = cp+1, stdout); } } if (cp < offset) { *offset = 0; fputs(cp, stdout); } free(buf); return(0); }