diff options
author | Jelmer Vernooij <jelmer@samba.org> | 2007-09-24 16:43:16 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 15:07:12 -0500 |
commit | 6b1c7d36f88b0c7cfdf16628d33512d4bacced88 (patch) | |
tree | a15f21185e7654045312978d9001fece25d1b9ed /source4/lib/util/util_str.c | |
parent | f2d64e1c45994e4b519454c071e90e0cd8240c8a (diff) | |
download | samba-6b1c7d36f88b0c7cfdf16628d33512d4bacced88.tar.gz samba-6b1c7d36f88b0c7cfdf16628d33512d4bacced88.tar.bz2 samba-6b1c7d36f88b0c7cfdf16628d33512d4bacced88.zip |
r25307: add string_sub_talloc.
(This used to be commit 96c1a24874289fdeddcac43d23c2d1214b9b6225)
Diffstat (limited to 'source4/lib/util/util_str.c')
-rw-r--r-- | source4/lib/util/util_str.c | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/source4/lib/util/util_str.c b/source4/lib/util/util_str.c index e9f81dbd9b..9ea6403c52 100644 --- a/source4/lib/util/util_str.c +++ b/source4/lib/util/util_str.c @@ -317,6 +317,42 @@ _PUBLIC_ void string_sub(char *s, const char *pattern, const char *insert, size_ } } +/** + * Talloc'ed version of string_sub + */ +_PUBLIC_ char *string_sub_talloc(TALLOC_CTX *mem_ctx, const char *s, + const char *pattern, const char *insert) +{ + const char *p; + char *ret; + size_t len, alloc_len; + + if (insert == NULL || pattern == NULL || !*pattern || s == NULL) + return NULL; + + /* determine length needed */ + len = strlen(s); + + for (p = strstr(s, pattern); p != NULL; + p = strstr(p+strlen(pattern), pattern)) { + len += strlen(insert) - strlen(pattern); + } + + alloc_len = MAX(len, strlen(s))+1; + ret = talloc_array(mem_ctx, char, alloc_len); + if (ret == NULL) + return NULL; + strncpy(ret, s, alloc_len); + string_sub(ret, pattern, insert, alloc_len); + + ret = talloc_realloc(mem_ctx, ret, char, len+1); + if (ret == NULL) + return NULL; + + SMB_ASSERT(ret[len] == '\0'); + + return ret; +} /** Similar to string_sub() but allows for any character to be substituted. |