]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/schema_init.c
Fix cursor initialization, scope IDs
[openldap] / servers / slapd / schema_init.c
index 53cdb6a6f2bc9a20c8221cefdfcc662aa12d3b9c..d1e4068a23fcfdec981b9872af0ec0ace50c88ac 100644 (file)
 #define HASH_Update(c,buf,len) lutil_HASHUpdate(c,buf,len)
 #define HASH_Final(d,c)                        lutil_HASHFinal(d,c)
 
 #define HASH_Update(c,buf,len) lutil_HASHUpdate(c,buf,len)
 #define HASH_Final(d,c)                        lutil_HASHFinal(d,c)
 
-/* recycled validatation routines */
-#define berValidate                                            blobValidate
+#define SLAP_NVALUES 1
+
+#ifdef SLAP_NVALUES
+/* TO BE DELETED */
+#define SLAP_MR_DN_FOLD (0)
+
+#define SLAP_MR_ASSOCIATED(mr, with) \
+       ((mr) == (with) || (mr)->smr_associated == (with))
+
+#define xUTF8StringNormalize NULL
+#define xIA5StringNormalize NULL
+#define xtelephoneNumberNormalize NULL
+#define xgeneralizedTimeNormalize NULL
+#define xintegerNormalize NULL
+#define xnumericStringNormalize NULL
+#define xnameUIDNormalize NULL
+#define xdnNormalize NULL
+
+/* (new) normalization routines */
+#define caseExactIA5Normalize                                          IA5StringNormalize
+#define caseIgnoreIA5Normalize                                         IA5StringNormalize
+#define caseExactNormalize                                                     UTF8StringNormalize
+#define caseIgnoreNormalize                                                    UTF8StringNormalize
+
+#define integerFirstComponentNormalize                         NULL
+#define objectIdentifierNormalize                                      NULL
+#define objectIdentifierFirstComponentNormalize                NULL
+
+#define distinguishedNameNormalize     dnNormalize
+#define distinguishedNameMatch         dnMatch
+#define distinguishedNameIndexer       octetStringIndexer
+#define distinguishedNameFilter                octetStringFilter
 
 
-/* unimplemented pretters */
-#define integerPretty                                  NULL
+#define integerOrderingMatch                   integerMatch
+#define integerFirstComponentMatch             NULL
+#define integerIndexer                         octetStringIndexer
+#define integerFilter                          octetStringFilter
 
 
-/* recycled matching routines */
-#define bitStringMatch                                 octetStringMatch
-#define numericStringMatch                             caseIgnoreIA5Match
-#define objectIdentifierMatch                  octetStringMatch
-#define telephoneNumberMatch                   caseIgnoreIA5Match
-#define telephoneNumberSubstringsMatch caseIgnoreIA5SubstringsMatch
 #define generalizedTimeMatch                   caseIgnoreIA5Match
 #define generalizedTimeOrderingMatch   caseIgnoreIA5Match
 #define generalizedTimeMatch                   caseIgnoreIA5Match
 #define generalizedTimeOrderingMatch   caseIgnoreIA5Match
-#define uniqueMemberMatch                              dnMatch
-#define integerFirstComponentMatch             integerMatch
+
+#define uniqueMemberMatch                      dnMatch /* FIXME! */
+
+#define objectIdentifierMatch  octetStringMatch
+#define objectIdentifierIndexer        octetStringIndexer
+#define objectIdentifierFilter octetStringFilter
+
+#define OpenLDAPaciMatch                                               NULL
+
+#define bitStringMatch                 octetStringMatch
+#define bitStringIndexer               octetStringIndexer
+#define bitStringFilter                        octetStringFilter
+
+#define caseIgnoreMatch                octetStringMatch
+#define caseIgnoreOrderingMatch                octetStringOrderingMatch
+#define caseIgnoreIndexer      octetStringIndexer
+#define caseIgnoreFilter       octetStringFilter
+
+#define caseIgnoreSubstringsMatch              octetStringSubstringsMatch
+#define caseIgnoreSubstringsIndexer            octetStringSubstringsIndexer
+#define caseIgnoreSubstringsFilter             octetStringSubstringsFilter
+
+#define caseExactMatch         octetStringMatch
+#define caseExactOrderingMatch         octetStringOrderingMatch
+#define caseExactIndexer       octetStringIndexer
+#define caseExactFilter                octetStringFilter
+
+#define caseExactSubstringsMatch               octetStringSubstringsMatch
+#define caseExactSubstringsIndexer             octetStringSubstringsIndexer
+#define caseExactSubstringsFilter              octetStringSubstringsFilter
+
+#define caseExactIA5Match              octetStringMatch
+#define caseExactIA5Indexer            octetStringIndexer
+#define caseExactIA5Filter             octetStringFilter
+
+#define caseExactIA5SubstringsMatch                    octetStringSubstringsMatch
+#define caseExactIA5SubstringsIndexer          octetStringSubstringsIndexer
+#define caseExactIA5SubstringsFilter           octetStringSubstringsFilter
+
+#define caseIgnoreIA5Match             octetStringMatch
+#define caseIgnoreIA5Indexer   octetStringIndexer
+#define caseIgnoreIA5Filter            octetStringFilter
+
+#define caseIgnoreIA5SubstringsMatch           caseExactIA5SubstringsMatch
+#define caseIgnoreIA5SubstringsIndexer         caseExactIA5SubstringsIndexer
+#define caseIgnoreIA5SubstringsFilter          caseExactIA5SubstringsFilter
+
+#define numericStringMatch             octetStringMatch
+#define numericStringIndexer   octetStringIndexer
+#define numericStringFilter            octetStringFilter
+
+#define numericStringSubstringsMatch           caseExactIA5SubstringsMatch
+#define numericStringSubstringsIndexer         caseExactIA5SubstringsIndexer
+#define numericStringSubstringsFilter          caseExactIA5SubstringsFilter
+
+#define telephoneNumberMatch           octetStringMatch
+#define telephoneNumberIndexer         octetStringIndexer
+#define telephoneNumberFilter          octetStringFilter
+
+#define telephoneNumberSubstringsMatch         caseExactIA5SubstringsMatch
+#define telephoneNumberSubstringsIndexer       caseExactIA5SubstringsIndexer
+#define telephoneNumberSubstringsFilter                caseExactIA5SubstringsFilter
+
+#define booleanIndexer                                 octetStringIndexer
+#define booleanFilter                                  octetStringFilter
+#endif
+
+/* validatation routines */
+#define berValidate                                            blobValidate
 
 /* approx matching rules */
 
 /* approx matching rules */
+#ifdef SLAP_NVALUES
+#define directoryStringApproxMatchOID  NULL
+#define IA5StringApproxMatchOID                        NULL
+#else
 #define directoryStringApproxMatchOID  "1.3.6.1.4.1.4203.666.4.4"
 #define directoryStringApproxMatch     approxMatch
 #define directoryStringApproxIndexer   approxIndexer
 #define directoryStringApproxMatchOID  "1.3.6.1.4.1.4203.666.4.4"
 #define directoryStringApproxMatch     approxMatch
 #define directoryStringApproxIndexer   approxIndexer
 #define IA5StringApproxMatch                   approxMatch
 #define IA5StringApproxIndexer                 approxIndexer
 #define IA5StringApproxFilter                  approxFilter
 #define IA5StringApproxMatch                   approxMatch
 #define IA5StringApproxIndexer                 approxIndexer
 #define IA5StringApproxFilter                  approxFilter
+#endif
 
 
-/* ordering matching rules */
-#define caseIgnoreOrderingMatch                        caseIgnoreMatch
-#define caseExactOrderingMatch                 caseExactMatch
-#define integerOrderingMatch                   integerMatch
+#ifndef SLAP_NVALUES
 
 
-/* unimplemented matching routines */
-#define caseIgnoreListMatch                            NULL
-#define caseIgnoreListSubstringsMatch  NULL
-#define protocolInformationMatch               NULL
+#define xdnNormalize dnNormalize
 
 
-#ifdef SLAPD_ACI_ENABLED
+/* (new) normalization routines */
+#define caseExactNormalize                                                     NULL
+#define caseExactIA5Normalize                                          NULL
+#define caseIgnoreNormalize                                                    NULL
+#define caseIgnoreIA5Normalize                                         NULL
+#define distinguishedNameNormalize                                     NULL
+#define integerNormalize                                                       NULL
+#define integerFirstComponentNormalize                         NULL
+#define numericStringNormalize                                         NULL
+#define objectIdentifierNormalize                                      NULL
+#define objectIdentifierFirstComponentNormalize                NULL
+#define generalizedTimeNormalize                                       NULL
+#define uniqueMemberNormalize                                          NULL
+#define telephoneNumberNormalize                                       NULL
+
+
+/* matching routines */
+#define bitStringMatch                                 octetStringMatch
+#define bitStringIndexer                               octetStringIndexer
+#define bitStringFilter                                        octetStringFilter
+
+#define numericStringMatch                             caseIgnoreIA5Match
+#define numericStringIndexer                   NULL
+#define numericStringFilter                            NULL
+#define numericStringSubstringsIndexer NULL
+#define numericStringSubstringsFilter  NULL
+
+#define objectIdentifierMatch                  octetStringMatch
+#define objectIdentifierIndexer                        caseIgnoreIA5Indexer
+#define objectIdentifierFilter                 caseIgnoreIA5Filter
+
+#define octetStringSubstringsMatch             NULL
 #define OpenLDAPaciMatch                               NULL
 #define OpenLDAPaciMatch                               NULL
