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);