]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
string-util: add strlen_ptr() helper
authorLennart Poettering <lennart@poettering.net>
Thu, 20 Jul 2017 09:38:15 +0000 (11:38 +0200)
committerLennart Poettering <lennart@poettering.net>
Mon, 31 Jul 2017 16:20:28 +0000 (18:20 +0200)
strlen_ptr() is to strlen() what streq_ptr() is to streq(): i.e. it
handles NULL strings in a smart way.

src/basic/bus-label.h
src/basic/escape.c
src/basic/hexdecoct.c
src/basic/string-util.c
src/basic/string-util.h
src/nss-myhostname/nss-myhostname.c
src/systemctl/systemctl.c
src/test/test-string-util.c

index 62fb2c450cfbe98f5f1876bc2a7cb7a03c33671b..600268b767de6d4a6d4beb48b234e4e8a271ab6e 100644 (file)
 #include <stdlib.h>
 #include <string.h>
 
+#include "string-util.h"
+
 char *bus_label_escape(const char *s);
 char *bus_label_unescape_n(const char *f, size_t l);
 
 static inline char *bus_label_unescape(const char *f) {
-        return bus_label_unescape_n(f, f ? strlen(f) : 0);
+        return bus_label_unescape_n(f, strlen_ptr(f));
 }
index 85e4b5282ed758a914ad0109176f3a6601ee8815..22b8b041568b65bb144ed4e6732cfc14f51d9a37 100644 (file)
@@ -314,7 +314,7 @@ int cunescape_length_with_prefix(const char *s, size_t length, const char *prefi
 
         /* Undoes C style string escaping, and optionally prefixes it. */
 
-        pl = prefix ? strlen(prefix) : 0;
+        pl = strlen_ptr(prefix);
 
         r = new(char, pl+length+1);
         if (!r)
index 2d6e377f0a4062cbdc693d103bfb45a21a3c4b63..766770389c56de65fa07b153f4d908240a7048ea 100644 (file)
@@ -25,6 +25,7 @@
 #include "alloc-util.h"
 #include "hexdecoct.h"
 #include "macro.h"
+#include "string-util.h"
 #include "util.h"
 
 char octchar(int x) {
@@ -569,7 +570,7 @@ static int base64_append_width(char **prefix, int plen,
 
         lines = (len + width - 1) / width;
 
-        slen = sep ? strlen(sep) : 0;
+        slen = strlen_ptr(sep);
         t = realloc(*prefix, plen + 1 + slen + (indent + width + 1) * lines);
         if (!t)
                 return -ENOMEM;
index cd58ef97ef6974226f68415b43a75354d1be6fee..32878658636d7d528541582b1b266910124e117c 100644 (file)
@@ -215,7 +215,7 @@ char *strnappend(const char *s, const char *suffix, size_t b) {
 }
 
 char *strappend(const char *s, const char *suffix) {
-        return strnappend(s, suffix, suffix ? strlen(suffix) : 0);
+        return strnappend(s, suffix, strlen_ptr(suffix));
 }
 
 char *strjoin_real(const char *x, ...) {
@@ -707,7 +707,7 @@ char *strextend(char **x, ...) {
 
         assert(x);
 
-        l = f = *x ? strlen(*x) : 0;
+        l = f = strlen_ptr(*x);
 
         va_start(ap, x);
         for (;;) {
index e8a083653892155a5b8c73c7f2c539b025979b29..34eb952ce956eec4d59920f6deae8c5d5012043d 100644 (file)
@@ -200,3 +200,10 @@ DEFINE_TRIVIAL_CLEANUP_FUNC(char *, string_free_erase);
 #define _cleanup_string_free_erase_ _cleanup_(string_free_erasep)
 
 bool string_is_safe(const char *p) _pure_;
+
+static inline size_t strlen_ptr(const char *s) {
+        if (!s)
+                return 0;
+
+        return strlen(s);
+}
index 0570fde5920aad972bbabe139b677f5a984baebd..869d233d49da8abbf4e8ba15792cf2c9572af29b 100644 (file)
@@ -211,7 +211,7 @@ static enum nss_status fill_in_hostent(
                         c++;
 
         l_canonical = strlen(canonical);
-        l_additional = additional ? strlen(additional) : 0;
+        l_additional = strlen_ptr(additional);
         ms = ALIGN(l_canonical+1)+
                 (additional ? ALIGN(l_additional+1) : 0) +
                 sizeof(char*) +
index 55fce6248000b69c94577119b6f9d83cbaf586a2..36675dc4997efbed0cf5a881b5c2bc7457543e26 100644 (file)
@@ -2010,7 +2010,7 @@ static void output_machines_list(struct machine_info *machine_infos, unsigned n)
 
         for (m = machine_infos; m < machine_infos + n; m++) {
                 namelen = MAX(namelen, strlen(m->name) + (m->is_host ? sizeof(" (host)") - 1 : 0));
-                statelen = MAX(statelen, m->state ? strlen(m->state) : 0);
+                statelen = MAX(statelen, strlen_ptr(m->state));
                 failedlen = MAX(failedlen, DECIMAL_STR_WIDTH(m->n_failed_units));
                 jobslen = MAX(jobslen, DECIMAL_STR_WIDTH(m->n_jobs));
 
index 4b3e924cfb3cd1eb6c25d24f716b8c45e1db3d1e..604701ff7ad5953c88ec18d4d85824ee2bed7960 100644 (file)
@@ -336,6 +336,12 @@ static void test_first_word(void) {
         assert_se(!first_word("Hellooo", "Hello"));
 }
 
+static void test_strlen_ptr(void) {
+        assert_se(strlen_ptr("foo") == 3);
+        assert_se(strlen_ptr("") == 0);
+        assert_se(strlen_ptr(NULL) == 0);
+}
+
 int main(int argc, char *argv[]) {
         test_string_erase();
         test_ascii_strcasecmp_n();
@@ -358,6 +364,7 @@ int main(int argc, char *argv[]) {
         test_in_charset();
         test_split_pair();
         test_first_word();
+        test_strlen_ptr();
 
         return 0;
 }