[ccan] [PATCH 01/11] bytestring: Add bytestring_byte() function

David Gibson david at gibson.dropbear.id.au
Sun Oct 12 03:43:26 EST 2014


Implement a bytestring_byte() function to extract a single byte / character
from a bytestring.

Signed-off-by: David Gibson <david at gibson.dropbear.id.au>
---
 ccan/bytestring/bytestring.h | 15 +++++++++++++++
 ccan/bytestring/test/run.c   | 10 +++++++++-
 2 files changed, 24 insertions(+), 1 deletion(-)

diff --git a/ccan/bytestring/bytestring.h b/ccan/bytestring/bytestring.h
index 63472fe..77435c9 100644
--- a/ccan/bytestring/bytestring.h
+++ b/ccan/bytestring/bytestring.h
@@ -5,6 +5,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <stdbool.h>
+#include <assert.h>
 
 #include <ccan/array_size/array_size.h>
 
@@ -80,4 +81,18 @@ static inline bool bytestring_eq(struct bytestring a, struct bytestring b)
 		&& (memcmp(a.ptr, b.ptr, a.len) == 0);
 }
 
+/**
+ * bytestring_byte - extract a byte from a bytestring
+ * @s: bytestring
+ * @n: index
+ *
+ * Return the @n-th byte from @s.  Aborts (via assert) if @n is out of
+ * range for the length of @s.
+ */
+static inline char bytestring_byte(struct bytestring s, size_t n)
+{
+	assert(n < s.len);
+	return s.ptr[n];
+}
+
 #endif /* CCAN_BYTESTRING_H_ */
diff --git a/ccan/bytestring/test/run.c b/ccan/bytestring/test/run.c
index 9423b9a..2d86926 100644
--- a/ccan/bytestring/test/run.c
+++ b/ccan/bytestring/test/run.c
@@ -12,7 +12,7 @@ int main(void)
 	struct bytestring bs, bs1, bs2, bs3, bs4, bs5;
 
 	/* This is how many tests you plan to run */
-	plan_tests(9);
+	plan_tests(16);
 
 	bs = bytestring(str1, sizeof(str1) - 1);
 	ok1(bs.ptr == str1);
@@ -35,6 +35,14 @@ int main(void)
 	ok1(bs5.ptr == NULL);
 	ok1(bytestring_eq(bs5, bytestring_NULL));
 
+	ok1(bytestring_byte(bs2, 0) == 'a');
+	ok1(bytestring_byte(bs2, 1) == 'b');
+	ok1(bytestring_byte(bs2, 2) == 'c');
+	ok1(bytestring_byte(bs2, 3) == '\0');
+	ok1(bytestring_byte(bs2, 4) == 'd');
+	ok1(bytestring_byte(bs2, 5) == 'e');
+	ok1(bytestring_byte(bs2, 6) == 'f');
+	
 	/* This exits depending on whether all tests passed */
 	return exit_status();
 }
-- 
1.9.3



More information about the ccan mailing list