#include #include #include #define BLOCK_SIZE 4096 void die (char *s, int len) { write(2, s, len); exit(111); } void nomem () { die("no memory!\n", 11); } int main () { size_t len; ssize_t ret; char *buf, *buf2, *left, *right, *src, *dst; len = 0; buf = NULL; do { buf = realloc(buf, len + BLOCK_SIZE); if (!buf) nomem(); ret = read(0, buf + len, BLOCK_SIZE); if (ret < 0) die("read error!\n", 12); len += ret; } while (ret); if (!len) return 0; buf2 = malloc(len); if (!buf2) nomem(); dst = buf2; for (right = buf + len - 1; right >= buf; right = left - 1) { for (left = right; left > buf; --left) if (*(left - 1) == '\n') break; for (src = left; src <= right; ++src) *dst++ = *src; } free(buf); write(1, buf2, len); free(buf2); return 0; }