| #ifndef _BIO_H_ | 
 | #define _BIO_H_ 1 | 
 | #if defined(__cplusplus) | 
 | extern "C" {  | 
 | #endif | 
 |  | 
 | #ifdef AUTOLIB | 
 | AUTOLIB(bio) | 
 | #endif | 
 |  | 
 | #include <fcntl.h>	/* for O_RDONLY, O_WRONLY */ | 
 |  | 
 | typedef	struct	Biobuf	Biobuf; | 
 |  | 
 | enum | 
 | { | 
 | 	Bsize		= 8*1024, | 
 | 	Bungetsize	= 4,		/* space for ungetc */ | 
 | 	Bmagic		= 0x314159, | 
 | 	Beof		= -1, | 
 | 	Bbad		= -2, | 
 |  | 
 | 	Binactive	= 0,		/* states */ | 
 | 	Bractive, | 
 | 	Bwactive, | 
 | 	Bracteof, | 
 |  | 
 | 	Bend | 
 | }; | 
 |  | 
 | struct	Biobuf | 
 | { | 
 | 	int	icount;		/* neg num of bytes at eob */ | 
 | 	int	ocount;		/* num of bytes at bob */ | 
 | 	int	rdline;		/* num of bytes after rdline */ | 
 | 	int	runesize;	/* num of bytes of last getrune */ | 
 | 	int	state;		/* r/w/inactive */ | 
 | 	int	fid;		/* open file */ | 
 | 	int	flag;		/* magic if malloc'ed */ | 
 | 	long long	offset;		/* offset of buffer in file */ | 
 | 	int	bsize;		/* size of buffer */ | 
 | 	unsigned char*	bbuf;		/* pointer to beginning of buffer */ | 
 | 	unsigned char*	ebuf;		/* pointer to end of buffer */ | 
 | 	unsigned char*	gbuf;		/* pointer to good data in buf */ | 
 | 	unsigned char	b[Bungetsize+Bsize]; | 
 | }; | 
 |  | 
 | #define	BGETC(bp)\ | 
 | 	((bp)->icount?(bp)->bbuf[(bp)->bsize+(bp)->icount++]:Bgetc((bp))) | 
 | #define	BPUTC(bp,c)\ | 
 | 	((bp)->ocount?(bp)->bbuf[(bp)->bsize+(bp)->ocount++]=(c),0:Bputc((bp),(c))) | 
 | #define	BOFFSET(bp)\ | 
 | 	(((bp)->state==Bractive)?\ | 
 | 		(bp)->offset + (bp)->icount:\ | 
 | 	(((bp)->state==Bwactive)?\ | 
 | 		(bp)->offset + ((bp)->bsize + (bp)->ocount):\ | 
 | 		-1)) | 
 | #define	BLINELEN(bp)\ | 
 | 	(bp)->rdline | 
 | #define	BFILDES(bp)\ | 
 | 	(bp)->fid | 
 |  | 
 | int	Bbuffered(Biobuf*); | 
 | Biobuf*	Bfdopen(int, int); | 
 | int	Bfildes(Biobuf*); | 
 | int	Bflush(Biobuf*); | 
 | int	Bgetc(Biobuf*); | 
 | int	Bgetd(Biobuf*, double*); | 
 | long	Bgetrune(Biobuf*); | 
 | int	Binit(Biobuf*, int, int); | 
 | int	Binits(Biobuf*, int, int, unsigned char*, int); | 
 | int	Blinelen(Biobuf*); | 
 | long long	Boffset(Biobuf*); | 
 | Biobuf*	Bopen(char*, int); | 
 | int	Bprint(Biobuf*, char*, ...); | 
 | int	Bputc(Biobuf*, int); | 
 | int	Bputrune(Biobuf*, long); | 
 | void*	Brdline(Biobuf*, int); | 
 | char*	Brdstr(Biobuf*, int, int); | 
 | long	Bread(Biobuf*, void*, long); | 
 | long long	Bseek(Biobuf*, long long, int); | 
 | int	Bterm(Biobuf*); | 
 | int	Bungetc(Biobuf*); | 
 | int	Bungetrune(Biobuf*); | 
 | long	Bwrite(Biobuf*, void*, long); | 
 | int	Bvprint(Biobuf*, char*, va_list); | 
 |  | 
 | #if defined(__cplusplus) | 
 | } | 
 | #endif | 
 | #endif |