#include #include #include "memstream.h" typedef struct chunk CHUNK; struct chunk { CHUNK *link; unsigned char data[8000]; int fill; } ; struct memstream { CHUNK *chunks; CHUNK **chunkt; CHUNK *wcur; CHUNK *rcur; int rptr; int totalsize; } ; static void append_new_chunk(MEMSTREAM *m) { m->wcur = malloc(sizeof(CHUNK)); *m->chunkt = m->wcur; m->chunkt = &m->wcur->link; m->wcur->fill = 0; m->rptr = 0; m->totalsize = 0; } MEMSTREAM *memstream_open_w(void) { MEMSTREAM *m; m = malloc(sizeof(MEMSTREAM)); m->chunks = 0; m->chunkt = &m->chunks; m->wcur = 0; m->rcur = 0; return(m); } void memstream_append(MEMSTREAM *m, const void *data, int len) { const char *dp; int n; if (len < 1) return; if (m->wcur == 0) append_new_chunk(m); dp = data; while (1) { n = sizeof(m->wcur->data) - m->wcur->fill; if (len <= n) { bcopy(dp,&m->wcur->data[m->wcur->fill],len); m->wcur->fill += len; m->totalsize += len; break; } bcopy(dp,&m->wcur->data[m->wcur->fill],n); m->wcur->fill += n; m->totalsize += n; append_new_chunk(m); dp += n; len -= n; } } void memstream_dump(MEMSTREAM *m, void (*each)(const void *, int)) { CHUNK *c; for (c=m->chunks;c;c=c->link) (*each)(&c->data[0],c->fill); } unsigned int memstream_size(MEMSTREAM *m) { return(m->totalsize); } extern void memstream_free(MEMSTREAM *m) { CHUNK *c; while (1) { c = m->chunks; if (! c) break; m->chunks = c->link; free(c); } free(m); }