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
, const char *entry
,
66 size_t *strv_len
, size_t *entry_len
)
70 len
= talloc_array_length(strv
);
74 if (strv
[len
-1] != '\0') {
81 if (entry
>= (strv
+len
)) {
86 *entry_len
= strlen(entry
);
91 char *strv_next(char *strv
, const char *entry
)
93 size_t len
, entry_len
;
97 if (strv_valid_entry(strv
, strv
, &len
, &entry_len
)) {
103 if (!strv_valid_entry(strv
, entry
, &len
, &entry_len
)) {
106 result
= &strv
[entry
- strv
]; /* avoid const problems with this stmt */
107 result
+= entry_len
+ 1;
109 if (result
>= (strv
+ len
)) {
115 size_t strv_count(char *strv
)
120 for (entry
= strv
; entry
!= NULL
; entry
= strv_next(strv
, entry
)) {
127 char *strv_find(char *strv
, const char *entry
)
131 while ((e
= strv_next(strv
, e
)) != NULL
) {
132 if (strcmp(e
, entry
) == 0) {
140 void strv_delete(char **strv
, char *entry
)
142 size_t len
, entry_len
;
148 if (!strv_valid_entry(*strv
, entry
, &len
, &entry_len
)) {
153 memmove(entry
, entry
+entry_len
,
154 len
- entry_len
- (entry
- *strv
));
156 *strv
= talloc_realloc(NULL
, *strv
, char, len
- entry_len
);
159 char * const *strv_to_env(TALLOC_CTX
*mem_ctx
, char *strv
)
164 size_t count
= strv_count(strv
);
170 data
= talloc_array(mem_ctx
, char *, count
+ 1);
176 for(i
= 0; i
< count
; i
++) {
177 next
= strv_next(strv
, next
);