-#endif
-#ifdef SLAPD_AUTHPASSWD
-#define authPasswordMatch                              NULL
-#endif
 
 
-/* recycled indexing/filtering routines */
-#define dnIndexer                              caseExactIgnoreIndexer
-#define dnFilter                               caseExactIgnoreFilter
-#define bitStringFilter                        octetStringFilter
-#define bitStringIndexer               octetStringIndexer
+#define generalizedTimeMatch                   caseIgnoreIA5Match
+#define generalizedTimeOrderingMatch   caseIgnoreIA5Match
+
+#define uniqueMemberMatch                              dnMatch
+#define numericStringSubstringsMatch    NULL
+
+#define caseExactIndexer                               caseExactIgnoreIndexer
+#define caseExactFilter                                        caseExactIgnoreFilter
+#define caseExactOrderingMatch                 caseExactMatch
+#define caseExactSubstringsMatch               caseExactIgnoreSubstringsMatch
+#define caseExactSubstringsIndexer             caseExactIgnoreSubstringsIndexer
+#define caseExactSubstringsFilter              caseExactIgnoreSubstringsFilter
+#define caseIgnoreIndexer                              caseExactIgnoreIndexer
+#define caseIgnoreFilter                               caseExactIgnoreFilter
+#define caseIgnoreOrderingMatch                        caseIgnoreMatch
+#define caseIgnoreSubstringsMatch              caseExactIgnoreSubstringsMatch
+#define caseIgnoreSubstringsIndexer            caseExactIgnoreSubstringsIndexer
+#define caseIgnoreSubstringsFilter             caseExactIgnoreSubstringsFilter
+
+#define integerOrderingMatch                   integerMatch
+#define integerFirstComponentMatch             integerMatch
 
 
-#define telephoneNumberIndexer                 caseIgnoreIA5Indexer
-#define telephoneNumberFilter                  caseIgnoreIA5Filter
+#define distinguishedNameMatch                 dnMatch
+#define distinguishedNameIndexer               caseExactIgnoreIndexer
+#define distinguishedNameFilter                        caseExactIgnoreFilter
+
+#define telephoneNumberMatch                   caseIgnoreIA5Match
+#define telephoneNumberSubstringsMatch caseIgnoreIA5SubstringsMatch
+#define telephoneNumberIndexer                         caseIgnoreIA5Indexer
+#define telephoneNumberFilter                          caseIgnoreIA5Filter
 #define telephoneNumberSubstringsIndexer       caseIgnoreIA5SubstringsIndexer
 #define telephoneNumberSubstringsFilter                caseIgnoreIA5SubstringsFilter
 
 #define telephoneNumberSubstringsIndexer       caseIgnoreIA5SubstringsIndexer
 #define telephoneNumberSubstringsFilter                caseIgnoreIA5SubstringsFilter
 
-static MatchingRule *caseExactMatchingRule;
-static MatchingRule *caseExactSubstringsMatchingRule;
-static MatchingRule *integerFirstComponentMatchingRule;
-
-static const struct MatchingRulePtr {
-       const char   *oid;
-       MatchingRule **mr;
-} mr_ptr [] = {
-       /* must match OIDs below */
-       { "2.5.13.5",  &caseExactMatchingRule },
-       { "2.5.13.7",  &caseExactSubstringsMatchingRule },
-       { "2.5.13.29", &integerFirstComponentMatchingRule }
-};
+#define booleanIndexer                                 octetStringIndexer
+#define booleanFilter                                  octetStringFilter
+#endif
 
 
 static char *bvcasechr( struct berval *bv, unsigned char c, ber_len_t *len )
 
 
 static char *bvcasechr( struct berval *bv, unsigned char c, ber_len_t *len )
@@ -148,11 +279,13 @@ octetStringOrderingMatch(
 {
        ber_len_t v_len  = value->bv_len;
        ber_len_t av_len = ((struct berval *) assertedValue)->bv_len;
 {
        ber_len_t v_len  = value->bv_len;
        ber_len_t av_len = ((struct berval *) assertedValue)->bv_len;
+
        int match = memcmp( value->bv_val,
                ((struct berval *) assertedValue)->bv_val,
                (v_len < av_len ? v_len : av_len) );
        int match = memcmp( value->bv_val,
                ((struct berval *) assertedValue)->bv_val,
                (v_len < av_len ? v_len : av_len) );
-       if( match == 0 )
-               match = v_len - av_len;
+
+       if( match == 0 ) match = v_len - av_len;
+
        *matchp = match;
        return LDAP_SUCCESS;
 }
        *matchp = match;
        return LDAP_SUCCESS;
 }
@@ -354,11 +487,21 @@ nameUIDValidate(
        return rc;
 }
 
        return rc;
 }
 
+#ifdef SLAP_NVALUES
 static int
 static int
-nameUIDNormalize(
+uniqueMemberNormalize(
+       slap_mask_t usage,
        Syntax *syntax,
        Syntax *syntax,
+       MatchingRule *mr,
        struct berval *val,
        struct berval *normalized )
        struct berval *val,
        struct berval *normalized )
