summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common/util.c13
-rw-r--r--include/util.h6
-rw-r--r--test/utils_str.c28
3 files changed, 46 insertions, 1 deletions
diff --git a/common/util.c b/common/util.c
index 152c8370d0..7ed4c45c53 100644
--- a/common/util.c
+++ b/common/util.c
@@ -19,6 +19,17 @@ __stdlib_compat size_t strlen(const char *s)
return len;
}
+__stdlib_compat size_t strcspn(const char *s, const char *reject)
+{
+ size_t i;
+ size_t reject_len = strlen(reject);
+
+ for (i = 0; s[i] != 0; i++)
+ for (size_t j = 0; j < reject_len; j++)
+ if (s[i] == reject[j])
+ return i;
+ return i;
+}
__stdlib_compat size_t strnlen(const char *s, size_t maxlen)
{
@@ -207,7 +218,7 @@ __stdlib_compat unsigned long long int strtoull(const char *nptr, char **endptr,
*endptr = (char *)nptr - 1;
return result;
}
-
+
base = find_base(base, &c, &nptr);
while (c) {
diff --git a/include/util.h b/include/util.h
index 21603484bb..4ed352f0d7 100644
--- a/include/util.h
+++ b/include/util.h
@@ -124,6 +124,12 @@ void *memchr(const void *buffer, int c, size_t n);
*/
char *strstr(const char *s1, const char *s2);
+/**
+ * Calculates the length of the initial segment of s which consists
+ * entirely of bytes not in reject.
+ */
+size_t strcspn(const char *s, const char *reject);
+
size_t strlen(const char *s);
char *strncpy(char *dest, const char *src, size_t n);
int strncmp(const char *s1, const char *s2, size_t n);
diff --git a/test/utils_str.c b/test/utils_str.c
index c592f6100a..f184abffa6 100644
--- a/test/utils_str.c
+++ b/test/utils_str.c
@@ -260,6 +260,33 @@ static int test_snprintf(void)
TEST_CHECK(strncmp(buffer, "1234", sizeof(buffer)));
}
+static int test_strcspn(void)
+{
+ const char str1[] = "abc";
+ const char str2[] = "This is a string\nwith newlines!";
+
+ TEST_EQ(strcspn(str1, "a"), (size_t)0, "%zu");
+ TEST_EQ(strcspn(str1, "b"), (size_t)1, "%zu");
+ TEST_EQ(strcspn(str1, "c"), (size_t)2, "%zu");
+ TEST_EQ(strcspn(str1, "ccc"), (size_t)2, "%zu");
+ TEST_EQ(strcspn(str1, "cba"), (size_t)0, "%zu");
+ TEST_EQ(strcspn(str1, "cb"), (size_t)1, "%zu");
+ TEST_EQ(strcspn(str1, "bc"), (size_t)1, "%zu");
+ TEST_EQ(strcspn(str1, "cbc"), (size_t)1, "%zu");
+ TEST_EQ(strcspn(str1, "z"), strlen(str1), "%zu");
+ TEST_EQ(strcspn(str1, "xyz"), strlen(str1), "%zu");
+ TEST_EQ(strcspn(str1, ""), strlen(str1), "%zu");
+
+ TEST_EQ(strcspn(str2, " "), (size_t)4, "%zu");
+ TEST_EQ(strcspn(str2, "\n"), (size_t)16, "%zu");
+ TEST_EQ(strcspn(str2, "\n "), (size_t)4, "%zu");
+ TEST_EQ(strcspn(str2, "!"), strlen(str2) - 1, "%zu");
+ TEST_EQ(strcspn(str2, "z"), strlen(str2), "%zu");
+ TEST_EQ(strcspn(str2, "z!"), strlen(str2) - 1, "%zu");
+
+ return EC_SUCCESS;
+}
+
void run_test(int argc, char **argv)
{
test_reset();
@@ -279,6 +306,7 @@ void run_test(int argc, char **argv)
RUN_TEST(test_strncasecmp);
RUN_TEST(test_atoi);
RUN_TEST(test_snprintf);
+ RUN_TEST(test_strcspn);
test_print_result();
}