/*
 * $Id: dbuf.h,v 1.2 2003/11/29 08:00:30 dgc Exp $
 */

#ifndef DBUF_H
#define DBUF_H

#define DEFAULT_BLKSZ	8192	/* a common page size seems good */

typedef struct dbuf_t {
	char	*data;
	int	 blksz;
	int	 aggr;
	int	 max;
	int	 cur;
} dbuf_t;

typedef union dbadv_t {
	void    *ptr;
	int	 num;
} dbadv_t;


/* For dbuf_read() and dbuf_write(): slurp up all you can. */
#define DBUF_ALL	-1

/* dbuf_advise() operations */
enum {
	DBUF_ADV_NONE = 0,	/* nada */
	DBUF_ADV_BLKSZ,		/* change blk sz */
	DBUF_ADV_AGG,		/* aggressiveness: nblocks for r/w extents */
	DBUF_ADV_END
} dbuf_advice;

/* dbuf_advise() returns */
#define DBUF_ADV_OK	0
#define DBUF_ADV_FAIL	-1


dbuf_t * dbuf_new(int blksz);
void     dbuf_destroy(dbuf_t *dbuf);
int      dbuf_read(dbuf_t *dbuf, int fd, int max);
int      dbuf_write(dbuf_t *dbuf, int fd, int max);
void     dbuf_clear(dbuf_t *dbuf);
int      dbuf_size(dbuf_t *dbuf);
int      dbuf_advise(dbuf_t *dbuf, int op, dbadv_t adv);
dbuf_t * dbuf_extend(dbuf_t *dbuf, int n);
void     dbuf_fit(dbuf_t *dbuf);
dbuf_t * dbuf_copy(dbuf_t *dbuf1, dbuf_t *dbuf2);

#endif /* DBUF_H */

