:i	static char D_reaD_sccs_id[] = "%W% %G%";
:1#include "V_s.h"
:n	global int dbn_read = 0;	/* Read counter */
extern Flag Vchknull;		/* If true, check for nulls */
extern int  Vmaxnull;		/* If true, max length string of nulls */
extern int  Vlennull;		/* Longest string of nulls so far */

#if defined(USE_syscall) && defined(SYS_read)
read(f,b,n) char *b; {return syscall(SYS_read,f,b,n);}
#endif

D_read(f,b,n)
	int   f;
	char *b;
	Sizt  n;
{	Sizt  v;
	int   e=errno, i;
	File *fp = D_openfile(f);
:n	++dbn_read;
:8	if (fp) fp->reads++;
#if defined(USE_syscall) && defined(SYS_read)
:8	V7s "syscall(SYS_read%d,%08lX,%d)",f,b,n D;
	v = syscall(SYS_read,f,b,n);
	if (v<0) e = errno;
:6	V6s "syscall(SYS_read,%d,%08lX,%d)=%d [Err %d=%s=%s]",f,b,n,v,Errinfo D;
#else
:8	V7s "read(%d,%08lX,%d)",f,b,n D;
	v = read(f,b,n);
	if (v<0) e = errno;
:5	V5s "read(%d,%08lX,%d)=%d (%d reads) [Err %d=%s=%s]",f,b,n,v,(fp?fp->reads:0),Errinfo D;
#endif
	if (v > 0) {
:7		H7s(b,v,"read");
		if (fp) fp->addr += v;	/* Keep track of the offset */
	}
:7	if (Vchknull)
:7		if (i = Vcntnulls(b,v))
:7			V3 "### String of %d nulls >= Vmaxnull=%d read from file %d offset %lu."
:7				,i,Vmaxnull,f,(fp?fp->addr:0) D;
	errno = e;
	return v;
}
