void	(*fill)(char *, long); void	(*skip)(char *, long);
void	(*fill)(char *, size_t); void	(*skip)(char *, size_t);
getfile(fill, skip)	void	(*fill)(char *, long);	void	(*skip)(char *, long);{	int i;	volatile int curblk = 0;	volatile long size = spcl.c_dinode.di_size;	static char clearedbuf[MAXBSIZE];	char buf[MAXBSIZE / TP_BSIZE][TP_BSIZE];	char junk[TP_BSIZE];	volatile int noskip = (spcl.c_type == TS_BITS || spcl.c_type == TS_CLRI);	if (spcl.c_type == TS_END)		panic("ran off end of tape\n");	if (spcl.c_magic != NFS_MAGIC)		panic("not at beginning of a file\n");	if (!gettingfile && setjmp(restart) != 0)		return;	gettingfile++;loop:	for (i = 0; i < spcl.c_count; i++) {		if (noskip || spcl.c_addr[i]) {			readtape(&buf[curblk++][0]);			if (curblk == fssize / TP_BSIZE) {				(*fill)((char *)buf, size > TP_BSIZE ?				     (long) (fssize) :				     (curblk - 1) * TP_BSIZE + size);				curblk = 0;			}		} else {			if (curblk > 0) {				(*fill)((char *)buf, size > TP_BSIZE ?				     (long) (curblk * TP_BSIZE) :				     (curblk - 1) * TP_BSIZE + size);				curblk = 0;			}			(*skip)(clearedbuf, size > TP_BSIZE ?				(long) TP_BSIZE : size);		}		if ((size -= TP_BSIZE) <= 0) {			for (i++; i < spcl.c_count; i++)				if (noskip || spcl.c_addr[i])					readtape(junk);			break;		}	}	if (gethead(&spcl) == GOOD && size > 0) {		if (spcl.c_type == TS_ADDR)			goto loop;		Dprintf(stdout,			"Missing address (header) block for %s at %ld blocks\n",			curfile.name, blksread);	}	if (curblk > 0)		(*fill)((char *)buf, (curblk * TP_BSIZE) + size);	findinode(&spcl);	gettingfile = 0;}