+
+config_chain_t *config_ChainDuplicate( const config_chain_t *p_src )
+{
+ config_chain_t *p_dst = NULL;
+ config_chain_t **pp_last = &p_dst;
+
+ for( ; p_src != NULL; p_src = p_src->p_next )
+ {
+ config_chain_t *p = malloc( sizeof(*p) );
+ if( !p )
+ break;
+ p->p_next = NULL;
+ p->psz_name = p_src->psz_name ? strdup( p_src->psz_name ) : NULL;
+ p->psz_value = p_src->psz_value ? strdup( p_src->psz_value ) : NULL;
+
+ *pp_last = p;
+ pp_last = &p->p_next;
+ }
+ return p_dst;
+}
+
+char *config_StringUnescape( char *psz_string )
+{
+ char *psz_src = psz_string;
+ char *psz_dst = psz_string;
+ if( !psz_src )
+ return NULL;
+
+ while( *psz_src )
+ {
+ if( IsEscape( psz_src ) )
+ psz_src++;
+ *psz_dst++ = *psz_src++;
+ }
+ *psz_dst = '\0';
+
+ return psz_string;
+}
+
+char *config_StringEscape( const char *psz_string )
+{
+ char *psz_return;
+ char *psz_dst;
+ int i_escape;
+
+ if( !psz_string )
+ return NULL;
+
+ i_escape = 0;
+ for( const char *p = psz_string; *p; p++ )
+ {
+ if( IsEscapeNeeded( *p ) )
+ i_escape++;
+ }
+
+ psz_return = psz_dst = malloc( strlen( psz_string ) + i_escape + 1 );
+ for( const char *p = psz_string; *p; p++ )
+ {
+ if( IsEscapeNeeded( *p ) )
+ *psz_dst++ = '\\';
+ *psz_dst++ = *p;
+ }
+ *psz_dst = '\0';
+
+ return psz_return;
+}
+
+