#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <ctype.h>

#define HAIFUN(x) ((x)[0] == '-' && (x)[1] == '\0')

FILE* file_open(const char* fname, const char* mode)
{
    FILE* fp;

    if((fp = fopen(fname, mode)) == NULL)
    {
	perror(fname);
	exit(1);
    }

    return fp;
}

int atoint(const char* x)
{
    int sig;
    int value;

    value = 0;
    while(*x != '-' && !isdigit(*x))
	x++;
    if(*x == '-')
    {
	sig = 1;
	x++;
    }
    else
	sig = 1;

    if(*x == '0')
    {
	if(*(x + 1) == 'x' || *(x + 1) == 'X') /* 0x... 0X... */
	    return sig * strtol(x + 2, NULL, 16);
	return sig * strtol(x + 1, NULL, 8);
    }
    return sig * atoi(x);
}

int main(int argc, char** argv)
{
    unsigned long start;
    unsigned long end = ULONG_MAX;
    unsigned long n;
    FILE* infp  = stdin;
    FILE* outfp = stdout;
    unsigned long i;
    int ch;

    if(argc < 2 || argc > 5)
    {
	fprintf(stderr, "usage: bcut start [ end [ infile [ outfile ] ] ]\n");
	exit(1);
    }

    start = atoint(argv[1]);
    if(argc >= 3)
    {
	if(!HAIFUN(argv[2]))
	    end = atoint(argv[2]);
	if(argc >= 4)
	{
	    if(!HAIFUN(argv[3]))
		infp = file_open(argv[3], "r");
	    if(argc >= 5)
		if(!HAIFUN(argv[4]))
		    outfp = file_open(argv[4], "w");
	}
    }

    n = end - start;

    if(fseek(infp, start, SEEK_SET) == -1)
    {
	for(i = 0; i < start; i++)
	    if(getc(infp) == EOF)
	    {
		fclose(outfp);
		fclose(infp);
		exit(0);
	    }
    }

    for(i = 0; i < n; i++)
    {
	if((ch = getc(infp)) == EOF)
	    break;
	putc(ch, outfp);
    }

    fclose(outfp);
    fclose(infp);
    return 0;
}
