Mercurial > libjeffpc
changeset 797:4c0939533a78
buffer: allow buffer_free calls on stack allocated buffer structures
Signed-off-by: Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
author | Josef 'Jeff' Sipek <jeffpc@josefsipek.net> |
---|---|
date | Sat, 28 Mar 2020 11:51:48 -0400 |
parents | cf1cd2707dfb |
children | 29db876d8157 |
files | buffer.c include/jeffpc/buffer.h |
diffstat | 2 files changed, 9 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/buffer.c Sat Mar 28 10:39:35 2020 -0400 +++ b/buffer.c Sat Mar 28 11:51:48 2020 -0400 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2019 Josef 'Jeff' Sipek <jeffpc@josefsipek.net> + * Copyright (c) 2017-2020 Josef 'Jeff' Sipek <jeffpc@josefsipek.net> * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -44,6 +44,7 @@ buffer->size = 0; buffer->allocsize = expected_size; buffer->ops = &heap_buffer; + buffer->heap = true; return buffer; } @@ -56,7 +57,8 @@ if (buffer->ops->free) buffer->ops->free(buffer->data); - free(buffer); + if (buffer->heap) + free(buffer); } void buffer_init_sink(struct buffer *buffer) @@ -66,6 +68,7 @@ buffer->size = 0; buffer->allocsize = SIZE_MAX; buffer->ops = &sink_buffer; + buffer->heap = false; } void buffer_init_static(struct buffer *buffer, const void *data, size_t size, @@ -76,6 +79,7 @@ buffer->size = size; buffer->allocsize = size; buffer->ops = writable ? &static_buffer_rw : &static_buffer_ro; + buffer->heap = false; } void buffer_init_stdio(struct buffer *buffer, FILE *f) @@ -86,6 +90,7 @@ buffer->allocsize = SIZE_MAX; buffer->ops = &stdio_buffer; buffer->private = f; + buffer->heap = false; } static int resize(struct buffer *buffer, size_t newsize)
--- a/include/jeffpc/buffer.h Sat Mar 28 10:39:35 2020 -0400 +++ b/include/jeffpc/buffer.h Sat Mar 28 11:51:48 2020 -0400 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2019 Josef 'Jeff' Sipek <jeffpc@josefsipek.net> + * Copyright (c) 2017-2020 Josef 'Jeff' Sipek <jeffpc@josefsipek.net> * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -56,6 +56,7 @@ size_t allocsize; /* allocated buffer size */ const struct buffer_ops *ops; void *private; /* private data for implementation */ + bool heap:1; /* struct buffer is on the heap */ }; extern struct buffer *buffer_alloc(size_t expected_size);