func: char *svn_cstring_join(const apr_array_header_t *strings,const char *separator,apr_pool_t *pool) size_t sep_len = strlen ( separator ) ; svn_stringbuf_appendbytes ( new_str , separator , sep_len ); void svn_stringbuf_appendbytes(svn_stringbuf_t *str,const char *bytes,apr_size_t count) total_len = str -> len + count; svn_stringbuf_ensure ( str , total_len ); void svn_stringbuf_ensure(svn_stringbuf_t *str,apr_size_t minimum_size) membuf_ensure ( & mem , & str -> blocksize , minimum_size , str -> pool ); inline static void membuf_ensure(void **data,apr_size_t *size,apr_size_t minimum_size,apr_pool_t *pool) if ( minimum_size > * size )  apr_size_t new_size = * size ; if ( new_size == 0 )  new_size = minimum_size; while ( new_size < minimum_size )  const apr_size_t prev_size = new_size ; new_size *= 2; if ( prev_size > new_size )  new_size = minimum_size; membuf_create ( data , size , new_size , pool ); inline static void membuf_create(void **data,apr_size_t *size,apr_size_t minimum_size,apr_pool_t *pool) minimum_size = minimum_size + ( 8 - 1 ) & ( ~ ( 8 - 1 ) ); * data = ( ! minimum_size ? ( ( void * ) 0 ) : apr_palloc ( pool , minimum_size ) ); * size = minimum_size; if ( mem && mem != ( str -> data ) )  if ( str -> data )  memcpy ( mem , ( str -> data ) , str -> len + 1 ); str -> data = mem; start_address = ( str -> data + str -> len ); memcpy ( start_address , bytes , count ); str -> len = total_len; str -> data [ str -> len ] = '\0'; 