lib: Allow parsing a strv from a non-talloc const buf
authorVolker Lendecke <vl@samba.org>
Wed, 2 Aug 2017 15:34:25 +0000 (17:34 +0200)
committerRalph Boehme <slow@samba.org>
Wed, 29 Nov 2017 15:59:16 +0000 (16:59 +0100)
This will allow parsing a tdb record without having to talloc_memdup it

Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Ralph Boehme <slow@samba.org>
lib/util/strv.c
lib/util/strv.h

index 328f561722b8c10f1c0fee45c62f53e3bfb66d1f..83d84d92528bdef7a30855bf304df517fd63450c 100644 (file)
@@ -86,29 +86,37 @@ static bool strv_valid_entry(const char *strv, size_t strv_len,
        return true;
 }
 
-char *strv_next(char *strv, const char *entry)
+const char *strv_len_next(const char *strv, size_t strv_len,
+                         const char *entry)
 {
-       size_t len = talloc_array_length(strv);
        size_t entry_len;
-       char *result;
 
        if (entry == NULL) {
-               if (strv_valid_entry(strv, len, strv, NULL)) {
+               if (strv_valid_entry(strv, strv_len, strv, NULL)) {
                        return strv;
                }
                return NULL;
        }
 
-       if (!strv_valid_entry(strv, len, entry, &entry_len)) {
+       if (!strv_valid_entry(strv, strv_len, entry, &entry_len)) {
                return NULL;
        }
-       result = &strv[entry - strv]; /* avoid const problems with this stmt */
-       result += entry_len + 1;
 
-       if (result >= (strv + len)) {
+       entry += entry_len+1;
+
+       if (entry >= (strv + strv_len)) {
                return NULL;
        }
-       return result;
+       return entry;
+}
+
+char *strv_next(char *strv, const char *entry)
+{
+       size_t len = talloc_array_length(strv);
+       const char *result;
+
+       result = strv_len_next(strv, len, entry);
+       return discard_const_p(char, result);
 }
 
 size_t strv_count(char *strv)
index 398e8ead17182e8bdc8d55c624aaeb0764a6dcb9..89f04023e445d55e2b89d6499f25499058797c54 100644 (file)
@@ -26,6 +26,8 @@ int strv_add(TALLOC_CTX *mem_ctx, char **strv, const char *string);
 int strv_addn(TALLOC_CTX *mem_ctx, char **strv, const char *src, size_t srclen);
 int strv_append(TALLOC_CTX *mem_ctx, char **strv, const char *src);
 char *strv_next(char *strv, const char *entry);
+const char *strv_len_next(const char *strv, size_t strv_len,
+                         const char *entry);
 char *strv_find(char *strv, const char *entry);
 size_t strv_count(char *strv);
 void strv_delete(char **strv, char *entry);