busctl: add and use strcmp_ptr()

In member_compare_func(), it compares interface, type and name of
members.  But as it can contain NULL pointer, it needs to check them
before calling strcmp().  So make it as a separate strcmp_ptr
function (named after streq_ptr) so that it can be used by others.

Also let streq_ptr() to use it in order to make the code simpler.
This commit is contained in:
Namhyung Kim
2015-08-01 02:16:24 +09:00
parent 10189fd6be
commit c030a850ba
4 changed files with 31 additions and 24 deletions
+13 -7
View File
@@ -115,17 +115,23 @@ size_t page_size(void) {
return pgsz;
}
bool streq_ptr(const char *a, const char *b) {
/* Like streq(), but tries to make sense of NULL pointers */
int strcmp_ptr(const char *a, const char *b) {
/* Like strcmp(), but tries to make sense of NULL pointers */
if (a && b)
return streq(a, b);
return strcmp(a, b);
if (!a && !b)
return true;
if (!a && b)
return -1;
return false;
if (a && !b)
return 1;
return 0;
}
bool streq_ptr(const char *a, const char *b) {
return strcmp_ptr(a, b) == 0;
}
char* endswith(const char *s, const char *postfix) {
+1
View File
@@ -71,6 +71,7 @@ size_t page_size(void) _pure_;
#define strncaseeq(a, b, n) (strncasecmp((a), (b), (n)) == 0)
bool streq_ptr(const char *a, const char *b) _pure_;
int strcmp_ptr(const char *a, const char *b) _pure_;
#define new(t, n) ((t*) malloc_multiply(sizeof(t), (n)))
+4 -17
View File
@@ -656,28 +656,15 @@ static int member_compare_func(const void *a, const void *b) {
assert(x->type);
assert(y->type);
if (!x->interface && y->interface)
return -1;
if (x->interface && !y->interface)
return 1;
if (x->interface && y->interface) {
d = strcmp(x->interface, y->interface);
if (d != 0)
return d;
}
d = strcmp_ptr(x->interface, y->interface);
if (d != 0)
return d;
d = strcmp(x->type, y->type);
if (d != 0)
return d;
if (!x->name && y->name)
return -1;
if (x->name && !y->name)
return 1;
if (x->name && y->name)
return strcmp(x->name, y->name);
return 0;
return strcmp_ptr(x->name, y->name);
}
static int member_compare_funcp(const void *a, const void *b) {
+13
View File
@@ -2083,6 +2083,18 @@ static void test_tempfn(void) {
free(ret);
}
static void test_strcmp_ptr(void) {
assert_se(strcmp_ptr(NULL, NULL) == 0);
assert_se(strcmp_ptr("", NULL) > 0);
assert_se(strcmp_ptr("foo", NULL) > 0);
assert_se(strcmp_ptr(NULL, "") < 0);
assert_se(strcmp_ptr(NULL, "bar") < 0);
assert_se(strcmp_ptr("foo", "bar") > 0);
assert_se(strcmp_ptr("bar", "baz") < 0);
assert_se(strcmp_ptr("foo", "foo") == 0);
assert_se(strcmp_ptr("", "") == 0);
}
int main(int argc, char *argv[]) {
log_parse_environment();
log_open();
@@ -2169,6 +2181,7 @@ int main(int argc, char *argv[]) {
test_shell_maybe_quote();
test_parse_mode();
test_tempfn();
test_strcmp_ptr();
return 0;
}