diff options
author | Lennart Poettering <lennart@poettering.net> | 2017-11-09 11:12:47 +0100 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2017-11-13 10:47:15 +0100 |
commit | 7546145e26e4feecf0994d84e888d7da9c47424b (patch) | |
tree | 569506c6a090d0e18cbc55f21511b16f051e4d69 /src/basic | |
parent | 78f3c4bca5e1c454248fb915653bcefa5b59ac49 (diff) | |
download | systemd-7546145e26e4feecf0994d84e888d7da9c47424b.tar.gz |
string-util: add delete_trailing_chars() and skip_leading_chars() helpers
And let's port over a couple of users to the new APIs.
Diffstat (limited to 'src/basic')
-rw-r--r-- | src/basic/string-util.c | 31 | ||||
-rw-r--r-- | src/basic/string-util.h | 12 | ||||
-rw-r--r-- | src/basic/unit-name.c | 9 |
3 files changed, 44 insertions, 8 deletions
diff --git a/src/basic/string-util.c b/src/basic/string-util.c index 6fb4134ae9..be2613ca9e 100644 --- a/src/basic/string-util.c +++ b/src/basic/string-util.c @@ -278,6 +278,9 @@ char *strjoin_real(const char *x, ...) { char *strstrip(char *s) { char *e; + if (!s) + return NULL; + /* Drops trailing whitespace. Modifies the string in * place. Returns pointer to first non-space character */ @@ -295,7 +298,13 @@ char *strstrip(char *s) { char *delete_chars(char *s, const char *bad) { char *f, *t; - /* Drops all whitespace, regardless where in the string */ + /* Drops all specified bad characters, regardless where in the string */ + + if (!s) + return NULL; + + if (!bad) + bad = WHITESPACE; for (f = s, t = s; *f; f++) { if (strchr(bad, *f)) @@ -309,6 +318,26 @@ char *delete_chars(char *s, const char *bad) { return s; } +char *delete_trailing_chars(char *s, const char *bad) { + char *p, *c = s; + + /* Drops all specified bad characters, at the end of the string */ + + if (!s) + return NULL; + + if (!bad) + bad = WHITESPACE; + + for (p = s; *p; p++) + if (!strchr(bad, *p)) + c = p + 1; + + *c = 0; + + return s; +} + char *truncate_nl(char *s) { assert(s); diff --git a/src/basic/string-util.h b/src/basic/string-util.h index 4c94b182c1..d2040ebd12 100644 --- a/src/basic/string-util.h +++ b/src/basic/string-util.h @@ -133,8 +133,20 @@ char *strjoin_real(const char *x, ...) _sentinel_; char *strstrip(char *s); char *delete_chars(char *s, const char *bad); +char *delete_trailing_chars(char *s, const char *bad); char *truncate_nl(char *s); +static inline char *skip_leading_chars(const char *s, const char *bad) { + + if (!s) + return NULL; + + if (!bad) + bad = WHITESPACE; + + return (char*) s + strspn(s, bad); +} + char ascii_tolower(char x); char *ascii_strlower(char *s); char *ascii_strlower_n(char *s, size_t n); diff --git a/src/basic/unit-name.c b/src/basic/unit-name.c index ba9928375e..27ce432197 100644 --- a/src/basic/unit-name.c +++ b/src/basic/unit-name.c @@ -382,19 +382,14 @@ int unit_name_path_escape(const char *f, char **ret) { if (STR_IN_SET(p, "/", "")) s = strdup("-"); else { - char *e; - if (!path_is_safe(p)) return -EINVAL; /* Truncate trailing slashes */ - e = endswith(p, "/"); - if (e) - *e = 0; + delete_trailing_chars(p, "/"); /* Truncate leading slashes */ - if (p[0] == '/') - p++; + p = skip_leading_chars(p, "/"); s = unit_name_escape(p); } |