From: David Gibson Date: Wed, 22 Oct 2014 13:35:26 +0000 (+0200) Subject: bytestring: Add bytestring_index and bytestring_rindex() functions X-Git-Url: http://git.ozlabs.org/?p=ccan;a=commitdiff_plain;h=d584928758cb995a60e8264b73da46bcd8c410ca bytestring: Add bytestring_index and bytestring_rindex() functions Add bytestring equivalents of the index() and rindex() standard functions which search for characters/bytes within a bytestring. Signed-off-by: David Gibson --- diff --git a/ccan/bytestring/_info b/ccan/bytestring/_info index c2aab2d8..f68a4c73 100644 --- a/ccan/bytestring/_info +++ b/ccan/bytestring/_info @@ -35,6 +35,7 @@ int main(int argc, char *argv[]) if (strcmp(argv[1], "depends") == 0) { printf("ccan/array_size\n"); + printf("ccan/mem\n"); return 0; } diff --git a/ccan/bytestring/bytestring.h b/ccan/bytestring/bytestring.h index 54e9fa87..042b1843 100644 --- a/ccan/bytestring/bytestring.h +++ b/ccan/bytestring/bytestring.h @@ -2,12 +2,15 @@ #ifndef CCAN_BYTESTRING_H_ #define CCAN_BYTESTRING_H_ +#include "config.h" + #include #include #include #include #include +#include struct bytestring { const char *ptr; @@ -150,4 +153,32 @@ static inline bool bytestring_ends(struct bytestring s, suffix.ptr, suffix.len) == 0); } +/** + * bytestring_index - locate character in bytestring + * @haystack: a bytestring + * @needle: a character or byte value + * + * Returns a pointer to the first occurrence of @needle within + * @haystack, or NULL if @needle does not appear in @haystack. + */ +static inline const char *bytestring_index(struct bytestring haystack, + char needle) +{ + return memchr(haystack.ptr, needle, haystack.len); +} + +/** + * bytestring_rindex - locate character in bytestring + * @haystack: a bytestring + * @needle: a character or byte value + * + * Returns a pointer to the last occurrence of @needle within + * @haystack, or NULL if @needle does not appear in @haystack. + */ +static inline const char *bytestring_rindex(struct bytestring haystack, + char needle) +{ + return memrchr(haystack.ptr, needle, haystack.len); +} + #endif /* CCAN_BYTESTRING_H_ */ diff --git a/ccan/bytestring/test/compile_fail-BYTESTRING-2.c b/ccan/bytestring/test/compile_fail-BYTESTRING-2.c index 7ab06f82..3c62f941 100644 --- a/ccan/bytestring/test/compile_fail-BYTESTRING-2.c +++ b/ccan/bytestring/test/compile_fail-BYTESTRING-2.c @@ -1,3 +1,5 @@ +#include "config.h" + #include #include diff --git a/ccan/bytestring/test/compile_fail-BYTESTRING.c b/ccan/bytestring/test/compile_fail-BYTESTRING.c index f3fcb20d..1e885751 100644 --- a/ccan/bytestring/test/compile_fail-BYTESTRING.c +++ b/ccan/bytestring/test/compile_fail-BYTESTRING.c @@ -1,3 +1,5 @@ +#include "config.h" + #include #include diff --git a/ccan/bytestring/test/run.c b/ccan/bytestring/test/run.c index ac6368d8..50d28853 100644 --- a/ccan/bytestring/test/run.c +++ b/ccan/bytestring/test/run.c @@ -1,3 +1,5 @@ +#include "config.h" + #include #include @@ -12,7 +14,7 @@ int main(void) struct bytestring bs, bs1, bs2, bs3, bs4, bs5; /* This is how many tests you plan to run */ - plan_tests(30); + plan_tests(42); bs = bytestring(str1, sizeof(str1) - 1); ok1(bs.ptr == str1); @@ -59,6 +61,20 @@ int main(void) ok1(!bytestring_starts(bs2, BYTESTRING("def"))); ok1(!bytestring_ends(bs2, BYTESTRING("abc"))); + ok1(bytestring_index(bs1, ' ') == (bs1.ptr + 4)); + ok1(bytestring_index(bs1, 't') == (bs1.ptr + 0)); + ok1(bytestring_index(bs1, 0) == NULL); + ok1(bytestring_index(bs2, 0) == (bs2.ptr + 3)); + ok1(bytestring_index(bs2, 'f') == (bs2.ptr + 6)); + ok1(bytestring_index(bs2, 'q') == NULL); + + ok1(bytestring_rindex(bs1, ' ') == (bs1.ptr + 4)); + ok1(bytestring_rindex(bs1, 't') == (bs1.ptr + 6)); + ok1(bytestring_rindex(bs1, 0) == NULL); + ok1(bytestring_rindex(bs2, 0) == (bs2.ptr + 3)); + ok1(bytestring_rindex(bs2, 'f') == (bs2.ptr + 6)); + ok1(bytestring_rindex(bs2, 'q') == NULL); + /* This exits depending on whether all tests passed */ return exit_status(); }