changeset 799:6371fb111e27

buffer: add buffer size argument to buffer_init_static This allows us to specify two different aspects of the buffer - the used size and the "allocated" size we can grow to. This is mostly useful for writable buffers that we want to start at zero size without having to call buffer_truncate(0) immediately after initialization. Signed-off-by: Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
author Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
date Thu, 02 Apr 2020 16:08:58 -0400
parents 29db876d8157
children 299dffade145
files buffer.c cbor-dumper.c fmt_cbor.c include/jeffpc/buffer.h tests/test_buffer.c tests/test_cbor_pack.c tests/test_cbor_peek.c tests/test_cbor_unpack.c tests/test_nvl_pack.c val_pack.c val_unpack.c
diffstat 11 files changed, 94 insertions(+), 74 deletions(-) [+]
line wrap: on
line diff
--- a/buffer.c	Sat Mar 28 11:52:07 2020 -0400
+++ b/buffer.c	Thu Apr 02 16:08:58 2020 -0400
@@ -84,12 +84,14 @@
 }
 
 void buffer_init_static(struct buffer *buffer, const void *data, size_t size,
-			bool writable)
+			size_t bufsize, bool writable)
 {
+	ASSERT3U(size, <=, bufsize);
+
 	buffer->data = (void *) data;
 	buffer->off = 0;
 	buffer->size = size;
-	buffer->allocsize = size;
+	buffer->allocsize = bufsize;
 	buffer->ops = writable ? &static_buffer_rw : &static_buffer_ro;
 	buffer->heap = false;
 }
--- a/cbor-dumper.c	Sat Mar 28 11:52:07 2020 -0400
+++ b/cbor-dumper.c	Thu Apr 02 16:08:58 2020 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2019 Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
+ * Copyright (c) 2019-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
@@ -37,7 +37,7 @@
 		exit(1);
 	}
 
-	buffer_init_static(&input, in, len, false);
+	buffer_init_static(&input, in, len, len, false);
 
 	val = cbor_unpack_val(&input);
 	if (IS_ERR(val)) {
--- a/fmt_cbor.c	Sat Mar 28 11:52:07 2020 -0400
+++ b/fmt_cbor.c	Thu Apr 02 16:08:58 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
@@ -520,7 +520,7 @@
 	int ret;
 
 	buffer_init_static(&tmp, buffer_data_current(buffer),
-			   buffer_remain(buffer), false);
+			   buffer_remain(buffer), buffer_remain(buffer), false);
 
 	ret = unpack_cbor_int(&tmp, CMT_UINT, v);
 	if (ret)
@@ -535,7 +535,7 @@
 	int ret;
 
 	buffer_init_static(&tmp, buffer_data_current(buffer),
-			   buffer_remain(buffer), false);
+			   buffer_remain(buffer), buffer_remain(buffer), false);
 
 	ret = unpack_cbor_int(&tmp, CMT_NINT, v);
 	if (ret)
@@ -555,7 +555,7 @@
 	 */
 
 	buffer_init_static(&tmp, buffer_data_current(buffer),
-			   buffer_remain(buffer), false);
+			   buffer_remain(buffer), buffer_remain(buffer), false);
 
 	ret = cbor_unpack_uint(&tmp, &tmpv);
 	if (!ret) {
@@ -572,7 +572,7 @@
 	 */
 
 	buffer_init_static(&tmp, buffer_data_current(buffer),
-			   buffer_remain(buffer), false);
+			   buffer_remain(buffer), buffer_remain(buffer), false);
 
 	ret = cbor_unpack_nint(&tmp, &tmpv);
 	if (!ret) {
@@ -601,7 +601,7 @@
 	char *out;
 
 	buffer_init_static(&tmp, buffer_data_current(buffer),
-			   buffer_remain(buffer), false);
+			   buffer_remain(buffer), buffer_remain(buffer), false);
 
 	ret = unpack_cbor_int(&tmp, CMT_TEXT, &parsed_len);
 	if (ret)
@@ -663,7 +663,7 @@
 	int ret;
 
 	buffer_init_static(&tmp, buffer_data_current(buffer),
-			   buffer_remain(buffer), false);
+			   buffer_remain(buffer), buffer_remain(buffer), false);
 
 	ret = unpack_cbor_float(&tmp, &extra);
 	if (ret)
