+
+/*
+ * get_next_substring(), rdn_attr_type(), rdn_attr_value(), and
+ * build_new_dn().
+ *
+ * Copyright 1999, Juan C. Gomez, All rights reserved.
+ * This software is not subject to any license of Silicon Graphics
+ * Inc. or Purdue University.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * without restriction or fee of any kind as long as this notice
+ * is preserved.
+ *
+ */
+
+/* get_next_substring:
+ *
+ * Gets next substring in s, using d (or the end of the string '\0') as a
+ * string delimiter, and places it in a duplicated memory space. Leading
+ * spaces are ignored. String s **must** be null-terminated.
+ */
+
+static char *
+get_next_substring( char * s, char d )
+{
+
+ char *str, *r;
+
+ r = str = ch_malloc( strlen(s) + 1 );
+
+ /* Skip leading spaces */
+
+ while ( *s && SPACE(*s) ) {
+
+ s++;
+
+ }/* while ( *s && SPACE(*s) ) */
+
+ /* Copy word */
+
+ while ( *s && (*s != d) ) {
+
+ /* Don't stop when you see trailing spaces may be a multi-word
+ * string, i.e. name=John Doe!
+ */
+
+ *str++ = *s++;
+
+ }/* while ( *s && (*s != d) ) */
+
+ *str = '\0';
+
+ return r;
+
+}/* char * get_word() */
+
+
+/* rdn_attr_type:
+ *
+ * Given a string (i.e. an rdn) of the form:
+ * "attribute_type = attribute_value"
+ * this function returns the type of an attribute, that is the
+ * string "attribute_type" which is placed in newly allocated
+ * memory. The returned string will be null-terminated.
+ */
+
+char * rdn_attr_type( char * s )
+{
+
+ return get_next_substring( s, '=' );
+
+}/* char * rdn_attr_type() */
+
+
+/* rdn_attr_value:
+ *
+ * Given a string (i.e. an rdn) of the form:
+ * "attribute_type = attribute_value"
+ * this function returns "attribute_type" which is placed in newly allocated
+ * memory. The returned string will be null-terminated and may contain
+ * spaces (i.e. "John Doe\0").
+ */
+
+char *
+rdn_attr_value( char * rdn )
+{
+
+ char *str;
+
+ if ( (str = strchr( rdn, '=' )) != NULL ) {
+
+ return get_next_substring(++str, '\0');
+
+ }/* if ( (str = strpbrk( rdn, "=" )) != NULL ) */
+
+ return NULL;
+
+}/* char * rdn_attr_value() */
+
+
+/* build_new_dn:
+ *
+ * Used by ldbm/bdb2_back_modrdn to create the new dn of entries being
+ * renamed.
+ *
+ * new_dn = parent (p_dn) + separator(s) + rdn (newrdn) + null.
+ */
+
+void
+build_new_dn( char ** new_dn, char *e_dn, char * p_dn, char * newrdn )
+{
+
+ if ( p_dn == NULL ) {
+
+ *new_dn = ch_strdup( newrdn );
+ return;
+
+ }
+
+ *new_dn = (char *) ch_malloc( strlen( p_dn ) + strlen( newrdn ) + 3 );
+
+ if ( dn_type( e_dn ) == DN_X500 ) {
+
+ strcpy( *new_dn, newrdn );
+ strcat( *new_dn, "," );
+ strcat( *new_dn, p_dn );
+
+ } else {
+
+ char *s;
+ char sep[2];
+
+ strcpy( *new_dn, newrdn );
+ s = strchr( newrdn, '\0' );
+ s--;
+
+ if ( (*s != '.') && (*s != '@') ) {
+
+ if ( (s = strpbrk( e_dn, ".@" )) != NULL ) {
+
+ sep[0] = *s;
+ sep[1] = '\0';
+ strcat( *new_dn, sep );
+
+ }/* if ( (s = strpbrk( dn, ".@" )) != NULL ) */
+
+ }/* if ( *s != '.' && *s != '@' ) */
+
+ strcat( *new_dn, p_dn );
+
+ }/* if ( dn_type( e_dn ) == DN_X500 ) {}else */
+
+}/* void build_new_dn() */