tac.cpp (979B)
1 #include "linux.hpp" 2 3 extern char mappable[]; 4 5 static int rd(file const fd, char* const start, char* const end) 6 { 7 char* pos = start; 8 while (pos != end) 9 { 10 auto res = read(fd, pos, end); 11 if (!res) 12 exit(2); 13 auto n = *res; 14 if (n == 0) 15 break; 16 pos += n; 17 } 18 return pos - start; 19 } 20 21 static void wr(file const fd, char const* start, char const* const end) 22 { 23 while (start != end) 24 { 25 auto n = write(fd, start, end); 26 if (!n) 27 exit(3); 28 start += *n; 29 } 30 } 31 32 int main() 33 { 34 char* buf = mappable; 35 size_t cap = 0; 36 size_t len = 0; 37 38 while (len == cap) 39 { 40 size_t extra_size = cap ? cap : 0x1000; 41 auto m = mmap(buf + cap, extra_size, PROT_READ | PROT_WRITE, MAP_FIXED | MAP_ANONYMOUS | MAP_PRIVATE, {}, 0); 42 if (!m) 43 return 1; 44 cap += extra_size; 45 46 len += rd(stdin, buf + len, buf + cap); 47 } 48 49 char const* end = buf + len; 50 char const* str = end; 51 52 while (--str > buf) 53 { 54 while (str > buf && str[-1] != '\n') 55 --str; 56 wr(stdout, str, end); 57 end = str; 58 } 59 }