@@ -690,7 +690,7 @@
 	int ret;
 
 	buffer_init_static(&tmp, buffer_data_current(buffer),
-			   buffer_remain(buffer), false);
+			   buffer_remain(buffer), buffer_remain(buffer), false);
 
 	ret = unpack_cbor_float(&tmp, &extra);
 	if (ret)
@@ -713,7 +713,7 @@
 	int ret;
 
 	buffer_init_static(&tmp, buffer_data_current(buffer),
-			   buffer_remain(buffer), false);
+			   buffer_remain(buffer), buffer_remain(buffer), false);
 
 	ret = unpack_cbor_float(&tmp, &extra);
 	if (ret)
@@ -736,7 +736,7 @@
 	int ret;
 
 	buffer_init_static(&tmp, buffer_data_current(buffer),
-			   buffer_remain(buffer), false);
+			   buffer_remain(buffer), buffer_remain(buffer), false);
 
 	ret = unpack_cbor_arraymap_start(&tmp, CMT_MAP, ADDL_MAP_INDEF,
 					 npairs, end_required);
@@ -761,7 +761,7 @@
 	int ret;
 
 	buffer_init_static(&tmp, buffer_data_current(buffer),
-			   buffer_remain(buffer), false);
+			   buffer_remain(buffer), buffer_remain(buffer), false);
 
 	ret = unpack_cbor_arraymap_start(&tmp, CMT_ARRAY, ADDL_ARRAY_INDEF,
 					 nelem, end_required);
@@ -1036,7 +1036,7 @@
 	int ret;
 
 	buffer_init_static(&tmp, buffer_data_current(buffer),
-			   buffer_remain(buffer), false);
+			   buffer_remain(buffer), buffer_remain(buffer), false);
 
 	val = unpack_cbor_val(&tmp);
 	if (IS_ERR(val))
--- a/include/jeffpc/buffer.h	Sat Mar 28 11:52:07 2020 -0400
+++ b/include/jeffpc/buffer.h	Thu Apr 02 16:08:58 2020 -0400
@@ -70,9 +70,12 @@
 /*
  * a buffer that wraps a data pointer (we use const void * to allow passing
  * in both void * and const void *)
+ *
+ * size is the "written" size while bufsize is the actual size of the
+ * backing buffer - beyond which we cannot write/grow
  */
 extern void buffer_init_static(struct buffer *buffer, const void *data,
-			       size_t size, bool writable);
+			       size_t size, size_t allocsize, bool writable);
 /* a buffer that writes to a FILE * */
 extern void buffer_init_stdio(struct buffer *buffer, FILE *f);
 
--- a/tests/test_buffer.c	Sat Mar 28 11:52:07 2020 -0400
+++ b/tests/test_buffer.c	Thu Apr 02 16:08:58 2020 -0400
@@ -26,6 +26,11 @@
 
 #include "test.c"
 
+#define COMMON_TEST_STRING \
+	"759f7e2d-67ec-4e72-8f61-86a3fd93b1be" \
+	"60e9149e-d039-e32b-b25d-c995b28bf890" \
+	"40f0fddc-ddca-4ff5-cd81-b0ae4c7d6123"
+
 /* allocate a heap buffer - either on the heap or on the stack */
 static inline struct buffer *alloc_heap_buffer(struct buffer *buf, size_t size)
 {
@@ -325,7 +330,8 @@
 	struct buffer buffer;
 
 	/* (statically) check for passing in const pointer being ok */
-	buffer_init_static(&buffer, const_data, strlen(const_data), false);
+	buffer_init_static(&buffer, const_data, strlen(const_data),
+			   strlen(const_data), false);
 }
 
 void test_static_ro(void)
@@ -336,7 +342,8 @@
 	struct buffer buffer;
 	int i;
 
-	buffer_init_static(&buffer, rawdata, strlen(rawdata), false);
+	buffer_init_static(&buffer, rawdata, strlen(rawdata), strlen(rawdata),
+			   false);
 
 	check_used(&buffer, strlen(rawdata));
 	check_data_ptr(&buffer, rawdata);
