/* Unix SMB/CIFS implementation. Samba utility functions Copyright (C) Andrew Tridgell 1992-2001 Copyright (C) Simo Sorce 2001-2002 Copyright (C) Martin Pool 2003 Copyright (C) James Peach 2006 Copyright (C) Jeremy Allison 1992-2007 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include "includes.h" /** Similar to string_sub2, but it will accept only allocated strings and may realloc them so pay attention at what you pass on no pointers inside strings, no const may be passed as string. **/ char *realloc_string_sub2(char *string, const char *pattern, const char *insert, bool remove_unsafe_characters, bool allow_trailing_dollar) { char *p, *in; char *s; ssize_t ls,lp,li,ld, i; if (!insert || !pattern || !*pattern || !string || !*string) return NULL; s = string; in = talloc_strdup(talloc_tos(), insert); if (!in) { DEBUG(0, ("realloc_string_sub: out of memory!\n")); return NULL; } ls = (ssize_t)strlen(s); lp = (ssize_t)strlen(pattern); li = (ssize_t)strlen(insert); ld = li - lp; for (i=0;i 0) { int offset = PTR_DIFF(s,string); string = talloc_realloc(NULL, string, char, ls + ld + 1); if (!string) { DEBUG(0, ("realloc_string_sub: " "out of memory!\n")); talloc_free(in); return NULL; } p = string + offset + (p - s); } if (li != lp) { memmove(p+li,p+lp,strlen(p+lp)+1); } memcpy(p, in, li); s = p + li; ls += ld; } talloc_free(in); return string; } char *realloc_string_sub(char *string, const char *pattern, const char *insert) { return realloc_string_sub2(string, pattern, insert, true, false); }