static fpos_t memstream_seek(void *cookie, fpos_t offset, int whence) { struct memstream *ms = (struct memstream *)cookie; fpos_t pos = 0; memstream_check(ms); memstream_info(("memstream_seek %p %i %i\n", ms, (int)offset, whence)); switch (whence) { case SEEK_SET: pos = offset; break; case SEEK_CUR: pos = ms->position + offset; break; case SEEK_END: pos = ms->size + offset; break; default: errno = EINVAL; return -1; } if (pos >= ms->capacity) memstream_grow(ms, pos); ms->position = pos; if (ms->size < ms->position) *ms->sizeloc = ms->size = ms->position; memstream_print(ms); memstream_info(("=> %i\n", (int)pos)); assert(ms->size < ms->capacity && ms->contents[ms->size] == 0); return pos; }
static int memstream_write(void *cookie, const char *buf, int count) { struct memstream *ms= (struct memstream *)cookie; memstream_check(ms); if (ms->capacity <= ms->position + count) if (memstream_grow(ms, ms->position + count) < 0) /* errno == ENOMEM */ return -1; memcpy(ms->contents + ms->position, buf, count); memstream_info(("memstream_write %p %i\n", ms, count)); ms->position += count; if (ms->size < ms->position) *ms->sizeloc= ms->size= ms->position; memstream_print(ms); assert(ms->size < ms->capacity); assert(ms->contents[ms->size] == 0); return count; }
static int memstream_write(void *cookie, const char *buf, int len) { struct memstream *ms; int tocopy; ms = cookie; memstream_grow(ms, ms->offset + len); tocopy = *ms->lenp - ms->offset; if(len < tocopy) tocopy = len; memcpy(*ms->cp + ms->offset, buf, tocopy); ms->offset += tocopy; #ifdef DEBUG fprintf(stderr, "MS: write(%p, %d) = %d\n", ms, len, tocopy); #endif return (tocopy); }
static int memstream_read(void *cookie, char *buf, int len) { struct memstream *ms; int tocopy; ms = cookie; memstream_grow(ms, ms->offset + len); tocopy = *ms->lenp - ms->offset; if (len < tocopy) tocopy = len; memcpy(buf, *ms->cp + ms->offset, tocopy); ms->offset += tocopy; #ifdef MEMSTREAM_DEBUG fprintf(stderr, "MS: read(%p, %d) = %d\n", ms, len, tocopy); #endif return (tocopy); }
static int memstream_write(void *cookie, const char *buf, int len) { struct memstream *ms; ssize_t tocopy; ms = cookie; if (!memstream_grow(ms, ms->offset + len)) return (-1); tocopy = ms->len - ms->offset; if (len < tocopy) tocopy = len; memcpy(*ms->bufp + ms->offset, buf, tocopy); ms->offset += tocopy; memstream_update(ms); #ifdef DEBUG fprintf(stderr, "MS: write(%p, %d) = %zd\n", ms, len, tocopy); #endif return (tocopy); }