#include #include #ifdef HEAD static int Z = 1; #elif defined(TAIL) static int Z = -1; #else static int Z = 0; #endif static int u, b, e, l = 1; static char *d = NULL, *p, *q, *r; static void f(void) { fwrite(d, q - d, 1, stdout); } static void t(char *s) { e -= s - d; for(p = d; p != d + e;) *p++ = *s++; } int main(int z, char **v) { if( z - 2 ) { return printf("%s {line_%s}\n", *v, Z ? "count" : "number"); } u = atoi(v[1]); u = Z ? abs(u) * Z : u; b = e = z = 0; while( !z ) { if( e == b ) { if( !(d = (char*)realloc(d, b += 4096)) ) { fprintf(stderr, "Out of memory (need %d)\n", b); return 1; } } e += fread(d + e, 1, b - e, stdin); z = e < b; if( u >= 0 && Z >= 0 ) { for(p = q = d; p != d + e; l += *p++ == '\n') { if( Z ? l <= u : l != u ) *q++ = *p; } f(); e = 0; } else if( e && u ) { q = r = d + e; q -= q[-1] == '\n'; for(l = -1; d - q--;) { if( *q == '\n' ) { l--; if( l < u ) { l++; break; } r = q + 1; } } q++; if( !Z ) { f(); } t(q); if( z ) { if( !Z && l == u ) { t(r -= q - d); } q = d + e; f(); } } } return 0; }