2011-05-30 10:16:08 +04:00
/*
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 < http : //www.gnu.org/licenses/>.
*/
# include "includes.h"
void fstring_sub ( char * s , const char * pattern , const char * insert )
{
string_sub ( s , pattern , insert , sizeof ( fstring ) ) ;
}
/**
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 ;
2012-01-27 05:10:44 +04:00
in = talloc_strdup ( talloc_tos ( ) , insert ) ;
2011-05-30 10:16:08 +04:00
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 < li ; i + + ) {
switch ( in [ i ] ) {
case ' $ ' :
/* allow a trailing $
* ( as in machine accounts ) */
if ( allow_trailing_dollar & & ( i = = li - 1 ) ) {
break ;
}
case ' ` ' :
case ' " ' :
case ' \' ' :
case ' ; ' :
case ' % ' :
case ' \r ' :
case ' \n ' :
if ( remove_unsafe_characters ) {
in [ i ] = ' _ ' ;
break ;
}
default :
/* ok */
break ;
}
}
while ( ( p = strstr_m ( s , pattern ) ) ) {
if ( ld > 0 ) {
int offset = PTR_DIFF ( s , string ) ;
2012-01-27 05:10:44 +04:00
string = talloc_realloc ( NULL , string , char , ls + ld + 1 ) ;
2011-05-30 10:16:08 +04:00
if ( ! string ) {
DEBUG ( 0 , ( " realloc_string_sub: "
" out of memory! \n " ) ) ;
2012-01-27 05:10:44 +04:00
talloc_free ( in ) ;
2011-05-30 10:16:08 +04:00
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 ;
}
2012-01-27 05:10:44 +04:00
talloc_free ( in ) ;
2011-05-30 10:16:08 +04:00
return string ;
}
char * realloc_string_sub ( char * string ,
const char * pattern ,
const char * insert )
{
return realloc_string_sub2 ( string , pattern , insert , true , false ) ;
}