From: Luca Boccassi Date: Mon, 26 Jun 2023 15:13:49 +0000 (+0100) Subject: serialize: add serialize_bool_elide() helper X-Git-Tag: v255-rc1~899^2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=refs%2Fpull%2F28557%2Fhead;p=thirdparty%2Fsystemd.git serialize: add serialize_bool_elide() helper In many case we serialize into objects that have been zero-initialized. To save some time and resources when there are a lot of booleans, add a helper that serializes only when the boolean is true. --- diff --git a/src/shared/serialize.h b/src/shared/serialize.h index 8fdc6dc304e..8b6e0999f1f 100644 --- a/src/shared/serialize.h +++ b/src/shared/serialize.h @@ -19,6 +19,9 @@ int serialize_strv(FILE *f, const char *key, char **l); static inline int serialize_bool(FILE *f, const char *key, bool b) { return serialize_item(f, key, yes_no(b)); } +static inline int serialize_bool_elide(FILE *f, const char *key, bool b) { + return b ? serialize_item(f, key, yes_no(b)) : 0; +} int deserialize_usec(const char *value, usec_t *timestamp); int deserialize_dual_timestamp(const char *value, dual_timestamp *t); diff --git a/src/test/test-serialize.c b/src/test/test-serialize.c index a297e9515ed..36052b64859 100644 --- a/src/test/test-serialize.c +++ b/src/test/test-serialize.c @@ -22,19 +22,23 @@ TEST(serialize_item) { assert_se(serialize_item(f, "a", NULL) == 0); assert_se(serialize_item(f, "a", "bbb") == 1); assert_se(serialize_item(f, "a", "bbb") == 1); + assert_se(serialize_bool_elide(f, "c", true) == 1); + assert_se(serialize_bool_elide(f, "d", false) == 0); assert_se(serialize_item(f, "a", long_string) == -EINVAL); assert_se(serialize_item(f, long_string, "a") == -EINVAL); assert_se(serialize_item(f, long_string, long_string) == -EINVAL); rewind(f); - _cleanup_free_ char *line1 = NULL, *line2 = NULL, *line3 = NULL; + _cleanup_free_ char *line1 = NULL, *line2 = NULL, *line3 = NULL, *line4 = NULL; assert_se(read_line(f, LONG_LINE_MAX, &line1) > 0); assert_se(streq(line1, "a=bbb")); assert_se(read_line(f, LONG_LINE_MAX, &line2) > 0); assert_se(streq(line2, "a=bbb")); - assert_se(read_line(f, LONG_LINE_MAX, &line3) == 0); - assert_se(streq(line3, "")); + assert_se(read_line(f, LONG_LINE_MAX, &line3) > 0); + assert_se(streq(line3, "c=yes")); + assert_se(read_line(f, LONG_LINE_MAX, &line4) == 0); + assert_se(streq(line4, "")); } TEST(serialize_item_escaped) {