+#else
+static int
+xnameUIDNormalize(
+       Syntax *syntax,
+       struct berval *val,
+       struct berval *normalized )
+#endif
 {
        struct berval out;
        int rc;
 {
        struct berval out;
        int rc;
@@ -462,9 +605,10 @@ LDAP/X.500 string syntax / matching rules have a few oddities.  This
 comment attempts to detail how slapd(8) treats them.
 
 Summary:
 comment attempts to detail how slapd(8) treats them.
 
 Summary:
-  StringSyntax         X.500   LDAP    Matching
+  StringSyntax         X.500   LDAP    Matching/Comments
   DirectoryString      CHOICE  UTF8    i/e + ignore insignificant spaces
   PrintableString      subset  subset  i/e + ignore insignificant spaces
   DirectoryString      CHOICE  UTF8    i/e + ignore insignificant spaces
   PrintableString      subset  subset  i/e + ignore insignificant spaces
+  PrintableString      subset  subset  i/e + ignore insignificant spaces
   NumericString                subset  subset  ignore all spaces
   IA5String                    ASCII   ASCII   i/e + ignore insignificant spaces
   TeletexString                T.61    T.61    i/e + ignore insignificant spaces
   NumericString                subset  subset  ignore all spaces
   IA5String                    ASCII   ASCII   i/e + ignore insignificant spaces
   TeletexString                T.61    T.61    i/e + ignore insignificant spaces
@@ -481,6 +625,7 @@ Directory String -
   must be non-empty.
 
   In LDAPv3, a directory string is a UTF-8 encoded UCS string.
   must be non-empty.
 
   In LDAPv3, a directory string is a UTF-8 encoded UCS string.
+  A directory string cannot be zero length.
 
   For matching, there are both case ignore and exact rules.  Both
   also require that "insignificant" spaces be ignored.
 
   For matching, there are both case ignore and exact rules.  Both
   also require that "insignificant" spaces be ignored.
@@ -536,7 +681,10 @@ UTF8StringValidate(
        int len;
        unsigned char *u = in->bv_val;
 
        int len;
        unsigned char *u = in->bv_val;
 
-       if( !in->bv_len ) return LDAP_INVALID_SYNTAX;
+       if( in->bv_len == 0 && syntax == slap_schema.si_syn_directoryString ) {
+               /* directory strings cannot be empty */
+               return LDAP_INVALID_SYNTAX;
+       }
 
        for( count = in->bv_len; count > 0; count-=len, u+=len ) {
                /* get the length indicated by the first byte */
 
        for( count = in->bv_len; count > 0; count-=len, u+=len ) {
                /* get the length indicated by the first byte */
@@ -576,13 +724,83 @@ UTF8StringValidate(
                if( LDAP_UTF8_OFFSET( u ) != len ) return LDAP_INVALID_SYNTAX;
        }
 
                if( LDAP_UTF8_OFFSET( u ) != len ) return LDAP_INVALID_SYNTAX;
        }
 
-       if( count != 0 ) return LDAP_INVALID_SYNTAX;
+       if( count != 0 ) {
+               return LDAP_INVALID_SYNTAX;
+       }
 
        return LDAP_SUCCESS;
 }
 
 
        return LDAP_SUCCESS;
 }
 
+#ifdef SLAP_NVALUES
 static int
 UTF8StringNormalize(
 static int
 UTF8StringNormalize(
+       slap_mask_t use,
+       Syntax *syntax,
+       MatchingRule *mr,
+       struct berval *val,
+       struct berval *normalized )
+{
+       struct berval tmp, nvalue;
+       int flags;
+       int i, wasspace;
+
+       if( val->bv_val == NULL ) {
+               /* assume we're dealing with a syntax (e.g., UTF8String)
+                * which allows empty strings
+                */
+               normalized->bv_len = 0;
+               normalized->bv_val = NULL;
+               return LDAP_SUCCESS;
+       }
+
+       flags = SLAP_MR_ASSOCIATED(mr, slap_schema.si_mr_caseExactMatch )
+               ? LDAP_UTF8_NOCASEFOLD : LDAP_UTF8_CASEFOLD;
+       flags |= ( ( use & SLAP_MR_EQUALITY_APPROX ) == SLAP_MR_EQUALITY_APPROX )
+               ? LDAP_UTF8_APPROX : 0;
+
+       val = UTF8bvnormalize( val, &tmp, flags );
+       if( val == NULL ) {
+               return LDAP_OTHER;
+       }
+       
+       /* collapse spaces (in place) */
+       nvalue.bv_len = 0;
+       nvalue.bv_val = tmp.bv_val;
+
+       wasspace=1; /* trim leading spaces */
+       for( i=0; i<tmp.bv_len; i++) {
+               if ( ASCII_SPACE( tmp.bv_val[i] )) {
+                       if( wasspace++ == 0 ) {
+                               /* trim repeated spaces */
+                               nvalue.bv_val[nvalue.bv_len++] = tmp.bv_val[i];
+                       }
+               } else {
+                       wasspace = 0;
+                       nvalue.bv_val[nvalue.bv_len++] = tmp.bv_val[i];
+               }
+       }
+
+       if( nvalue.bv_len ) {
+               if( wasspace ) {
+                       /* last character was a space, trim it */
+                       --nvalue.bv_len;
+               }
+               nvalue.bv_val[nvalue.bv_len] = '\0';
+
+       } else {
+               /* string of all spaces is treated as one space */
+               nvalue.bv_val[0] = ' ';
+               nvalue.bv_val[1] = '\0';
+               nvalue.bv_len = 1;
+       }
+
+       *normalized = nvalue;
+       return LDAP_SUCCESS;
+}
+#else
+
+static int
+xUTF8StringNormalize(
        Syntax *syntax,
        struct berval *val,
        struct berval *normalized )
        Syntax *syntax,
        struct berval *val,
        struct berval *normalized )
@@ -665,7 +883,7 @@ UTF8StringNormalize(
 /* Returns Unicode canonically normalized copy of a substring assertion
  * Skipping attribute description */
 static SubstringsAssertion *
 /* Returns Unicode canonically normalized copy of a substring assertion
  * Skipping attribute description */
 static SubstringsAssertion *
-UTF8SubstringsassertionNormalize(
+UTF8SubstringsAssertionNormalize(
        SubstringsAssertion *sa,
        unsigned casefold )
 {
        SubstringsAssertion *sa,
        unsigned casefold )
 {
@@ -1098,7 +1316,7 @@ caseExactIgnoreSubstringsMatch(
        char *nav = NULL;
        unsigned casefold;
 
        char *nav = NULL;
        unsigned casefold;
 
-       casefold = ( mr != caseExactSubstringsMatchingRule )
+       casefold = ( mr != slap_schema.si_mr_caseExactSubstringsMatch )
                ? LDAP_UTF8_CASEFOLD : LDAP_UTF8_NOCASEFOLD;
 
        if ( UTF8bvnormalize( value, &left, casefold ) == NULL ) {
                ? LDAP_UTF8_CASEFOLD : LDAP_UTF8_NOCASEFOLD;
 
        if ( UTF8bvnormalize( value, &left, casefold ) == NULL ) {
@@ -1107,7 +1325,7 @@ caseExactIgnoreSubstringsMatch(
        }
        nav = left.bv_val;
 
        }
        nav = left.bv_val;
 
-       sub = UTF8SubstringsassertionNormalize( assertedValue, casefold );
+       sub = UTF8SubstringsAssertionNormalize( assertedValue, casefold );
        if( sub == NULL ) {
                match = -1;
                goto done;
        if( sub == NULL ) {
                match = -1;
                goto done;
@@ -1268,7 +1486,7 @@ static int caseExactIgnoreIndexer(
        slen = syntax->ssyn_oidlen;
        mlen = mr->smr_oidlen;
 
        slen = syntax->ssyn_oidlen;
        mlen = mr->smr_oidlen;
 
-       casefold = ( mr != caseExactMatchingRule )
+       casefold = ( mr != slap_schema.si_mr_caseExactMatch )
                ? LDAP_UTF8_CASEFOLD : LDAP_UTF8_NOCASEFOLD;
 
        for( i=0; values[i].bv_val != NULL; i++ ) {
                ? LDAP_UTF8_CASEFOLD : LDAP_UTF8_NOCASEFOLD;
 
        for( i=0; values[i].bv_val != NULL; i++ ) {
@@ -1345,7 +1563,7 @@ static int caseExactIgnoreFilter(
        slen = syntax->ssyn_oidlen;
        mlen = mr->smr_oidlen;
 
        slen = syntax->ssyn_oidlen;
        mlen = mr->smr_oidlen;
 
-       casefold = ( mr != caseExactMatchingRule )
+       casefold = ( mr != slap_schema.si_mr_caseExactMatch )
                ? LDAP_UTF8_CASEFOLD : LDAP_UTF8_NOCASEFOLD;
 
        UTF8bvnormalize( (struct berval *) assertedValue, &value, casefold );
                ? LDAP_UTF8_CASEFOLD : LDAP_UTF8_NOCASEFOLD;
 
        UTF8bvnormalize( (struct berval *) assertedValue, &value, casefold );
@@ -1379,10 +1597,16 @@ static int caseExactIgnoreFilter(
        *keysp = keys;
        return LDAP_SUCCESS;
 }
        *keysp = keys;
        return LDAP_SUCCESS;
 }
+#endif
 
 /* Substrings Index generation function */
 
 /* Substrings Index generation function */
-static int caseExactIgnoreSubstringsIndexer(
-       slap_mask_t use,
+static int
+#ifdef SLAP_NVALUES
+octetStringSubstringsIndexer
+#else
+caseExactIgnoreSubstringsIndexer
+#endif
+       ( slap_mask_t use,
        slap_mask_t flags,
        Syntax *syntax,
        MatchingRule *mr,
        slap_mask_t flags,
        Syntax *syntax,
        MatchingRule *mr,
@@ -1390,11 +1614,13 @@ static int caseExactIgnoreSubstringsIndexer(
        BerVarray values,
        BerVarray *keysp )
 {
        BerVarray values,
        BerVarray *keysp )
 {
-       unsigned casefold, wasspace;
        ber_len_t i, j, nkeys;
        size_t slen, mlen;
        BerVarray keys;
        ber_len_t i, j, nkeys;
        size_t slen, mlen;
        BerVarray keys;
+#ifndef SLAP_NVALUES
        BerVarray tvalues, nvalues;
        BerVarray tvalues, nvalues;
+       unsigned casefold, wasspace;
+#endif
 
        HASH_CONTEXT   HASHcontext;
        unsigned char   HASHdigest[HASH_BYTES];
 
        HASH_CONTEXT   HASHcontext;
        unsigned char   HASHdigest[HASH_BYTES];
@@ -1402,8 +1628,7 @@ static int caseExactIgnoreSubstringsIndexer(
        digest.bv_val = HASHdigest;
        digest.bv_len = sizeof(HASHdigest);
 
        digest.bv_val = HASHdigest;
        digest.bv_len = sizeof(HASHdigest);
 
-       nkeys=0;
-
+#ifndef SLAP_NVALUES
        for( i=0; values[i].bv_val != NULL; i++ ) {
                /* empty - just count them */
        }
        for( i=0; values[i].bv_val != NULL; i++ ) {
                /* empty - just count them */
        }
@@ -1411,7 +1636,7 @@ static int caseExactIgnoreSubstringsIndexer(
        /* we should have at least one value at this point */
        assert( i > 0 );
 
        /* we should have at least one value at this point */
        assert( i > 0 );
 
-       casefold = ( mr != caseExactSubstringsMatchingRule )
+       casefold = ( mr != slap_schema.si_mr_caseExactSubstringsMatch )
                ? LDAP_UTF8_CASEFOLD : LDAP_UTF8_NOCASEFOLD;
 
        tvalues = ch_malloc( sizeof( struct berval ) * (i+1) );
                ? LDAP_UTF8_CASEFOLD : LDAP_UTF8_NOCASEFOLD;
 
        tvalues = ch_malloc( sizeof( struct berval ) * (i+1) );
@@ -1449,6 +1674,9 @@ static int caseExactIgnoreSubstringsIndexer(
        tvalues[i].bv_val = NULL;
        nvalues[i].bv_val = NULL;
        values = nvalues;
        tvalues[i].bv_val = NULL;
        nvalues[i].bv_val = NULL;
        values = nvalues;
+#endif
+
+       nkeys=0;
 
        for( i=0; values[i].bv_val != NULL; i++ ) {
                /* count number of indices to generate */
 
        for( i=0; values[i].bv_val != NULL; i++ ) {
                /* count number of indices to generate */
@@ -1484,8 +1712,10 @@ static int caseExactIgnoreSubstringsIndexer(
        if( nkeys == 0 ) {
                /* no keys to generate */
                *keysp = NULL;
        if( nkeys == 0 ) {
                /* no keys to generate */
                *keysp = NULL;
+#ifndef SLAP_NVALUES
                ber_bvarray_free( tvalues );
                ch_free( nvalues );
                ber_bvarray_free( tvalues );
                ch_free( nvalues );
+#endif
                return LDAP_SUCCESS;
        }
 
                return LDAP_SUCCESS;
        }
 
@@ -1586,14 +1816,21 @@ static int caseExactIgnoreSubstringsIndexer(
                *keysp = NULL;
        }
 
                *keysp = NULL;
        }
 
+#ifndef SLAP_NVALUES
        ber_bvarray_free( tvalues );
        ch_free( nvalues );
        ber_bvarray_free( tvalues );
        ch_free( nvalues );
+#endif
 
        return LDAP_SUCCESS;
 }
 
 
        return LDAP_SUCCESS;
 }
 
-static int caseExactIgnoreSubstringsFilter(
-       slap_mask_t use,
+static int
+#ifdef SLAP_NVALUES
+octetStringSubstringsFilter
+#else
+caseExactIgnoreSubstringsFilter
+#endif
+       ( slap_mask_t use,
        slap_mask_t flags,
        Syntax *syntax,
        MatchingRule *mr,
        slap_mask_t flags,
        Syntax *syntax,
        MatchingRule *mr,
@@ -1612,14 +1849,18 @@ static int caseExactIgnoreSubstringsFilter(
        struct berval *value;
        struct berval digest;
 
        struct berval *value;
        struct berval digest;
 
-       casefold = ( mr != caseExactSubstringsMatchingRule )
+#ifndef SLAP_NVALUES
+       casefold = ( mr != slap_schema.si_mr_caseExactSubstringsMatch )
                ? LDAP_UTF8_CASEFOLD : LDAP_UTF8_NOCASEFOLD;
 
                ? LDAP_UTF8_CASEFOLD : LDAP_UTF8_NOCASEFOLD;
 
-       sa = UTF8SubstringsassertionNormalize( assertedValue, casefold );
+       sa = UTF8SubstringsAssertionNormalize( assertedValue, casefold );
        if( sa == NULL ) {
                *keysp = NULL;
                return LDAP_SUCCESS;
        }
        if( sa == NULL ) {
                *keysp = NULL;
                return LDAP_SUCCESS;
        }
+#else
+       sa = (SubstringsAssertion *) assertedValue;
+#endif
 
        if( flags & SLAP_INDEX_SUBSTR_INITIAL && sa->sa_initial.bv_val != NULL &&
                sa->sa_initial.bv_len >= SLAP_INDEX_SUBSTR_MINLEN )
 
        if( flags & SLAP_INDEX_SUBSTR_INITIAL && sa->sa_initial.bv_val != NULL &&
                sa->sa_initial.bv_len >= SLAP_INDEX_SUBSTR_MINLEN )
@@ -1645,10 +1886,12 @@ static int caseExactIgnoreSubstringsFilter(
        }
 
        if( nkeys == 0 ) {
        }
 
        if( nkeys == 0 ) {
+#ifndef SLAP_NVALUES
                if ( sa->sa_final.bv_val ) free( sa->sa_final.bv_val );
                if ( sa->sa_any ) ber_bvarray_free( sa->sa_any );
                if ( sa->sa_initial.bv_val ) free( sa->sa_initial.bv_val );
                ch_free( sa );
                if ( sa->sa_final.bv_val ) free( sa->sa_final.bv_val );
                if ( sa->sa_any ) ber_bvarray_free( sa->sa_any );
                if ( sa->sa_initial.bv_val ) free( sa->sa_initial.bv_val );
                ch_free( sa );
+#endif
                *keysp = NULL;
                return LDAP_SUCCESS;
        }
                *keysp = NULL;
                return LDAP_SUCCESS;
        }
@@ -1760,13 +2003,17 @@ static int caseExactIgnoreSubstringsFilter(
                ch_free( keys );
                *keysp = NULL;
        }
                ch_free( keys );
                *keysp = NULL;
        }
+
+#ifndef SLAP_NVALUES
        if ( sa->sa_final.bv_val ) free( sa->sa_final.bv_val );
        if ( sa->sa_any ) ber_bvarray_free( sa->sa_any );
        if ( sa->sa_initial.bv_val ) free( sa->sa_initial.bv_val );
        ch_free( sa );
        if ( sa->sa_final.bv_val ) free( sa->sa_final.bv_val );
        if ( sa->sa_any ) ber_bvarray_free( sa->sa_any );
        if ( sa->sa_initial.bv_val ) free( sa->sa_initial.bv_val );
        ch_free( sa );
+#endif
 
        return LDAP_SUCCESS;
 }
 
        return LDAP_SUCCESS;
 }
+#ifndef SLAP_NVALUES
 
 static int
 caseIgnoreMatch(
 
 static int
 caseIgnoreMatch(
@@ -1782,13 +2029,23 @@ caseIgnoreMatch(
                LDAP_UTF8_CASEFOLD );
        return LDAP_SUCCESS;
 }
                LDAP_UTF8_CASEFOLD );
        return LDAP_SUCCESS;
 }
+#endif
        
 /* Remove all spaces and '-' characters */
 static int
        
 /* Remove all spaces and '-' characters */
 static int
+#ifdef SLAP_NVALUES
 telephoneNumberNormalize(
 telephoneNumberNormalize(
+       slap_mask_t usage,
+       Syntax *syntax,
+       MatchingRule *mr,
+       struct berval *val,
+       struct berval *normalized )
+#else
+xtelephoneNumberNormalize(
        Syntax *syntax,
        struct berval *val,
        struct berval *normalized )
        Syntax *syntax,
        struct berval *val,
        struct berval *normalized )
+#endif
 {
        char *p, *q;
 
 {
        char *p, *q;
 
@@ -1871,18 +2128,20 @@ integerMatch(
        /* Skip leading space/sign/zeroes, and get the sign of the *value number */
        v = value->bv_val;
        vlen = value->bv_len;
        /* Skip leading space/sign/zeroes, and get the sign of the *value number */
        v = value->bv_val;
        vlen = value->bv_len;
-       if( mr == integerFirstComponentMatchingRule ) {
+
+#ifndef SLAP_NVALUES
+       if( mr == slap_schema.si_mr_integerFirstComponentMatch ) {
                char *tmp = memchr( v, '$', vlen );
                char *tmp = memchr( v, '$', vlen );
-               if( tmp )
-                       vlen = tmp - v;
-               while( vlen && ASCII_SPACE( v[vlen-1] ))
-                       vlen--;
+               if( tmp ) vlen = tmp - v;
+               while( vlen && ASCII_SPACE( v[vlen-1] )) vlen--;
        }
        }
-       for( ; vlen && ( *v < '1' || '9' < *v ); v++, vlen-- ) /* ANSI 2.2.1 */
-               if( *v == '-' )
-                       vsign = -1;
-       if( vlen == 0 )
-               vsign = 0;
+#endif
+
+       for( ; vlen && ( *v < '1' || '9' < *v ); v++, vlen-- ) { /* ANSI 2.2.1 */
+               if( *v == '-' ) vsign = -1;
+       }
+
+       if( vlen == 0 ) vsign = 0;
 
        /* Do the same with the *assertedValue number */
        asserted = (struct berval *) assertedValue;
 
        /* Do the same with the *assertedValue number */
        asserted = (struct berval *) assertedValue;
@@ -1918,6 +2177,7 @@ integerValidate(
 
        if(( val->bv_val[0] == '+' ) || ( val->bv_val[0] == '-' )) {
                if( val->bv_len < 2 ) return LDAP_INVALID_SYNTAX;
 
        if(( val->bv_val[0] == '+' ) || ( val->bv_val[0] == '-' )) {
                if( val->bv_len < 2 ) return LDAP_INVALID_SYNTAX;
+
        } else if( !ASCII_DIGIT(val->bv_val[0]) ) {
                return LDAP_INVALID_SYNTAX;
        }
        } else if( !ASCII_DIGIT(val->bv_val[0]) ) {
                return LDAP_INVALID_SYNTAX;
        }
@@ -1930,10 +2190,19 @@ integerValidate(
 }
 
 static int
 }
 
 static int
+#ifdef SLAP_NVALUES
 integerNormalize(
 integerNormalize(
+       slap_mask_t use,
+       Syntax *syntax,
+       MatchingRule *mr,
+       struct berval *val,
+       struct berval *normalized )
+#else
+xintegerNormalize(
        Syntax *syntax,
        struct berval *val,
        struct berval *normalized )
        Syntax *syntax,
        struct berval *val,
        struct berval *normalized )
+#endif
 {
        char *p;
        int negative=0;
 {
        char *p;
        int negative=0;
@@ -1969,13 +2238,11 @@ integerNormalize(
        if( len == 0 ) {
                normalized->bv_val = ch_strdup("0");
                normalized->bv_len = 1;
        if( len == 0 ) {
                normalized->bv_val = ch_strdup("0");
                normalized->bv_len = 1;
-       }
-       else {
+
+       else {
                normalized->bv_len = len+negative;
                normalized->bv_val = ch_malloc( normalized->bv_len + 1 );
                normalized->bv_len = len+negative;
                normalized->bv_val = ch_malloc( normalized->bv_len + 1 );
-               if( negative ) {
-                       normalized->bv_val[0] = '-';
-               }
+               if( negative ) normalized->bv_val[0] = '-';
                AC_MEMCPY( normalized->bv_val + negative, p, len );
                normalized->bv_val[len+negative] = '\0';
        }
                AC_MEMCPY( normalized->bv_val + negative, p, len );
                normalized->bv_val[len+negative] = '\0';
        }
@@ -1983,6 +2250,8 @@ integerNormalize(
        return LDAP_SUCCESS;
 }
 
        return LDAP_SUCCESS;
 }
 
+#ifndef SLAP_NVALUES
+
 /* Index generation function */
 static int integerIndexer(
        slap_mask_t use,
 /* Index generation function */
 static int integerIndexer(
        slap_mask_t use,
@@ -2016,7 +2285,7 @@ static int integerIndexer(
 
        for( i=0; values[i].bv_val != NULL; i++ ) {
                struct berval norm;
 
        for( i=0; values[i].bv_val != NULL; i++ ) {
                struct berval norm;
-               integerNormalize( syntax, &values[i], &norm );
+               xintegerNormalize( syntax, &values[i], &norm );
 
                HASH_Init( &HASHcontext );
                if( prefix != NULL && prefix->bv_len > 0 ) {
 
                HASH_Init( &HASHcontext );
                if( prefix != NULL && prefix->bv_len > 0 ) {
@@ -2062,7 +2331,7 @@ static int integerFilter(
        slen = syntax->ssyn_oidlen;
        mlen = mr->smr_oidlen;
 
        slen = syntax->ssyn_oidlen;
        mlen = mr->smr_oidlen;
 
-       integerNormalize( syntax, assertedValue, &norm );
+       xintegerNormalize( syntax, assertedValue, &norm );
 
        keys = ch_malloc( sizeof( struct berval ) * 2 );
 
 
        keys = ch_malloc( sizeof( struct berval ) * 2 );
 
@@ -2087,6 +2356,7 @@ static int integerFilter(
        return LDAP_SUCCESS;
 }
 
        return LDAP_SUCCESS;
 }
 
+#endif
 
 static int
 countryStringValidate(
 
 static int
 countryStringValidate(
@@ -2174,12 +2444,24 @@ IA5StringValidate(
 }
 
 static int
 }
 
 static int
+#ifdef SLAP_NVALUES
 IA5StringNormalize(
 IA5StringNormalize(
+       slap_mask_t use,
+       Syntax *syntax,
+       MatchingRule *mr,
+       struct berval *val,
+       struct berval *normalized )
+#else
+xIA5StringNormalize(
        Syntax *syntax,
        struct berval *val,
        struct berval *normalized )
        Syntax *syntax,
        struct berval *val,
        struct berval *normalized )
+#endif
 {
        char *p, *q;
 {
        char *p, *q;
+#ifdef SLAP_NVALUES
+       int casefold = !SLAP_MR_ASSOCIATED(mr, slap_schema.si_mr_caseExactIA5Match);
+#endif
 
        assert( val->bv_len );
 
 
        assert( val->bv_len );
 
@@ -2201,6 +2483,13 @@ IA5StringNormalize(
                        while ( ASCII_SPACE( *p ) ) {
                                p++;
                        }
                        while ( ASCII_SPACE( *p ) ) {
                                p++;
                        }
+
+#ifdef SLAP_NVALUES
+               } else if ( casefold ) {
+                       /* Most IA5 rules require casefolding */
+                       *q++ = TOLOWER(*p++);
+#endif
+
                } else {
                        *q++ = *p++;
                }
                } else {
                        *q++ = *p++;
                }
@@ -2234,6 +2523,8 @@ IA5StringNormalize(
        return LDAP_SUCCESS;
 }
 
        return LDAP_SUCCESS;
 }
 
+#ifndef SLAP_NVALUES
+
 static int
 caseExactIA5Match(
        int *matchp,
 static int
 caseExactIA5Match(
        int *matchp,
@@ -2256,7 +2547,12 @@ caseExactIA5Match(
 }
 
 static int
 }
 
 static int
-caseExactIA5SubstringsMatch(
+caseExactIA5SubstringsMatch
+#else
+static int
+octetStringSubstringsMatch
+#endif
+(
        int *matchp,
        slap_mask_t flags,
        Syntax *syntax,
        int *matchp,
        slap_mask_t flags,
        Syntax *syntax,
@@ -2289,7 +2585,7 @@ caseExactIA5SubstringsMatch(
                        goto done;
                }
 
                        goto done;
                }
 
-               match = strncmp( sub->sa_initial.bv_val, left.bv_val,
+               match = memcmp( sub->sa_initial.bv_val, left.bv_val,
                        sub->sa_initial.bv_len );
 
                if( match != 0 ) {
                        sub->sa_initial.bv_len );
 
                if( match != 0 ) {
@@ -2307,7 +2603,7 @@ caseExactIA5SubstringsMatch(
                        goto done;
                }
 
                        goto done;
                }
 
-               match = strncmp( sub->sa_final.bv_val,
+               match = memcmp( sub->sa_final.bv_val,
                        &left.bv_val[left.bv_len - sub->sa_final.bv_len],
                        sub->sa_final.bv_len );
 
                        &left.bv_val[left.bv_len - sub->sa_final.bv_len],
                        sub->sa_final.bv_len );
 
@@ -2335,7 +2631,7 @@ retry:
                                continue;
                        }
 
                                continue;
                        }
 
-                       p = strchr( left.bv_val, *sub->sa_any[i].bv_val );
+                       p = memchr( left.bv_val, *sub->sa_any[i].bv_val, left.bv_len );
 
                        if( p == NULL ) {
                                match = 1;
 
                        if( p == NULL ) {
                                match = 1;
@@ -2358,7 +2654,7 @@ retry:
                                goto done;
                        }
 
                                goto done;
                        }
 
-                       match = strncmp( left.bv_val,
+                       match = memcmp( left.bv_val,
                                sub->sa_any[i].bv_val,
                                sub->sa_any[i].bv_len );
 
                                sub->sa_any[i].bv_val,
                                sub->sa_any[i].bv_len );
 
@@ -2379,6 +2675,8 @@ done:
        return LDAP_SUCCESS;
 }
 
        return LDAP_SUCCESS;
 }
 
+#ifndef SLAP_NVALUES
+
 /* Index generation function */
 static int caseExactIA5Indexer(
        slap_mask_t use,
 /* Index generation function */
 static int caseExactIA5Indexer(
        slap_mask_t use,
@@ -2983,11 +3281,13 @@ static int caseIgnoreIA5Indexer(
                        if( rc != LDAP_SUCCESS ) {
                                break;
                        }
                        if( rc != LDAP_SUCCESS ) {
                                break;
                        }
+#ifndef SLAP_NVALUES
                } else if ( mr->smr_syntax->ssyn_normalize ) {
                        rc = (mr->smr_syntax->ssyn_normalize)( syntax, &values[i], &value );
                        if( rc != LDAP_SUCCESS ) {
                                break;
                        }
                } else if ( mr->smr_syntax->ssyn_normalize ) {
                        rc = (mr->smr_syntax->ssyn_normalize)( syntax, &values[i], &value );
                        if( rc != LDAP_SUCCESS ) {
                                break;
                        }
+#endif
                } else {
                        ber_dupbv( &value, &values[i] );
                }
                } else {
                        ber_dupbv( &value, &values[i] );
                }
@@ -3400,6 +3700,8 @@ static int caseIgnoreIA5SubstringsFilter(
        return LDAP_SUCCESS;
 }
        
        return LDAP_SUCCESS;
 }
        
+#endif
+
 static int
 numericStringValidate(
        Syntax *syntax,
 static int
 numericStringValidate(
        Syntax *syntax,
@@ -3419,10 +3721,19 @@ numericStringValidate(
 }
 
 static int
 }
 
 static int
+#ifdef SLAP_NVALUES
 numericStringNormalize(
 numericStringNormalize(
+       slap_mask_t usage,
+       Syntax *syntax,
+       MatchingRule *mr,
+       struct berval *val,
+       struct berval *normalized )
+#else
+xnumericStringNormalize(
        Syntax *syntax,
        struct berval *val,
        struct berval *normalized )
        Syntax *syntax,
        struct berval *val,
        struct berval *normalized )
+#endif
 {
        /* removal all spaces */
        char *p, *q;
 {
        /* removal all spaces */
        char *p, *q;
@@ -3461,6 +3772,7 @@ numericStringNormalize(
        return LDAP_SUCCESS;
 }
 
        return LDAP_SUCCESS;
 }
 
+#ifndef SLAP_NVALUES
 static int
 objectIdentifierFirstComponentMatch(
        int *matchp,
 static int
 objectIdentifierFirstComponentMatch(
        int *matchp,
@@ -3548,6 +3860,8 @@ objectIdentifierFirstComponentMatch(
        return rc;
 }
 
        return rc;
 }
 
+#endif
+
 static int
 integerBitAndMatch(
        int *matchp,
 static int
 integerBitAndMatch(
        int *matchp,
@@ -3604,6 +3918,8 @@ integerBitOrMatch(
        return LDAP_SUCCESS;
 }
 
        return LDAP_SUCCESS;
 }
 
+#ifndef SLAP_NVALUES
+
 #ifdef HAVE_TLS
 #include <openssl/x509.h>
 #include <openssl/err.h>
 #ifdef HAVE_TLS
 #include <openssl/x509.h>
 #include <openssl/err.h>
@@ -3922,7 +4238,7 @@ static int certificateExactIndexer(
 
                asn1_integer2str(xcert->cert_info->serialNumber, &serial);
                X509_free(xcert);
 
                asn1_integer2str(xcert->cert_info->serialNumber, &serial);
                X509_free(xcert);
-               integerNormalize( slap_schema.si_syn_integer,
+               xintegerNormalize( slap_schema.si_syn_integer,
                        &serial, &keys[i] );
                ber_memfree(serial.bv_val);
 #ifdef NEW_LOGGING
                        &serial, &keys[i] );
                ber_memfree(serial.bv_val);
 #ifdef NEW_LOGGING
@@ -3960,7 +4276,7 @@ static int certificateExactFilter(
        if( ret != LDAP_SUCCESS ) return ret;
 
        keys = ch_malloc( sizeof( struct berval ) * 2 );
        if( ret != LDAP_SUCCESS ) return ret;
 
        keys = ch_malloc( sizeof( struct berval ) * 2 );
-       integerNormalize( syntax, &asserted_serial, &keys[0] );
+       xintegerNormalize( syntax, &asserted_serial, &keys[0] );
        keys[1].bv_val = NULL;
        *keysp = keys;
 
        keys[1].bv_val = NULL;
        *keysp = keys;
 
@@ -3968,6 +4284,7 @@ static int certificateExactFilter(
        return LDAP_SUCCESS;
 }
 #endif
        return LDAP_SUCCESS;
 }
 #endif
+#endif
 
 static int
 check_time_syntax (struct berval *val,
 
 static int
 check_time_syntax (struct berval *val,
@@ -4136,7 +4453,7 @@ check_time_syntax (struct berval *val,
 
 #ifdef SUPPORT_OBSOLETE_UTC_SYNTAX
 static int
 
 #ifdef SUPPORT_OBSOLETE_UTC_SYNTAX
 static int
-utcTimeNormalize(
+xutcTimeNormalize(
        Syntax *syntax,
        struct berval *val,
        struct berval *normalized )
        Syntax *syntax,
        struct berval *val,
        struct berval *normalized )
@@ -4185,10 +4502,19 @@ generalizedTimeValidate(
 }
 
 static int
 }
 
 static int
+#ifdef SLAP_NVALUES
 generalizedTimeNormalize(
 generalizedTimeNormalize(
+       slap_mask_t usage,
+       Syntax *syntax,
+       MatchingRule *mr,
+       struct berval *val,
+       struct berval *normalized )
+#else
+xgeneralizedTimeNormalize(
        Syntax *syntax,
        struct berval *val,
        struct berval *normalized )
        Syntax *syntax,
        struct berval *val,
        struct berval *normalized )
+#endif
 {
        int parts[9], rc;
 
 {
        int parts[9], rc;
 
@@ -4331,15 +4657,15 @@ static slap_syntax_defs_rec syntax_defs[] = {
                X_BINARY X_NOT_H_R ")",
                SLAP_SYNTAX_BINARY|SLAP_SYNTAX_BER, berValidate, NULL, NULL},
        {"( 1.3.6.1.4.1.1466.115.121.1.11 DESC 'Country String' )",
                X_BINARY X_NOT_H_R ")",
                SLAP_SYNTAX_BINARY|SLAP_SYNTAX_BER, berValidate, NULL, NULL},
        {"( 1.3.6.1.4.1.1466.115.121.1.11 DESC 'Country String' )",
-               0, countryStringValidate, IA5StringNormalize, NULL},
+               0, countryStringValidate, xIA5StringNormalize, NULL},
        {"( 1.3.6.1.4.1.1466.115.121.1.12 DESC 'Distinguished Name' )",
        {"( 1.3.6.1.4.1.1466.115.121.1.12 DESC 'Distinguished Name' )",
-               0, dnValidate, dnNormalize2, dnPretty2},
+               0, dnValidate, xdnNormalize, dnPretty2},
        {"( 1.3.6.1.4.1.1466.115.121.1.13 DESC 'Data Quality' )",
                0, NULL, NULL, NULL},
        {"( 1.3.6.1.4.1.1466.115.121.1.14 DESC 'Delivery Method' )",
                0, NULL, NULL, NULL},
        {"( 1.3.6.1.4.1.1466.115.121.1.15 DESC 'Directory String' )",
        {"( 1.3.6.1.4.1.1466.115.121.1.13 DESC 'Data Quality' )",
                0, NULL, NULL, NULL},
        {"( 1.3.6.1.4.1.1466.115.121.1.14 DESC 'Delivery Method' )",
                0, NULL, NULL, NULL},
        {"( 1.3.6.1.4.1.1466.115.121.1.15 DESC 'Directory String' )",
-               0, UTF8StringValidate, UTF8StringNormalize, NULL},
+               0, UTF8StringValidate, xUTF8StringNormalize, NULL},
        {"( 1.3.6.1.4.1.1466.115.121.1.16 DESC 'DIT Content Rule Description' )",
                0, NULL, NULL, NULL},
        {"( 1.3.6.1.4.1.1466.115.121.1.17 DESC 'DIT Structure Rule Description' )",
        {"( 1.3.6.1.4.1.1466.115.121.1.16 DESC 'DIT Content Rule Description' )",
                0, NULL, NULL, NULL},
        {"( 1.3.6.1.4.1.1466.115.121.1.17 DESC 'DIT Structure Rule Description' )",
@@ -4351,17 +4677,17 @@ static slap_syntax_defs_rec syntax_defs[] = {
        {"( 1.3.6.1.4.1.1466.115.121.1.21 DESC 'Enhanced Guide' )",
                0, NULL, NULL, NULL},
        {"( 1.3.6.1.4.1.1466.115.121.1.22 DESC 'Facsimile Telephone Number' )",
        {"( 1.3.6.1.4.1.1466.115.121.1.21 DESC 'Enhanced Guide' )",
                0, NULL, NULL, NULL},
        {"( 1.3.6.1.4.1.1466.115.121.1.22 DESC 'Facsimile Telephone Number' )",
-               0, printablesStringValidate, telephoneNumberNormalize, NULL},
+               0, printablesStringValidate, xtelephoneNumberNormalize, NULL},
        {"( 1.3.6.1.4.1.1466.115.121.1.23 DESC 'Fax' " X_NOT_H_R ")",
                SLAP_SYNTAX_BLOB, NULL, NULL, NULL},
        {"( 1.3.6.1.4.1.1466.115.121.1.24 DESC 'Generalized Time' )",
        {"( 1.3.6.1.4.1.1466.115.121.1.23 DESC 'Fax' " X_NOT_H_R ")",
                SLAP_SYNTAX_BLOB, NULL, NULL, NULL},
        {"( 1.3.6.1.4.1.1466.115.121.1.24 DESC 'Generalized Time' )",
-               0, generalizedTimeValidate, generalizedTimeNormalize, NULL},
+               0, generalizedTimeValidate, xgeneralizedTimeNormalize, NULL},
        {"( 1.3.6.1.4.1.1466.115.121.1.25 DESC 'Guide' )",
                0, NULL, NULL, NULL},
        {"( 1.3.6.1.4.1.1466.115.121.1.26 DESC 'IA5 String' )",
        {"( 1.3.6.1.4.1.1466.115.121.1.25 DESC 'Guide' )",
                0, NULL, NULL, NULL},
        {"( 1.3.6.1.4.1.1466.115.121.1.26 DESC 'IA5 String' )",
-               0, IA5StringValidate, IA5StringNormalize, NULL},
+               0, IA5StringValidate, xIA5StringNormalize, NULL},
        {"( 1.3.6.1.4.1.1466.115.121.1.27 DESC 'Integer' )",
        {"( 1.3.6.1.4.1.1466.115.121.1.27 DESC 'Integer' )",
-               0, integerValidate, integerNormalize, NULL},
+               0, integerValidate, xintegerNormalize, NULL},
        {"( 1.3.6.1.4.1.1466.115.121.1.28 DESC 'JPEG' " X_NOT_H_R ")",
                SLAP_SYNTAX_BLOB, blobValidate, NULL, NULL},
        {"( 1.3.6.1.4.1.1466.115.121.1.29 DESC 'Master And Shadow Access Points' )",
        {"( 1.3.6.1.4.1.1466.115.121.1.28 DESC 'JPEG' " X_NOT_H_R ")",
                SLAP_SYNTAX_BLOB, blobValidate, NULL, NULL},
        {"( 1.3.6.1.4.1.1466.115.121.1.29 DESC 'Master And Shadow Access Points' )",
@@ -4375,27 +4701,27 @@ static slap_syntax_defs_rec syntax_defs[] = {
        {"( 1.3.6.1.4.1.1466.115.121.1.33 DESC 'MHS OR Address' )",
                0, NULL, NULL, NULL},
        {"( 1.3.6.1.4.1.1466.115.121.1.34 DESC 'Name And Optional UID' )",
        {"( 1.3.6.1.4.1.1466.115.121.1.33 DESC 'MHS OR Address' )",
                0, NULL, NULL, NULL},
        {"( 1.3.6.1.4.1.1466.115.121.1.34 DESC 'Name And Optional UID' )",
-               0, nameUIDValidate, nameUIDNormalize, NULL},
+               0, nameUIDValidate, xnameUIDNormalize, NULL},
        {"( 1.3.6.1.4.1.1466.115.121.1.35 DESC 'Name Form Description' )",
                0, NULL, NULL, NULL},
        {"( 1.3.6.1.4.1.1466.115.121.1.36 DESC 'Numeric String' )",
        {"( 1.3.6.1.4.1.1466.115.121.1.35 DESC 'Name Form Description' )",
                0, NULL, NULL, NULL},
        {"( 1.3.6.1.4.1.1466.115.121.1.36 DESC 'Numeric String' )",
-               0, numericStringValidate, numericStringNormalize, NULL},
+               0, numericStringValidate, xnumericStringNormalize, NULL},
        {"( 1.3.6.1.4.1.1466.115.121.1.37 DESC 'Object Class Description' )",
                0, NULL, NULL, NULL},
        {"( 1.3.6.1.4.1.1466.115.121.1.38 DESC 'OID' )",
                0, oidValidate, NULL, NULL},
        {"( 1.3.6.1.4.1.1466.115.121.1.39 DESC 'Other Mailbox' )",
        {"( 1.3.6.1.4.1.1466.115.121.1.37 DESC 'Object Class Description' )",
                0, NULL, NULL, NULL},
        {"( 1.3.6.1.4.1.1466.115.121.1.38 DESC 'OID' )",
                0, oidValidate, NULL, NULL},
        {"( 1.3.6.1.4.1.1466.115.121.1.39 DESC 'Other Mailbox' )",
-               0, IA5StringValidate, IA5StringNormalize, NULL},
+               0, IA5StringValidate, xIA5StringNormalize, NULL},
        {"( 1.3.6.1.4.1.1466.115.121.1.40 DESC 'Octet String' )",
                0, blobValidate, NULL, NULL},
        {"( 1.3.6.1.4.1.1466.115.121.1.41 DESC 'Postal Address' )",
        {"( 1.3.6.1.4.1.1466.115.121.1.40 DESC 'Octet String' )",
                0, blobValidate, NULL, NULL},
        {"( 1.3.6.1.4.1.1466.115.121.1.41 DESC 'Postal Address' )",
-               0, UTF8StringValidate, UTF8StringNormalize, NULL},
+               0, UTF8StringValidate, xUTF8StringNormalize, NULL},
        {"( 1.3.6.1.4.1.1466.115.121.1.42 DESC 'Protocol Information' )",
                0, NULL, NULL, NULL},
        {"( 1.3.6.1.4.1.1466.115.121.1.43 DESC 'Presentation Address' )",
                0, NULL, NULL, NULL},
        {"( 1.3.6.1.4.1.1466.115.121.1.44 DESC 'Printable String' )",
        {"( 1.3.6.1.4.1.1466.115.121.1.42 DESC 'Protocol Information' )",
                0, NULL, NULL, NULL},
        {"( 1.3.6.1.4.1.1466.115.121.1.43 DESC 'Presentation Address' )",
                0, NULL, NULL, NULL},
        {"( 1.3.6.1.4.1.1466.115.121.1.44 DESC 'Printable String' )",
-               0, printableStringValidate, IA5StringNormalize, NULL},
+               0, printableStringValidate, xIA5StringNormalize, NULL},
        {"( 1.3.6.1.4.1.1466.115.121.1.45 DESC 'SubtreeSpecification' "
                X_BINARY X_NOT_H_R ")",
                SLAP_SYNTAX_BINARY|SLAP_SYNTAX_BER, NULL, NULL, NULL},
        {"( 1.3.6.1.4.1.1466.115.121.1.45 DESC 'SubtreeSpecification' "
                X_BINARY X_NOT_H_R ")",
                SLAP_SYNTAX_BINARY|SLAP_SYNTAX_BER, NULL, NULL, NULL},
@@ -4403,14 +4729,14 @@ static slap_syntax_defs_rec syntax_defs[] = {
                X_BINARY X_NOT_H_R ")",
                SLAP_SYNTAX_BINARY|SLAP_SYNTAX_BER, berValidate, NULL, NULL},
        {"( 1.3.6.1.4.1.1466.115.121.1.50 DESC 'Telephone Number' )",
                X_BINARY X_NOT_H_R ")",
                SLAP_SYNTAX_BINARY|SLAP_SYNTAX_BER, berValidate, NULL, NULL},
        {"( 1.3.6.1.4.1.1466.115.121.1.50 DESC 'Telephone Number' )",
-               0, printableStringValidate, telephoneNumberNormalize, NULL},
+               0, printableStringValidate, xtelephoneNumberNormalize, NULL},
        {"( 1.3.6.1.4.1.1466.115.121.1.51 DESC 'Teletex Terminal Identifier' )",
                0, NULL, NULL, NULL},
        {"( 1.3.6.1.4.1.1466.115.121.1.52 DESC 'Telex Number' )",
        {"( 1.3.6.1.4.1.1466.115.121.1.51 DESC 'Teletex Terminal Identifier' )",
                0, NULL, NULL, NULL},
        {"( 1.3.6.1.4.1.1466.115.121.1.52 DESC 'Telex Number' )",
-               0, printablesStringValidate, IA5StringNormalize, NULL},
+               0, printablesStringValidate, xIA5StringNormalize, NULL},
 #ifdef SUPPORT_OBSOLETE_UTC_SYNTAX
        {"( 1.3.6.1.4.1.1466.115.121.1.53 DESC 'UTC Time' )",
 #ifdef SUPPORT_OBSOLETE_UTC_SYNTAX
        {"( 1.3.6.1.4.1.1466.115.121.1.53 DESC 'UTC Time' )",
-               0, utcTimeValidate, utcTimeNormalize, NULL},
+               0, utcTimeValidate, xutcTimeNormalize, NULL},
 #endif
        {"( 1.3.6.1.4.1.1466.115.121.1.54 DESC 'LDAP Syntax Description' )",
                0, NULL, NULL, NULL},
 #endif
        {"( 1.3.6.1.4.1.1466.115.121.1.54 DESC 'LDAP Syntax Description' )",
                0, NULL, NULL, NULL},
@@ -4490,7 +4816,6 @@ char *objectIdentifierFirstComponentMatchSyntaxes[] = {
  * Other matching rules in X.520 that we do not use (yet):
  *
  * 2.5.13.9            numericStringOrderingMatch
  * Other matching rules in X.520 that we do not use (yet):
  *
  * 2.5.13.9            numericStringOrderingMatch
- * 2.5.13.19   octetStringSubstringsMatch
  * 2.5.13.25   uTCTimeMatch
  * 2.5.13.26   uTCTimeOrderingMatch
  * 2.5.13.31   directoryStringFirstComponentMatch
  * 2.5.13.25   uTCTimeMatch
  * 2.5.13.26   uTCTimeOrderingMatch
  * 2.5.13.31   directoryStringFirstComponentMatch
@@ -4512,23 +4837,21 @@ static slap_mrule_defs_rec mrule_defs[] = {
         * EQUALITY matching rules must be listed after associated APPROX
         * matching rules.  So, we list all APPROX matching rules first.
         */
         * EQUALITY matching rules must be listed after associated APPROX
         * matching rules.  So, we list all APPROX matching rules first.
         */
+#ifndef SLAP_NVALUES
        {"( " directoryStringApproxMatchOID " NAME 'directoryStringApproxMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )",
                SLAP_MR_HIDE | SLAP_MR_EQUALITY_APPROX | SLAP_MR_EXT, NULL,
        {"( " directoryStringApproxMatchOID " NAME 'directoryStringApproxMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )",
                SLAP_MR_HIDE | SLAP_MR_EQUALITY_APPROX | SLAP_MR_EXT, NULL,
-               NULL, NULL,
-               directoryStringApproxMatch,
-               directoryStringApproxIndexer, 
-               directoryStringApproxFilter,
+               NULL, NULL, directoryStringApproxMatch,
+               directoryStringApproxIndexer, directoryStringApproxFilter,
                NULL},
 
        {"( " IA5StringApproxMatchOID " NAME 'IA5StringApproxMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )",
                SLAP_MR_HIDE | SLAP_MR_EQUALITY_APPROX | SLAP_MR_EXT, NULL,
                NULL},
 
        {"( " IA5StringApproxMatchOID " NAME 'IA5StringApproxMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )",
                SLAP_MR_HIDE | SLAP_MR_EQUALITY_APPROX | SLAP_MR_EXT, NULL,
-               NULL, NULL,
-               IA5StringApproxMatch,
-               IA5StringApproxIndexer, 
-               IA5StringApproxFilter,
+               NULL, NULL, IA5StringApproxMatch,
+               IA5StringApproxIndexer, IA5StringApproxFilter,
                NULL},
                NULL},
+#endif
 
        /*
         * Other matching rules
 
        /*
         * Other matching rules
@@ -4537,122 +4860,119 @@ static slap_mrule_defs_rec mrule_defs[] = {
        {"( 2.5.13.0 NAME 'objectIdentifierMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 )",
                SLAP_MR_EQUALITY | SLAP_MR_EXT, NULL,
        {"( 2.5.13.0 NAME 'objectIdentifierMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 )",
                SLAP_MR_EQUALITY | SLAP_MR_EXT, NULL,
-               NULL, NULL,
-               objectIdentifierMatch, caseIgnoreIA5Indexer, caseIgnoreIA5Filter,
+               NULL,
+               objectIdentifierNormalize, objectIdentifierMatch,
+               objectIdentifierIndexer, objectIdentifierFilter,
                NULL},
 
        {"( 2.5.13.1 NAME 'distinguishedNameMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )",
                SLAP_MR_EQUALITY | SLAP_MR_EXT, NULL,
                NULL},
 
        {"( 2.5.13.1 NAME 'distinguishedNameMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )",
                SLAP_MR_EQUALITY | SLAP_MR_EXT, NULL,
-               NULL, NULL,
-               dnMatch, dnIndexer, dnFilter,
+               NULL,
+               distinguishedNameNormalize, distinguishedNameMatch,
+               distinguishedNameIndexer, distinguishedNameFilter,
                NULL},
 
        {"( 2.5.13.2 NAME 'caseIgnoreMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )",
                SLAP_MR_EQUALITY | SLAP_MR_EXT | SLAP_MR_DN_FOLD,
                        directoryStringSyntaxes,
                NULL},
 
        {"( 2.5.13.2 NAME 'caseIgnoreMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )",
                SLAP_MR_EQUALITY | SLAP_MR_EXT | SLAP_MR_DN_FOLD,
                        directoryStringSyntaxes,
-               NULL, NULL,
-               caseIgnoreMatch, caseExactIgnoreIndexer, caseExactIgnoreFilter,
+               NULL,
+               caseIgnoreNormalize, caseIgnoreMatch,
+               caseIgnoreIndexer, caseIgnoreFilter,
                directoryStringApproxMatchOID },
 
        {"( 2.5.13.3 NAME 'caseIgnoreOrderingMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )",
                SLAP_MR_ORDERING, directoryStringSyntaxes,
                directoryStringApproxMatchOID },
 
        {"( 2.5.13.3 NAME 'caseIgnoreOrderingMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )",
                SLAP_MR_ORDERING, directoryStringSyntaxes,
-               NULL, NULL,
-               caseIgnoreOrderingMatch, NULL, NULL,
-               NULL},
+               NULL, caseIgnoreNormalize, caseIgnoreOrderingMatch,
+               NULL, NULL, NULL},
 
        {"( 2.5.13.4 NAME 'caseIgnoreSubstringsMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )",
                SLAP_MR_SUBSTR, NULL,
                NULL, NULL,
 
        {"( 2.5.13.4 NAME 'caseIgnoreSubstringsMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )",
                SLAP_MR_SUBSTR, NULL,
                NULL, NULL,
-               caseExactIgnoreSubstringsMatch,
-               caseExactIgnoreSubstringsIndexer,
-               caseExactIgnoreSubstringsFilter,
+               caseIgnoreSubstringsMatch,
+               caseIgnoreSubstringsIndexer, caseIgnoreSubstringsFilter,
                NULL},
 
        {"( 2.5.13.5 NAME 'caseExactMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )",
                SLAP_MR_EQUALITY | SLAP_MR_EXT, directoryStringSyntaxes,
                NULL},
 
        {"( 2.5.13.5 NAME 'caseExactMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )",
                SLAP_MR_EQUALITY | SLAP_MR_EXT, directoryStringSyntaxes,
-               NULL, NULL,
-               caseExactMatch, caseExactIgnoreIndexer, caseExactIgnoreFilter,
+               NULL,
+               caseExactNormalize, caseExactMatch,
+               caseExactIndexer, caseExactFilter,
                directoryStringApproxMatchOID },
 
        {"( 2.5.13.6 NAME 'caseExactOrderingMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )",
                SLAP_MR_ORDERING, directoryStringSyntaxes,
                directoryStringApproxMatchOID },
 
        {"( 2.5.13.6 NAME 'caseExactOrderingMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )",
                SLAP_MR_ORDERING, directoryStringSyntaxes,
-               NULL, NULL,
-               caseExactOrderingMatch, NULL, NULL,
-               NULL},
+               NULL, caseExactNormalize, caseExactOrderingMatch,
+               NULL, NULL, NULL},
 
        {"( 2.5.13.7 NAME 'caseExactSubstringsMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )",
                SLAP_MR_SUBSTR, directoryStringSyntaxes,
 
        {"( 2.5.13.7 NAME 'caseExactSubstringsMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )",
                SLAP_MR_SUBSTR, directoryStringSyntaxes,
-               NULL, NULL,
-               caseExactIgnoreSubstringsMatch,
-               caseExactIgnoreSubstringsIndexer,
-               caseExactIgnoreSubstringsFilter,
+               NULL,
+               NULL, caseExactSubstringsMatch,
+               caseExactSubstringsIndexer, caseExactSubstringsFilter,
                NULL},
 
        {"( 2.5.13.8 NAME 'numericStringMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.36 )",
                SLAP_MR_EQUALITY | SLAP_MR_EXT | SLAP_MR_DN_FOLD, NULL,
                NULL},
 
        {"( 2.5.13.8 NAME 'numericStringMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.36 )",
                SLAP_MR_EQUALITY | SLAP_MR_EXT | SLAP_MR_DN_FOLD, NULL,
-               NULL, NULL,
-               caseIgnoreIA5Match,
-               caseIgnoreIA5Indexer,
-               caseIgnoreIA5Filter,
+               NULL,
+               numericStringNormalize, numericStringMatch,
+               numericStringIndexer, numericStringFilter,
                NULL},
 
        {"( 2.5.13.10 NAME 'numericStringSubstringsMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )",
                SLAP_MR_SUBSTR, NULL,
                NULL},
 
        {"( 2.5.13.10 NAME 'numericStringSubstringsMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )",
                SLAP_MR_SUBSTR, NULL,
-               NULL, NULL,
-               caseIgnoreIA5SubstringsMatch,
-               caseIgnoreIA5SubstringsIndexer,
-               caseIgnoreIA5SubstringsFilter,
+               NULL,
+               NULL, numericStringSubstringsMatch,
+               numericStringSubstringsIndexer, numericStringSubstringsFilter,
                NULL},
 
        {"( 2.5.13.11 NAME 'caseIgnoreListMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.41 )",
                SLAP_MR_EQUALITY | SLAP_MR_EXT | SLAP_MR_DN_FOLD, NULL,
                NULL},
 
        {"( 2.5.13.11 NAME 'caseIgnoreListMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.41 )",
                SLAP_MR_EQUALITY | SLAP_MR_EXT | SLAP_MR_DN_FOLD, NULL,
-               NULL, NULL,
-               caseIgnoreListMatch, NULL, NULL,
-               NULL},
+               NULL, NULL, NULL, NULL, NULL, NULL},
 
        {"( 2.5.13.12 NAME 'caseIgnoreListSubstringsMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )",
                SLAP_MR_SUBSTR, NULL,
 
        {"( 2.5.13.12 NAME 'caseIgnoreListSubstringsMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )",
                SLAP_MR_SUBSTR, NULL,
-               NULL, NULL,
-               caseIgnoreListSubstringsMatch, NULL, NULL,
-               NULL},
+               NULL, NULL, NULL, NULL, NULL, NULL},
 
        {"( 2.5.13.13 NAME 'booleanMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 )",
                SLAP_MR_EQUALITY | SLAP_MR_EXT, NULL,
 
        {"( 2.5.13.13 NAME 'booleanMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 )",
                SLAP_MR_EQUALITY | SLAP_MR_EXT, NULL,
-               NULL, NULL,
-               booleanMatch, NULL, NULL,
+               NULL,
+               NULL, booleanMatch,
+               booleanIndexer, booleanFilter,
                NULL},
 
        {"( 2.5.13.14 NAME 'integerMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )",
                SLAP_MR_EQUALITY | SLAP_MR_EXT, NULL,
                NULL},
 
        {"( 2.5.13.14 NAME 'integerMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )",
                SLAP_MR_EQUALITY | SLAP_MR_EXT, NULL,
-               NULL, NULL,
-               integerMatch, integerIndexer, integerFilter,
+               NULL,
+               integerNormalize, integerMatch,
+               integerIndexer, integerFilter,
                NULL},
 
        {"( 2.5.13.15 NAME 'integerOrderingMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )",
                NULL},
 
        {"( 2.5.13.15 NAME 'integerOrderingMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )",
-               SLAP_MR_ORDERING, NULL,
-               NULL, NULL,
-               integerOrderingMatch, NULL, NULL,
+               SLAP_MR_ORDERING, NULL, NULL,
+               integerNormalize, integerOrderingMatch,
+               integerIndexer, integerFilter,
                NULL},
 
        {"( 2.5.13.16 NAME 'bitStringMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.6 )",
                SLAP_MR_EQUALITY | SLAP_MR_EXT, NULL,
                NULL},
 
        {"( 2.5.13.16 NAME 'bitStringMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.6 )",
                SLAP_MR_EQUALITY | SLAP_MR_EXT, NULL,
-               NULL, NULL,
-               bitStringMatch, bitStringIndexer, bitStringFilter,
+               NULL,
+               NULL, bitStringMatch,
+               bitStringIndexer, bitStringFilter,
                NULL},
 
        {"( 2.5.13.17 NAME 'octetStringMatch' "
                NULL},
 
        {"( 2.5.13.17 NAME 'octetStringMatch' "
@@ -4669,22 +4989,26 @@ static slap_mrule_defs_rec mrule_defs[] = {
                octetStringOrderingMatch, NULL, NULL,
                NULL},
 
                octetStringOrderingMatch, NULL, NULL,
                NULL},
 
+       {"( 2.5.13.19 NAME 'octetStringSubstringsMatch' "
+               "SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )",
+               SLAP_MR_SUBSTR, NULL,
+               NULL, NULL,
+               octetStringSubstringsMatch, NULL, NULL,
+               NULL},
+
        {"( 2.5.13.20 NAME 'telephoneNumberMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.50 )",
                SLAP_MR_EQUALITY | SLAP_MR_EXT | SLAP_MR_DN_FOLD, NULL,
        {"( 2.5.13.20 NAME 'telephoneNumberMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.50 )",
                SLAP_MR_EQUALITY | SLAP_MR_EXT | SLAP_MR_DN_FOLD, NULL,
-               NULL, NULL,
-               telephoneNumberMatch,
-               telephoneNumberIndexer,
-               telephoneNumberFilter,
+               NULL,
+               telephoneNumberNormalize, telephoneNumberMatch,
+               telephoneNumberIndexer, telephoneNumberFilter,
                NULL},
 
        {"( 2.5.13.21 NAME 'telephoneNumberSubstringsMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )",
                SLAP_MR_SUBSTR, NULL,
                NULL},
 
        {"( 2.5.13.21 NAME 'telephoneNumberSubstringsMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )",
                SLAP_MR_SUBSTR, NULL,
-               NULL, NULL,
-               telephoneNumberSubstringsMatch,
-               telephoneNumberSubstringsIndexer,
-               telephoneNumberSubstringsFilter,
+               NULL, NULL, telephoneNumberSubstringsMatch,
+               telephoneNumberSubstringsIndexer, telephoneNumberSubstringsFilter,
                NULL},
 
        {"( 2.5.13.22 NAME 'presentationAddressMatch' "
                NULL},
 
        {"( 2.5.13.22 NAME 'presentationAddressMatch' "
@@ -4697,46 +5021,50 @@ static slap_mrule_defs_rec mrule_defs[] = {
        {"( 2.5.13.23 NAME 'uniqueMemberMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.34 )",
                SLAP_MR_EQUALITY | SLAP_MR_EXT, NULL,
        {"( 2.5.13.23 NAME 'uniqueMemberMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.34 )",
                SLAP_MR_EQUALITY | SLAP_MR_EXT, NULL,
+               NULL,
+               uniqueMemberNormalize, uniqueMemberMatch,
                NULL, NULL,
                NULL, NULL,
-               uniqueMemberMatch, NULL, NULL,
                NULL},
 
        {"( 2.5.13.24 NAME 'protocolInformationMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.42 )",
                SLAP_MR_EQUALITY | SLAP_MR_EXT, NULL,
                NULL},
 
        {"( 2.5.13.24 NAME 'protocolInformationMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.42 )",
                SLAP_MR_EQUALITY | SLAP_MR_EXT, NULL,
-               NULL, NULL,
-               protocolInformationMatch, NULL, NULL,
-               NULL},
+               NULL, NULL, NULL, NULL, NULL, NULL},
 
        {"( 2.5.13.27 NAME 'generalizedTimeMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 )",
                SLAP_MR_EQUALITY | SLAP_MR_EXT, NULL,
 
        {"( 2.5.13.27 NAME 'generalizedTimeMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 )",
                SLAP_MR_EQUALITY | SLAP_MR_EXT, NULL,
+               NULL,
+               generalizedTimeNormalize, generalizedTimeMatch,
                NULL, NULL,
                NULL, NULL,
-               generalizedTimeMatch, NULL, NULL,
                NULL},
 
        {"( 2.5.13.28 NAME 'generalizedTimeOrderingMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 )",
                SLAP_MR_ORDERING, NULL,
                NULL},
 
        {"( 2.5.13.28 NAME 'generalizedTimeOrderingMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 )",
                SLAP_MR_ORDERING, NULL,
+               NULL,
+               generalizedTimeNormalize, generalizedTimeOrderingMatch,
                NULL, NULL,
                NULL, NULL,
-               generalizedTimeOrderingMatch, NULL, NULL,
                NULL},
 
        {"( 2.5.13.29 NAME 'integerFirstComponentMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )",
                SLAP_MR_EQUALITY | SLAP_MR_EXT, integerFirstComponentMatchSyntaxes,
                NULL},
 
        {"( 2.5.13.29 NAME 'integerFirstComponentMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )",
                SLAP_MR_EQUALITY | SLAP_MR_EXT, integerFirstComponentMatchSyntaxes,
+               NULL,
+               integerFirstComponentNormalize, integerMatch,
                NULL, NULL,
                NULL, NULL,
-               integerFirstComponentMatch, NULL, NULL,
                NULL},
 
        {"( 2.5.13.30 NAME 'objectIdentifierFirstComponentMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 )",
                SLAP_MR_EQUALITY | SLAP_MR_EXT,
                        objectIdentifierFirstComponentMatchSyntaxes,
                NULL},
 
        {"( 2.5.13.30 NAME 'objectIdentifierFirstComponentMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 )",
                SLAP_MR_EQUALITY | SLAP_MR_EXT,
                        objectIdentifierFirstComponentMatchSyntaxes,
+               NULL,
+               objectIdentifierFirstComponentNormalize, objectIdentifierMatch,
                NULL, NULL,
                NULL, NULL,
-               objectIdentifierFirstComponentMatch, NULL, NULL,
                NULL},
 
                NULL},
 
+#ifndef SLAP_NVALUES
 #ifdef HAVE_TLS
        {"( 2.5.13.34 NAME 'certificateExactMatch' "
                "SYNTAX 1.2.826.0.1.3344810.7.1 )",
 #ifdef HAVE_TLS
        {"( 2.5.13.34 NAME 'certificateExactMatch' "
                "SYNTAX 1.2.826.0.1.3344810.7.1 )",
@@ -4745,38 +5073,39 @@ static slap_mrule_defs_rec mrule_defs[] = {
                certificateExactMatch,
                certificateExactIndexer, certificateExactFilter,
                NULL},
                certificateExactMatch,
                certificateExactIndexer, certificateExactFilter,
                NULL},
+#endif
 #endif
 
        {"( 1.3.6.1.4.1.1466.109.114.1 NAME 'caseExactIA5Match' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )",
                SLAP_MR_EQUALITY | SLAP_MR_EXT, NULL,
 #endif
 
        {"( 1.3.6.1.4.1.1466.109.114.1 NAME 'caseExactIA5Match' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )",
                SLAP_MR_EQUALITY | SLAP_MR_EXT, NULL,
-               NULL, NULL,
-               caseExactIA5Match, caseExactIA5Indexer, caseExactIA5Filter,
+               NULL,
+               caseExactIA5Normalize, caseExactIA5Match,
+               caseExactIA5Indexer, caseExactIA5Filter,
                IA5StringApproxMatchOID },
 
        {"( 1.3.6.1.4.1.1466.109.114.2 NAME 'caseIgnoreIA5Match' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )",
                SLAP_MR_EQUALITY | SLAP_MR_EXT | SLAP_MR_DN_FOLD, NULL,
                IA5StringApproxMatchOID },
 
        {"( 1.3.6.1.4.1.1466.109.114.2 NAME 'caseIgnoreIA5Match' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )",
                SLAP_MR_EQUALITY | SLAP_MR_EXT | SLAP_MR_DN_FOLD, NULL,
-               NULL, NULL,
-               caseIgnoreIA5Match, caseIgnoreIA5Indexer, caseIgnoreIA5Filter,
+               NULL,
+               NULL, caseIgnoreIA5Match,
+               caseIgnoreIA5Indexer, caseIgnoreIA5Filter,
                IA5StringApproxMatchOID },
 
        {"( 1.3.6.1.4.1.1466.109.114.3 NAME 'caseIgnoreIA5SubstringsMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )",
                SLAP_MR_SUBSTR, NULL,
                IA5StringApproxMatchOID },
 
        {"( 1.3.6.1.4.1.1466.109.114.3 NAME 'caseIgnoreIA5SubstringsMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )",
                SLAP_MR_SUBSTR, NULL,
-               NULL, NULL,
-               caseIgnoreIA5SubstringsMatch,
-               caseIgnoreIA5SubstringsIndexer,
-               caseIgnoreIA5SubstringsFilter,
+               NULL,
+               NULL, caseIgnoreIA5SubstringsMatch,
+               caseIgnoreIA5SubstringsIndexer, caseIgnoreIA5SubstringsFilter,
                NULL},
 
        {"( 1.3.6.1.4.1.4203.1.2.1 NAME 'caseExactIA5SubstringsMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )",
                SLAP_MR_SUBSTR, NULL,
                NULL},
 
        {"( 1.3.6.1.4.1.4203.1.2.1 NAME 'caseExactIA5SubstringsMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )",
                SLAP_MR_SUBSTR, NULL,
-               NULL, NULL,
-               caseExactIA5SubstringsMatch,
-               caseExactIA5SubstringsIndexer,
-               caseExactIA5SubstringsFilter,
+               NULL,
+               NULL, caseExactIA5SubstringsMatch,
+               caseExactIA5SubstringsIndexer, caseExactIA5SubstringsFilter,
                NULL},
 
 #ifdef SLAPD_AUTHPASSWD
                NULL},
 
 #ifdef SLAPD_AUTHPASSWD
@@ -4801,15 +5130,15 @@ static slap_mrule_defs_rec mrule_defs[] = {
        {"( 1.2.840.113556.1.4.803 NAME 'integerBitAndMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )",
                SLAP_MR_EXT, NULL,
        {"( 1.2.840.113556.1.4.803 NAME 'integerBitAndMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )",
                SLAP_MR_EXT, NULL,
-               NULL, NULL,
-               integerBitAndMatch, NULL, NULL,
+               NULL,
+               NULL, integerBitAndMatch, NULL, NULL,
                NULL},
 
        {"( 1.2.840.113556.1.4.804 NAME 'integerBitOrMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )",
                SLAP_MR_EXT, NULL,
                NULL},
 
        {"( 1.2.840.113556.1.4.804 NAME 'integerBitOrMatch' "
                "SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )",
                SLAP_MR_EXT, NULL,
-               NULL, NULL,
-               integerBitOrMatch, NULL, NULL,
+               NULL,
+               NULL, integerBitOrMatch, NULL, NULL,
                NULL},
 
        {NULL, SLAP_MR_NONE, NULL,
                NULL},
 
        {NULL, SLAP_MR_NONE, NULL,
@@ -4841,7 +5170,7 @@ slap_schema_init( void )
                        mrule_defs[i].mrd_compat_syntaxes == NULL )
                {
                        fprintf( stderr,
                        mrule_defs[i].mrd_compat_syntaxes == NULL )
                {
                        fprintf( stderr,
-                               "slap_schema_init: Ingoring unusable matching rule %s\n",
+                               "slap_schema_init: Ignoring unusable matching rule %s\n",
                                 mrule_defs[i].mrd_desc );
                        continue;
                }
                                 mrule_defs[i].mrd_desc );
                        continue;
                }
@@ -4856,9 +5185,6 @@ slap_schema_init( void )
                }
        }
 
                }
        }
 
-       for ( i=0; i < (int)(sizeof(mr_ptr)/sizeof(mr_ptr[0])); i++ )
-               *mr_ptr[i].mr = mr_find( mr_ptr[i].oid );
-
        res = slap_schema_load();
        schema_init_done = 1;
        return res;
        res = slap_schema_load();
        schema_init_done = 1;
        return res;
@@ -4871,8 +5197,6 @@ schema_destroy( void )
        oidm_destroy();
        oc_destroy();
        at_destroy();
        oidm_destroy();
        oc_destroy();
        at_destroy();
-       for ( i=0; i < (int)(sizeof(mr_ptr)/sizeof(mr_ptr[0])); i++ )
-               *mr_ptr[i].mr = NULL;
        mr_destroy();
        mru_destroy();
        syn_destroy();
        mr_destroy();
        mru_destroy();
        syn_destroy();