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_append(TALLOC_CTX
*mem_ctx
, char **strv
, const char *src
)
53 return _strv_append(mem_ctx
, strv
, src
, talloc_array_length(src
));
56 static bool strv_valid_entry(const char *strv
, const char *entry
,
57 size_t *strv_len
, size_t *entry_len
)
61 len
= talloc_array_length(strv
);
65 if (strv
[len
-1] != '\0') {
72 if (entry
>= (strv
+len
)) {
77 *entry_len
= strlen(entry
);
82 char *strv_next(char *strv
, const char *entry
)
84 size_t len
, entry_len
;
88 if (strv_valid_entry(strv
, strv
, &len
, &entry_len
)) {
94 if (!strv_valid_entry(strv
, entry
, &len
, &entry_len
)) {
97 result
= &strv
[entry
- strv
]; /* avoid const problems with this stmt */
98 result
+= entry_len
+ 1;
100 if (result
>= (strv
+ len
)) {
106 size_t strv_count(char *strv
)
111 for (entry
= strv
; entry
!= NULL
; entry
= strv_next(strv
, entry
)) {
118 char *strv_find(char *strv
, const char *entry
)
122 while ((e
= strv_next(strv
, e
)) != NULL
) {
123 if (strcmp(e
, entry
) == 0) {
131 void strv_delete(char **strv
, char *entry
)
133 size_t len
, entry_len
;
139 if (!strv_valid_entry(*strv
, entry
, &len
, &entry_len
)) {
144 memmove(entry
, entry
+entry_len
,
145 len
- entry_len
- (entry
- *strv
));
147 *strv
= talloc_realloc(NULL
, *strv
, char, len
- entry_len
);