/* -*- 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);
}