liblinux++

A hosted C++ runtime without any libc.
git clone git://henryandlizzy.uk/liblinux++
Log | Files | Refs

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 }