string-util: modernize split_pair()

- use _cleanup_free_ attribute,
- rename output arguments,
- trigger assertion when an empty separator is passed.
This commit is contained in:
Yu Watanabe
2024-12-28 16:16:27 +09:00
parent f587da03c2
commit ac3f3026a9
3 changed files with 23 additions and 30 deletions
+10 -18
View File
@@ -1043,34 +1043,26 @@ char* strrep(const char *s, unsigned n) {
return r;
}
int split_pair(const char *s, const char *sep, char **l, char **r) {
char *x, *a, *b;
int split_pair(const char *s, const char *sep, char **ret_first, char **ret_second) {
assert(s);
assert(sep);
assert(l);
assert(r);
assert(!isempty(sep));
assert(ret_first);
assert(ret_second);
if (isempty(sep))
return -EINVAL;
x = strstr(s, sep);
const char *x = strstr(s, sep);
if (!x)
return -EINVAL;
a = strndup(s, x - s);
_cleanup_free_ char *a = strndup(s, x - s);
if (!a)
return -ENOMEM;
b = strdup(x + strlen(sep));
if (!b) {
free(a);
_cleanup_free_ char *b = strdup(x + strlen(sep));
if (!b)
return -ENOMEM;
}
*l = a;
*r = b;
*ret_first = TAKE_PTR(a);
*ret_second = TAKE_PTR(b);
return 0;
}
+1 -1
View File
@@ -214,7 +214,7 @@ char* strrep(const char *s, unsigned n);
_d_; \
})
int split_pair(const char *s, const char *sep, char **l, char **r);
int split_pair(const char *s, const char *sep, char **ret_first, char **ret_second);
int free_and_strdup(char **p, const char *s);
static inline int free_and_strdup_warn(char **p, const char *s) {
+12 -11
View File
@@ -572,21 +572,22 @@ TEST(in_charset) {
TEST(split_pair) {
_cleanup_free_ char *a = NULL, *b = NULL;
assert_se(split_pair("", "", &a, &b) == -EINVAL);
assert_se(split_pair("foo=bar", "", &a, &b) == -EINVAL);
assert_se(split_pair("", "=", &a, &b) == -EINVAL);
assert_se(split_pair("foo=bar", "=", &a, &b) >= 0);
ASSERT_SIGNAL(split_pair("", NULL, &a, &b), SIGABRT);
ASSERT_SIGNAL(split_pair("", "", &a, &b), SIGABRT);
ASSERT_SIGNAL(split_pair("foo=bar", "", &a, &b), SIGABRT);
ASSERT_SIGNAL(split_pair(NULL, "=", &a, &b), SIGABRT);
ASSERT_ERROR(split_pair("", "=", &a, &b), EINVAL);
ASSERT_OK(split_pair("foo=bar", "=", &a, &b));
ASSERT_STREQ(a, "foo");
ASSERT_STREQ(b, "bar");
free(a);
free(b);
assert_se(split_pair("==", "==", &a, &b) >= 0);
a = mfree(a);
b = mfree(b);
ASSERT_OK(split_pair("==", "==", &a, &b));
ASSERT_STREQ(a, "");
ASSERT_STREQ(b, "");
free(a);
free(b);
assert_se(split_pair("===", "==", &a, &b) >= 0);
a = mfree(a);
b = mfree(b);
ASSERT_OK(split_pair("===", "==", &a, &b));
ASSERT_STREQ(a, "");
ASSERT_STREQ(b, "=");
}