From: Lennart Poettering Date: Wed, 21 Dec 2022 21:35:51 +0000 (+0100) Subject: string-util: rework empty_to_null() to not change "const" qualifier of input X-Git-Tag: v253-rc1~229^2~1 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=ef2409cbde3;p=thirdparty%2Fsystemd.git string-util: rework empty_to_null() to not change "const" qualifier of input This changes the definition from enpty_to_null() so that we are still typesafe (i.e. only accept strings) but do not drop (or add) any const to the returned string that wasn't also on the input. Inspired by: https://github.com/systemd/systemd/pull/25805/commits/3196e2996f613a2e3568a791c503306b7c58d593 --- diff --git a/src/basic/string-util.h b/src/basic/string-util.h index 46681ced997..a78b7960e36 100644 --- a/src/basic/string-util.h +++ b/src/basic/string-util.h @@ -53,9 +53,13 @@ static inline const char* enable_disable(bool b) { return b ? "enable" : "disable"; } -static inline const char *empty_to_null(const char *p) { - return isempty(p) ? NULL : p; -} +/* This macro's return pointer will have the "const" qualifier set or unset the same way as the input + * pointer. */ +#define empty_to_null(p) \ + ({ \ + const char *_p = (p); \ + (typeof(p)) (isempty(_p) ? NULL : _p); \ + }) static inline const char *empty_to_na(const char *p) { return isempty(p) ? "n/a" : p; @@ -74,6 +78,11 @@ static inline bool empty_or_dash(const char *str) { static inline const char *empty_or_dash_to_null(const char *p) { return empty_or_dash(p) ? NULL : p; } +#define empty_or_dash_to_null(p) \ + ({ \ + const char *_p = (p); \ + (typeof(p)) (empty_or_dash(_p) ? NULL : _p); \ + }) char *first_word(const char *s, const char *word) _pure_;