/*
 * blob.h
 *
 * Binary blob handling.
 *
 * Copyright (c) 2002 Dug Song <dugsong@monkey.org>
 *
 * $Id: blob.h,v 1.2 2002/04/05 03:06:44 dugsong Exp $
 */

#ifndef DNET_BLOB_H
#define DNET_BLOB_H

typedef struct blob {
        u_char		*base;		/* start of data */
        int		 off;		/* offset into data */
        int		 end;		/* end of data */
        int		 size;		/* size of allocation */
} blob_t;

__BEGIN_DECLS
blob_t	*blob_new(void);

int	 blob_read(blob_t *b, void *buf, int len);
int	 blob_write(blob_t *b, const void *buf, int len);

int	 blob_seek(blob_t *b, int off, int whence);
#define  blob_skip(b, l)	blob_seek(b, l, SEEK_CUR)
#define  blob_rewind(b)		blob_seek(b, 0, SEEK_SET)

#define	 blob_offset(b)		((b)->off)
#define	 blob_left(b)		((b)->end - (b)->off)

int	 blob_index(blob_t *b, const void *buf, int len);
int	 blob_rindex(blob_t *b, const void *buf, int len);

int	 blob_pack(blob_t *b, const char *fmt, ...);
int	 blob_unpack(blob_t *b, const char *fmt, ...);

int	 blob_insert(blob_t *b, const void *buf, int len);
int	 blob_delete(blob_t *b, void *buf, int len);

int	 blob_print(blob_t *b, char *style, int len);

blob_t	*blob_free(blob_t *b);

int	 blob_register_alloc(size_t size, void *(*bmalloc)(size_t),
            void (*bfree)(void *), void *(*brealloc)(void *, size_t));
#ifdef va_start
typedef int (*blob_fmt_cb)(int pack, int len, blob_t *b, va_list *arg);

int	 blob_register_pack(char c, blob_fmt_cb fmt_cb);
#endif
__END_DECLS

#endif /* DNET_BLOB_H */
