#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; 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[l = 1]); u = Z ? Z * abs(u) : u; b = e = z = 0; while( !z ) { if( e == b && !(d = (char*)realloc(d, b += 4096)) ) { fputs("Out of memory\n", stderr); 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++ == 10) { if( Z ? l <= u : l != u ) *q++ = *p; } f(); e = 0; } else if( e && u ) { q = r = d + e; for(q -= q[l = -1] == 10; d - q--;) { if( *q == 10 ) { 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; }