/* this is the brisby fancy buffer */
#ifndef __bin_h
#define __bin_h

#include "mem.h"
#include "error.h"

#define bin_init(s) do { s[0].buf = 0; s->len = s->used = 0; } while(0)

struct bin_s {
	char *buf;
	int len;
	int used;
};

typedef struct bin_s bin_t[1];

#define caddr(x) ((x)->buf)
#define clen(x) ((x)->used)

#include <stdlib.h>

static void inline bin_need(bin_t p, int tot)
{
	if (tot > p->len) {
		/* Clib */
		p->buf = realloc(p->buf, tot);
		if (!p->buf) {
			cfatal("bin_need:realloc: %s");
		}
		p->len = tot;
	}
}
static void inline bin_needplus(bin_t p, int amu)
{
	bin_need(p, p->used+amu);
}

static void inline bin_cat(bin_t p, char *s, int len) {
	bin_needplus(p, len);
	memcpy(p->buf + p->used, s, len);
	p->used += len;
}

static void inline bin_addch(bin_t p, int ch) {
	char b[2];

	b[0] = ch;
	bin_cat(p, b, 1);
}

static void inline bin_empty(bin_t p) {
	if (p) p->used = 0;
}
static void inline bin_0(bin_t p) {
	bin_addch(p, '\0');
}

static void inline bin_copy(bin_t p, const char *s, int len) {
	bin_need(p, len);
	memcpy(p->buf, s, len);
	p->used = len;
}

static int inline bin_len(bin_t p) {
	return p->len;
}

#endif


syntax highlighted by Code2HTML, v. 0.9.1