#include #include #include #include "accum.h" struct mm_accum { int type; unsigned char *buf; int extra; int len; int have; } ; ACCUM *accum_init(int type) { ACCUM *a; int x; switch (type) { case ACCUM_BINARY: x = 0; break; case ACCUM_NULLTERM: x = 1; break; default: errno = EINVAL; return(0); break; } a = malloc(sizeof(ACCUM)); if (a == 0) return(0); a->type = type; a->buf = malloc(1); a->extra = x; a->len = 0; a->have = 0; return(a); } void accum_char(ACCUM *a, int ch) { if (a->len >= a->have) a->buf = realloc(a->buf,(a->have=a->len+8)+a->extra); a->buf[a->len++] = ch; } void accum_block(ACCUM *a, const void *buf, int buflen) { if (buflen < 1) return; if (a->len+buflen > a->have) a->buf = realloc(a->buf,(a->have=a->len+buflen+8)+a->extra); bcopy(buf,a->buf+a->len,buflen); a->len += buflen; } void *accum_buf(ACCUM *a) { switch (a->type) { case ACCUM_NULLTERM: a->buf[a->len] = '\0'; break; } return(a->buf); } int accum_len(ACCUM *a) { return(a->len); } void accum_free(ACCUM *a) { free(a->buf); free(a); }