/* $Header: /CVSROOT/debris/drisbuf.h,v 1.4 2005/08/15 01:04:52 tino Exp $ * * DebRIS: DEBian Remote Install Scripter * Data buffers * * $Log: drisbuf.h,v $ * Revision 1.4 2005/08/15 01:04:52 tino * all functions now have a prefix (dris_) * * Revision 1.3 2005/07/25 03:12:36 tino * added dris_buf_printf * * Revision 1.2 2005/07/24 22:14:27 tino * added dris_buf_pull * * Revision 1.1 2005/06/01 02:12:34 tino * first version. As SirbeD is missing, this just does nothing yet. */ struct dris_buf { size_t len, max; char *buf; }; static void * alloc(void *ptr, size_t len) { void *tmp; if ((tmp=(ptr ? realloc(ptr, len) : malloc(len)))==0) dris_ex("out of memory"); return tmp; } static struct dris_buf * dris_buf_extend(struct dris_buf *buf, size_t len) { buf->buf = alloc(buf->buf, (buf->max=buf->len+len)+1); buf->buf[buf->len] = 0; return buf; } static struct dris_buf * dris_buf_printf(struct dris_buf *buf, const char *s, va_list list) { size_t n; for (n=BUFSIZ;; n+=BUFSIZ) { int k; dris_buf_extend(buf, n); k = vsnprintf(buf->buf+buf->len, buf->max-buf->len+1, s, list); if (k>=0 && klen += k; return buf; } } } static struct dris_buf * dris_buf_new(void) { struct dris_buf *tmp; tmp = alloc(NULL, sizeof *tmp); tmp->len = 0; tmp->max = 0; tmp->buf = 0; return dris_buf_extend(tmp, BUFSIZ); } static struct dris_buf * dris_buf_add(struct dris_buf *buf, const void *ptr, size_t len) { buf = dris_buf_extend(buf, len); memcpy(buf->buf+buf->len, ptr, len); buf->len += len; buf->buf[buf->len] = 0; return buf; } static struct dris_buf * dris_buf_add_s(struct dris_buf *buf, const char *s) { return dris_buf_add(buf, s, strlen(s)); } static struct dris_buf * dris_buf_reset(struct dris_buf *buf) { buf->len = 0; buf->buf[0] = 0; return buf; } static struct dris_buf * dris_buf_pull(struct dris_buf *buf, int n) { if (n>=buf->len) return dris_buf_reset(buf); memmove(buf->buf, buf->buf+n, buf->len-=n); buf->buf[buf->len] = 0; return buf; }