@@ -358,49 +365,57 @@
 
 void test_static_rw(void)
 {
-	char rawdata[] = "759f7e2d-67ec-4e72-8f61-86a3fd93b1be"
-			 "60e9149e-d039-e32b-b25d-c995b28bf890"
-			 "40f0fddc-ddca-4ff5-cd81-b0ae4c7d6123";
+	char rawdata[] = COMMON_TEST_STRING;
 	const size_t rawlen = strlen(rawdata);
 	struct buffer buffer;
+	size_t size;
 
-	buffer_init_static(&buffer, rawdata, rawlen, true);
+	for (size = 0; size <= rawlen; size++) {
+		buffer_init_static(&buffer, rawdata, size, rawlen, true);
 
-	fprintf(stderr, "%s: initial sanity check...", __func__);
-	check_used(&buffer, rawlen);
-	check_data_ptr(&buffer, rawdata);
-	fprintf(stderr, "ok.\n");
+		fprintf(stderr, "%s(%zu): initial sanity check...", __func__,
+			size);
+		check_used(&buffer, size);
+		check_data_ptr(&buffer, rawdata);
+		fprintf(stderr, "ok.\n");
 
-	fprintf(stderr, "%s: append to a full buffer...", __func__);
-	check_append_err(&buffer, "abc", 3, -ENOSPC);
-	check_used(&buffer, rawlen);
-	check_data_ptr(&buffer, rawdata);
-	fprintf(stderr, "ok.\n");
+		fprintf(stderr, "%s(%zu): append to a buffer without enough "
+			"space...", __func__, size);
+		check_append_err(&buffer, COMMON_TEST_STRING, rawlen + 1,
+				 -ENOSPC);
+		check_used(&buffer, size);
+		check_data_ptr(&buffer, rawdata);
+		fprintf(stderr, "ok.\n");
 
-	fprintf(stderr, "%s: truncate to a larger than original size...",
-		__func__);
-	check_truncate_err(&buffer, rawlen + 1, -ENOSPC);
-	check_used(&buffer, rawlen);
-	check_data_ptr(&buffer, rawdata);
-	fprintf(stderr, "ok.\n");
+		fprintf(stderr, "%s(%zu): truncate to a larger than buffer "
+			"size...", __func__, size);
+		check_truncate_err(&buffer, rawlen + 1, -ENOSPC);
+		check_used(&buffer, size);
+		check_data_ptr(&buffer, rawdata);
+		fprintf(stderr, "ok.\n");
+
+		if (size >= 5) {
+			fprintf(stderr, "%s(%zu): truncate to a smaller than "
+				"initial size...", __func__, size);
+			check_truncate_err(&buffer, size - 5, 0);
+			check_used(&buffer, size - 5);
+			check_data_ptr(&buffer, rawdata);
+			fprintf(stderr, "ok.\n");
 
-	fprintf(stderr, "%s: truncate to a smaller size...", __func__);
-	check_truncate_err(&buffer, rawlen - 10, 0);
-	check_used(&buffer, rawlen - 10);
-	check_data_ptr(&buffer, rawdata);
-	fprintf(stderr, "ok.\n");
+			fprintf(stderr, "%s(%zu): append too much...", __func__, size);
+			check_append_err(&buffer, COMMON_TEST_STRING COMMON_TEST_STRING,
+					 rawlen - size + 11, -ENOSPC);
+			check_used(&buffer, size - 5);
+			check_data_ptr(&buffer, rawdata);
+			fprintf(stderr, "ok.\n");
 
-	fprintf(stderr, "%s: append too much...", __func__);
-	check_append_err(&buffer, "12345678901", 11, -ENOSPC);
-	check_used(&buffer, rawlen - 10);
-	check_data_ptr(&buffer, rawdata);
-	fprintf(stderr, "ok.\n");
-
-	fprintf(stderr, "%s: append a little...", __func__);
-	check_append_err(&buffer, "12345", 5, 0);
-	check_used(&buffer, rawlen - 5);
-	check_data_ptr(&buffer, rawdata);
-	fprintf(stderr, "ok.\n");
+			fprintf(stderr, "%s(%zu): append a little...", __func__, size);
+			check_append_err(&buffer, COMMON_TEST_STRING, 5, 0);
+			check_used(&buffer, size);
+			check_data_ptr(&buffer, rawdata);
+			fprintf(stderr, "ok.\n");
+		}
+	}
 }
 
 void test(void)
--- a/tests/test_cbor_pack.c	Sat Mar 28 11:52:07 2020 -0400
+++ b/tests/test_cbor_pack.c	Thu Apr 02 16:08:58 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
@@ -187,7 +187,7 @@
 	if (IS_ERR(lv))
 		fail("failed to parse input: %s", xstrerror(PTR_ERR(lv)));
 
