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:
+10
-18
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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
@@ -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, "=");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user