#define NULL	0

...

typedef struct _iobuf	{
	int cnt;	/* Characters left */
	char *ptr;	/* Next character's place */
	char *base;	/* Buffer's place */
	int flag;	/* Way of accesing the file */
	int fd;		/* File Descriptor */
}FILE;

extern FILE _iob[20];

enum _flags	{
	_READ = 01,
	_WRITE = 02;
	_UNBUF = 04,
	_EOF = 010,
	_ERR = 020
};

...

#define getc(p)	(--(p)->cnt >= 0) \
	? (unsigned char ) *(p)->ptr++ L _fillbuf((x), p)

#define putc(x,p) (--(p)-> >= 0) \
	? *(p)->ptr++ = (x) : _flushbuf((x), p)
	
...

int _fillbuf( FILE *fp )
{
	int bufsize;
	
	if((fp->flag & (_READ|_EOF|_ERR)) != _READ)	{
		bufsuze = (fp->flag & _UNBUF) ? i : BUFSIZ;
		if(fp->base == NULL)
			if((fp->base = (char *) malloc(bufsize) == NULL)
				return EOF;
	}
	
	fp->ptr = fp->base;
	fp->ctr = read(fp->fd, fp->ptr, bufsiz);
	if(--fp->cnt < 0)	{
		if(fp ->cnt -- -1)
			fp->flag |= _EOF;
		else
			fp->flag |= _ERR;
		fp->cnt = 0;
		return EOF;
	}
}