chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
shared: introduce _cleanup_set_free_free_
[elogind.git]
/
src
/
shared
/
strv.c
diff --git
a/src/shared/strv.c
b/src/shared/strv.c
index 1b8e27bc1b963aa6ccbe2a34d437880110bb6250..2d556f4a076a664a71ffc70f0bd77d675e531bde 100644
(file)
--- a/
src/shared/strv.c
+++ b/
src/shared/strv.c
@@
-75,25
+75,21
@@
void strv_freep(char ***l) {
char **strv_copy(char **l) {
char **r, **k;
char **strv_copy(char **l) {
char **r, **k;
- k = r = new(char*, strv_length(l)
+
1);
- if (!
k
)
+ k = r = new(char*, strv_length(l)
+
1);
+ if (!
r
)
return NULL;
if (l)
return NULL;
if (l)
- for (; *l; k++, l++)
- if (!(*k = strdup(*l)))
- goto fail;
+ for (; *l; k++, l++) {
+ *k = strdup(*l);
+ if (!*k) {
+ strv_free(r);
+ return NULL;
+ }
+ }
*k = NULL;
return r;
*k = NULL;
return r;
-
-fail:
- for (k--; k >= r; k--)
- free(*k);
-
- free(r);
-
- return NULL;
}
unsigned strv_length(char **l) {
}
unsigned strv_length(char **l) {
@@
-163,13
+159,7
@@
char **strv_new_ap(const char *x, va_list ap) {
return a;
fail:
return a;
fail:
-
- for (; i > 0; i--)
- if (a[i-1])
- free(a[i-1]);
-
- free(a);
-
+ strv_free(a);
return NULL;
}
return NULL;
}
@@
-265,16
+255,21
@@
char **strv_split(const char *s, const char *separator) {
FOREACH_WORD_SEPARATOR(w, l, s, separator, state)
n++;
FOREACH_WORD_SEPARATOR(w, l, s, separator, state)
n++;
- if (!(r = new(char*, n+1)))
+ r = new(char*, n+1);
+ if (!r)
return NULL;
i = 0;
return NULL;
i = 0;
- FOREACH_WORD_SEPARATOR(w, l, s, separator, state)
- if (!(r[i++] = strndup(w, l))) {
+ FOREACH_WORD_SEPARATOR(w, l, s, separator, state) {
+ r[i] = strndup(w, l);
+ if (!r[i]) {
strv_free(r);
return NULL;
}
strv_free(r);
return NULL;
}
+ i++;
+ }
+
r[i] = NULL;
return r;
}
r[i] = NULL;
return r;
}
@@
-292,15
+287,19
@@
char **strv_split_quoted(const char *s) {
FOREACH_WORD_QUOTED(w, l, s, state)
n++;
FOREACH_WORD_QUOTED(w, l, s, state)
n++;
- if (!(r = new(char*, n+1)))
+ r = new(char*, n+1);
+ if (!r)
return NULL;
i = 0;
return NULL;
i = 0;
- FOREACH_WORD_QUOTED(w, l, s, state)
- if (!(r[i++] = cunescape_length(w, l))) {
+ FOREACH_WORD_QUOTED(w, l, s, state) {
+ r[i] = cunescape_length(w, l);
+ if (!r[i]) {
strv_free(r);
return NULL;
}
strv_free(r);
return NULL;
}
+ i++;
+ }
r[i] = NULL;
return r;
r[i] = NULL;
return r;
@@
-323,7
+322,8
@@
char *strv_join(char **l, const char *separator) {
n += strlen(*s);
}
n += strlen(*s);
}
- if (!(r = new(char, n+1)))
+ r = new(char, n+1);
+ if (!r)
return NULL;
e = r;
return NULL;
e = r;
@@
-352,23
+352,48
@@
char **strv_append(char **l, const char *s) {
if (!r)
return NULL;
if (!r)
return NULL;
- for (k = r; *l; k++, l++)
- if (!(*k = strdup(*l)))
+ for (k = r; *l; k++, l++) {
+ *k = strdup(*l);
+ if (!*k)
goto fail;
goto fail;
+ }
- if (!(*(k++) = strdup(s)))
+ k[0] = strdup(s);
+ if (!k[0])
goto fail;
goto fail;
-
*k
= NULL;
+
k[1]
= NULL;
return r;
fail:
return r;
fail:
- for (k--; k >= r; k--)
- free(*k);
+ strv_free(r);
+ return NULL;
+}
- free(r);
+int strv_extend(char ***l, const char *value) {
+ char **c;
+ char *v;
+ unsigned n;
- return NULL;
+ if (!value)
+ return 0;
+
+ v = strdup(value);
+ if (!v)
+ return -ENOMEM;
+
+ n = strv_length(*l);
+ c = realloc(*l, sizeof(char*) * (n + 2));
+ if (!c) {
+ free(v);
+ return -ENOMEM;
+ }
+
+ c[n] = v;
+ c[n+1] = NULL;
+
+ *l = c;
+ return 0;
}
char **strv_uniq(char **l) {
}
char **strv_uniq(char **l) {
@@
-462,7
+487,8
@@
static int env_append(char **r, char ***k, char **a) {
else
free(*j);
else
free(*j);
- if (!(*j = strdup(*a)))
+ *j = strdup(*a);
+ if (!*j)
return -ENOMEM;
}
return -ENOMEM;
}
@@
-484,7
+510,8
@@
char **strv_env_merge(unsigned n_lists, ...) {
}
va_end(ap);
}
va_end(ap);
- if (!(r = new(char*, n+1)))
+ r = new(char*, n+1);
+ if (!r)
return NULL;
k = r;
return NULL;
k = r;
@@
-503,11
+530,7
@@
char **strv_env_merge(unsigned n_lists, ...) {
fail:
va_end(ap);
fail:
va_end(ap);
-
- for (k--; k >= r; k--)
- free(*k);
-
- free(r);
+ strv_free(r);
return NULL;
}
return NULL;
}
@@
-619,7
+642,8
@@
char **strv_env_set(char **x, const char *p) {
/* Overrides the env var setting of p, returns a new copy */
/* Overrides the env var setting of p, returns a new copy */
- if (!(r = new(char*, strv_length(x)+2)))
+ r = new(char*, strv_length(x)+2);
+ if (!r)
return NULL;
k = r;
return NULL;
k = r;
@@
-634,11
+658,7
@@
char **strv_env_set(char **x, const char *p) {
return r;
fail:
return r;
fail:
- for (k--; k >= r; k--)
- free(*k);
-
- free(r);
-
+ strv_free(r);
return NULL;
}
return NULL;
}
@@
-698,7
+718,8
@@
char **strv_parse_nulstr(const char *s, size_t l) {
if (s[l-1] != 0)
c++;
if (s[l-1] != 0)
c++;
- if (!(v = new0(char*, c+1)))
+ v = new0(char*, c+1);
+ if (!v)
return NULL;
p = s;
return NULL;
p = s;
@@
-707,11
+728,14
@@
char **strv_parse_nulstr(const char *s, size_t l) {
e = memchr(p, 0, s + l - p);
e = memchr(p, 0, s + l - p);
- if (!(v[i++] = strndup(p, e ? e - p : s + l - p))) {
+ v[i] = strndup(p, e ? e - p : s + l - p);
+ if (!v[i]) {
strv_free(v);
return NULL;
}
strv_free(v);
return NULL;
}
+ i++;
+
if (!e)
break;
if (!e)
break;