2 * String Vector functions modeled after glibc argv_* functions
4 * Copyright Volker Lendecke <vl@samba.org> 2014
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 3 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
25 static int _strv_append(TALLOC_CTX
*mem_ctx
, char **dst
, const char *src
,
28 size_t dstlen
= talloc_array_length(*dst
);
29 size_t newlen
= dstlen
+ srclen
;
32 if ((newlen
< srclen
) || (newlen
< dstlen
)) {
36 new_dst
= talloc_realloc(mem_ctx
, *dst
, char, newlen
);
37 if (new_dst
== NULL
) {
40 memcpy(&new_dst
[dstlen
], src
, srclen
);
46 int strv_add(TALLOC_CTX
*mem_ctx
, char **strv
, const char *string
)
48 return _strv_append(mem_ctx
, strv
, string
, strlen(string
)+1);
51 int strv_addn(TALLOC_CTX
*mem_ctx
, char **strv
, const char *string
, size_t n
)
57 return _strv_append(mem_ctx
, strv
, t
, n
+1);
60 int strv_append(TALLOC_CTX
*mem_ctx
, char **strv
, const char *src
)
62 return _strv_append(mem_ctx
, strv
, src
, talloc_array_length(src
));
65 static bool strv_valid_entry(const char *strv
, size_t strv_len
,
66 const char *entry
, size_t *entry_len
)
71 if (strv
[strv_len
-1] != '\0') {
78 if (entry
>= (strv
+strv_len
)) {
82 if (entry_len
!= NULL
) {
83 *entry_len
= strlen(entry
);
89 const char *strv_len_next(const char *strv
, size_t strv_len
,
95 if (strv_valid_entry(strv
, strv_len
, strv
, NULL
)) {
101 if (!strv_valid_entry(strv
, strv_len
, entry
, &entry_len
)) {
105 entry
+= entry_len
+1;
107 if (entry
>= (strv
+ strv_len
)) {
113 char *strv_next(char *strv
, const char *entry
)
115 size_t len
= talloc_array_length(strv
);
118 result
= strv_len_next(strv
, len
, entry
);
119 return discard_const_p(char, result
);
122 size_t strv_count(char *strv
)
127 for (entry
= strv
; entry
!= NULL
; entry
= strv_next(strv
, entry
)) {
134 char *strv_find(char *strv
, const char *entry
)
138 while ((e
= strv_next(strv
, e
)) != NULL
) {
139 if (strcmp(e
, entry
) == 0) {
147 void strv_delete(char **strv
, char *entry
)
149 size_t len
= talloc_array_length(*strv
);
156 if (!strv_valid_entry(*strv
, len
, entry
, &entry_len
)) {
161 memmove(entry
, entry
+entry_len
,
162 len
- entry_len
- (entry
- *strv
));
164 *strv
= talloc_realloc(NULL
, *strv
, char, len
- entry_len
);
167 char * const *strv_to_env(TALLOC_CTX
*mem_ctx
, char *strv
)
172 size_t count
= strv_count(strv
);
178 data
= talloc_array(mem_ctx
, char *, count
+ 1);
184 for(i
= 0; i
< count
; i
++) {
185 next
= strv_next(strv
, next
);