Browse Source

bytestring: bytestring_starts() and bytestring_ends() functions

This implements bytestring_starts() and bytestring_ends() which
will test if a given bytestring starts or ends with another given
bytestring.

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
David Gibson 11 years ago
parent
commit
4a234682ef
2 changed files with 38 additions and 1 deletions
  1. 28 0
      ccan/bytestring/bytestring.h
  2. 10 1
      ccan/bytestring/test/run.c

+ 28 - 0
ccan/bytestring/bytestring.h

@@ -122,4 +122,32 @@ static inline struct bytestring bytestring_slice(struct bytestring s,
 	return bytestring(s.ptr + start, end - start);
 }
 
+/**
+ * bytestring_starts - test if the start of one bytestring matches another
+ * @s, @prefix: bytestrings
+ *
+ * Returns true if @prefix appears as a substring at the beginning of
+ * @s, false otherwise.
+ */
+static inline bool bytestring_starts(struct bytestring s,
+				     struct bytestring prefix)
+{
+	return (s.len >= prefix.len) && (memcmp(s.ptr,
+						prefix.ptr, prefix.len) == 0);
+}
+
+/**
+ * bytestring_ends - test if the end of one bytestring matches another
+ * @s, @suffix: bytestrings
+ *
+ * Returns true if @suffix appears as a substring at the end of @s,
+ * false otherwise.
+ */
+static inline bool bytestring_ends(struct bytestring s,
+				   struct bytestring suffix)
+{
+	return (s.len >= suffix.len) && (memcmp(s.ptr + s.len - suffix.len,
+						suffix.ptr, suffix.len) == 0);
+}
+
 #endif /* CCAN_BYTESTRING_H_ */

+ 10 - 1
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(22);
+	plan_tests(30);
 
 	bs = bytestring(str1, sizeof(str1) - 1);
 	ok1(bs.ptr == str1);
@@ -50,6 +50,15 @@ int main(void)
 	ok1(bytestring_eq(bytestring_slice(bs2, 10, 20), bytestring_NULL));
 	ok1(bytestring_eq(bytestring_slice(bs2, 2, 1), bytestring_NULL));
 
+	ok1(bytestring_starts(bs, BYTESTRING("test")));
+	ok1(bytestring_ends(bs, BYTESTRING("string")));
+	ok1(bytestring_starts(bs2, BYTESTRING("abc")));
+	ok1(bytestring_starts(bs2, BYTESTRING("abc\0")));
+	ok1(bytestring_ends(bs2, BYTESTRING("def")));
+	ok1(bytestring_ends(bs2, BYTESTRING("\0def")));
+	ok1(!bytestring_starts(bs2, BYTESTRING("def")));
+	ok1(!bytestring_ends(bs2, BYTESTRING("abc")));
+
 	/* This exits depending on whether all tests passed */
 	return exit_status();
 }