]> git.sur5r.net Git - openldap/commitdiff
Have the normalize routines process white space in the required way.
authorJulio Sánchez Fernández <jsanchez@openldap.org>
Thu, 17 Jun 1999 16:10:38 +0000 (16:10 +0000)
committerJulio Sánchez Fernández <jsanchez@openldap.org>
Thu, 17 Jun 1999 16:10:38 +0000 (16:10 +0000)
Code untested, but it is not used yet.

servers/slapd/schema.c

index 64640852bd08877943c216b363b91ae60ca68e60..829e4f639674fe5e2897e8430fe90fa822fcba7c 100644 (file)
@@ -663,8 +663,32 @@ case_exact_normalize(
 )
 {
        struct berval *newval;
+       char *p, *q;
 
        newval = ber_bvdup( val );
+       p = q = newval->bv_val;
+       /* Ignore initial whitespace */
+       while ( isspace( *p++ ) )
+               ;
+       while ( *p ) {
+               if ( isspace( *p ) ) {
+                       *q++ = *p++;
+                       /* Ignore the extra whitespace */
+                       while ( isspace(*p++) )
+                               ;
+               } else {
+                       *q++ = *p++;
+               }
+       }
+       /*
+        * If the string ended in space, backup the pointer one
+        * position.  One is enough because the above loop collapsed
+        * all whitespace to a single space.
+        */
+       if ( p != newval->bv_val && isspace( *(p-1) ) ) {
+               *(q-1) = '\0';
+       }
+       newval->bv_len = strlen( newval->bv_val );
        normalized = &newval;
 
        return 0;
@@ -679,19 +703,39 @@ case_exact_compare(
        return strcmp( val1->bv_val, val2->bv_val );
 }
 
-static int
+int
 case_ignore_normalize(
        struct berval *val,
        struct berval **normalized
 )
 {
        struct berval *newval;
-       char *p;
+       char *p, *q;
 
        newval = ber_bvdup( val );
-       for ( p = newval->bv_val; *p; p++ ) {
-               *p = TOUPPER( *p );
+       p = q = newval->bv_val;
+       /* Ignore initial whitespace */
+       while ( isspace( *p++ ) )
+               ;
+       while ( *p ) {
+               if ( isspace( *p ) ) {
+                       *q++ = *p++;
+                       /* Ignore the extra whitespace */
+                       while ( isspace(*p++) )
+                               ;
+               } else {
+                       *q++ = TOUPPER( *p++ );
+               }
+       }
+       /*
+        * If the string ended in space, backup the pointer one
+        * position.  One is enough because the above loop collapsed
+        * all whitespace to a single space.
+        */
+       if ( p != newval->bv_val && isspace( *(p-1) ) ) {
+               *(q-1) = '\0';
        }
+       newval->bv_len = strlen( newval->bv_val );
        normalized = &newval;
 
        return 0;