basic: add replace_env_n function

It's like replace_env, but lets you pass in a substring.
This commit is contained in:
Ray Strode
2017-02-20 23:32:53 -05:00
committed by Zbigniew Jędrzejewski-Szmek
parent 51e76f7cd1
commit 4bed076c5f
2 changed files with 9 additions and 3 deletions
+4 -2
View File
@@ -519,7 +519,7 @@ char **strv_env_clean_with_callback(char **e, void (*invalid_callback)(const cha
return e;
}
char *replace_env(const char *format, char **env, unsigned flags) {
char *replace_env_n(const char *format, size_t n, char **env, unsigned flags) {
enum {
WORD,
CURLY,
@@ -530,10 +530,11 @@ char *replace_env(const char *format, char **env, unsigned flags) {
const char *e, *word = format;
char *k;
_cleanup_free_ char *r = NULL;
size_t i;
assert(format);
for (e = format; *e; e ++) {
for (e = format, i = 0; *e && i < n; e ++, i ++) {
switch (state) {
@@ -614,6 +615,7 @@ char *replace_env(const char *format, char **env, unsigned flags) {
r = k;
word = e--;
i--;
state = WORD;
}
break;
+5 -1
View File
@@ -34,9 +34,13 @@ enum {
REPLACE_ENV_ALLOW_BRACELESS = 2u,
};
char *replace_env(const char *format, char **env, unsigned flags);
char *replace_env_n(const char *format, size_t n, char **env, unsigned flags);
char **replace_env_argv(char **argv, char **env);
static inline char *replace_env(const char *format, char **env, unsigned flags) {
return replace_env_n(format, strlen(format), env, flags);
}
bool strv_env_is_valid(char **e);
#define strv_env_clean(l) strv_env_clean_with_callback(l, NULL, NULL)
char **strv_env_clean_with_callback(char **l, void (*invalid_callback)(const char *p, void *userdata), void *userdata);