summaryrefslogtreecommitdiff
path: root/filter/buffer.c
diff options
context:
space:
mode:
authorTor Andersson <tor@ghostscript.com>2004-10-05 04:50:44 +0200
committerTor Andersson <tor@ghostscript.com>2004-10-05 04:50:44 +0200
commit00905a4e2b959ccc3b79381acbf1d3b8e5319e8e (patch)
treee880b845138781aa72473a7be579152a5d20e4eb /filter/buffer.c
parent970ce563601547adcaa131229bf296f5c3e2db3c (diff)
downloadmupdf-00905a4e2b959ccc3b79381acbf1d3b8e5319e8e.tar.xz
refactor file code. fix file writing.
Diffstat (limited to 'filter/buffer.c')
-rw-r--r--filter/buffer.c27
1 files changed, 26 insertions, 1 deletions
diff --git a/filter/buffer.c b/filter/buffer.c
index 7b728b9b..25e30a55 100644
--- a/filter/buffer.c
+++ b/filter/buffer.c
@@ -8,6 +8,7 @@ fz_newbuffer(fz_buffer **bp, int size)
b = *bp = fz_malloc(sizeof(fz_buffer));
if (!b) return fz_outofmem;
+ b->ownsdata = 1;
b->bp = fz_malloc(size);
if (!b->bp) { fz_free(b); return fz_outofmem; }
@@ -19,10 +20,31 @@ fz_newbuffer(fz_buffer **bp, int size)
return nil;
}
+fz_error *
+fz_newbufferwithdata(fz_buffer **bp, unsigned char *data, int size)
+{
+ fz_buffer *b;
+
+ b = *bp = fz_malloc(sizeof(fz_buffer));
+ if (!b) return fz_outofmem;
+
+ b->ownsdata = 0;
+ b->bp = data;
+
+ b->rp = b->bp;
+ b->wp = b->bp;
+ b->ep = b->bp + size;
+ b->eof = 0;
+
+ return nil;
+}
+
+
void
fz_freebuffer(fz_buffer *buf)
{
- fz_free(buf->bp);
+ if (buf->ownsdata)
+ fz_free(buf->bp);
fz_free(buf);
}
@@ -35,6 +57,8 @@ fz_growbuffer(fz_buffer *buf)
int wp = buf->wp - buf->bp;
int ep = buf->ep - buf->bp;
+ assert(buf->ownsdata);
+
newbp = fz_realloc(buf->bp, ep * 2);
if (!newbp) return fz_outofmem;
@@ -49,6 +73,7 @@ fz_growbuffer(fz_buffer *buf)
fz_error *
fz_rewindbuffer(fz_buffer *buf)
{
+ assert(buf->ownsdata);
memmove(buf->bp, buf->rp, buf->wp - buf->rp);
buf->wp = buf->bp + (buf->wp - buf->rp);
buf->rp = buf->bp;