-	buffer_init_static(&expected, out, olen, false);
+	buffer_init_static(&expected, out, olen, olen, false);
 
 	onefile(lv, &expected);
 }
--- a/tests/test_cbor_peek.c	Sat Mar 28 11:52:07 2020 -0400
+++ b/tests/test_cbor_peek.c	Thu Apr 02 16:08:58 2020 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2019 Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
+ * Copyright (c) 2019-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
@@ -69,7 +69,7 @@
 
 	fprintf(stderr, "empty input: expecting -EFAULT...");
 
-	buffer_init_static(&buf, NULL, 0, false);
+	buffer_init_static(&buf, NULL, 0, 0, false);
 
 	ret = cbor_peek_type(&buf, &type);
 
@@ -97,7 +97,7 @@
 
 		in = i;
 
-		buffer_init_static(&buf, &in, sizeof(in), false);
+		buffer_init_static(&buf, &in, sizeof(in), sizeof(in), false);
 
 		/*
 		 * type
--- a/tests/test_cbor_unpack.c	Sat Mar 28 11:52:07 2020 -0400
+++ b/tests/test_cbor_unpack.c	Thu Apr 02 16:08:58 2020 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018-2019 Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
+ * Copyright (c) 2018-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
@@ -45,7 +45,8 @@
 		int ret;						\
 									\
 		buffer_init_static(&tmp, buffer_data(in),		\
-				   buffer_size(in), false);		\
+				   buffer_size(in), buffer_size(in),	\
+				   false);				\
 									\
 		fprintf(stderr, "unpack via %s (should %s)...",		\
 			#fxn, (exp_ret) ? "fail" : "succeed");		\
@@ -81,7 +82,8 @@
 		struct val *ret;					\
 									\
 		buffer_init_static(&tmp, buffer_data(in),		\
-				   buffer_size(in), false);		\
+				   buffer_size(in), buffer_size(in),	\
+				   false);				\
 									\
 		fprintf(stderr, "unpack via cbor_unpack_val (should %s)...",\
 			IS_ERR(exp) ? "fail" : "succeed");		\
@@ -434,7 +436,7 @@
 {
 	struct buffer input;
 
-	buffer_init_static(&input, in, ilen, false);
+	buffer_init_static(&input, in, ilen, ilen, false);
 
 	onefile(&input, get_expected_output(out, olen));
 }
--- a/tests/test_nvl_pack.c	Sat Mar 28 11:52:07 2020 -0400
+++ b/tests/test_nvl_pack.c	Thu Apr 02 16:08:58 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
@@ -145,7 +145,9 @@
 	fprintf(stderr, "nvl_pack_into:\n");
 
 	ret = nvl_pack_into(nvl, raw, rawsize, fmt);
-	buffer_init_static(&tmp, raw, (ret > 0) ? ret : 0, false);
+	buffer_init_static(&tmp, raw,
+			   (ret > 0) ? ret : 0,
+			   (ret > 0) ? ret : 0, false);
 	cmp_buffers(name, hex, expected, &tmp);
 }
 
@@ -275,7 +277,7 @@
 	if (IS_ERR(lv))
 		fail("failed to parse input: %s", xstrerror(PTR_ERR(lv)));
 
-	buffer_init_static(&expected, out, olen, false);
+	buffer_init_static(&expected, out, olen, olen, false);
 
 	onefile(lv, &expected, oext);
 }
--- a/val_pack.c	Sat Mar 28 11:52:07 2020 -0400
+++ b/val_pack.c	Thu Apr 02 16:08:58 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
@@ -43,11 +43,7 @@
 	struct buffer buffer;
 	int ret;
 
-	buffer_init_static(&buffer, buf, bufsize, true);
-
-	ret = buffer_truncate(&buffer, 0);
-	if (ret)
-		return ret;
+	buffer_init_static(&buffer, buf, 0, bufsize, true);
 
 	ret = do_val_pack(&buffer, val, format);
 
--- a/val_unpack.c	Sat Mar 28 11:52:07 2020 -0400
+++ b/val_unpack.c	Thu Apr 02 16:08:58 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
@@ -34,7 +34,7 @@
 	if (!ops || !ops->unpack)
 		return ERR_PTR(-ENOTSUP);
 
-	buffer_init_static(&buffer, ptr, len, false);
+	buffer_init_static(&buffer, ptr, len, len, false);
 
 	return ops->unpack(&buffer);
 }