- if( nvalues[i].bv_len == 0 ) {
- nvalues[i].bv_val = " ";
- nvalues[i].bv_len = sizeof(" ")-1;
- } else {
- if( wasspace ) --nvalues[i].bv_len;
- nvalues[i].bv_val[nvalues[i].bv_len] = '\0';
- }
- }
-
- 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 */
- if( values[i].bv_len < SLAP_INDEX_SUBSTR_MINLEN ) {
- continue;
- }
-
- if( flags & SLAP_INDEX_SUBSTR_INITIAL ) {
- if( values[i].bv_len >= SLAP_INDEX_SUBSTR_MAXLEN ) {
- nkeys += SLAP_INDEX_SUBSTR_MAXLEN -
- ( SLAP_INDEX_SUBSTR_MINLEN - 1);
- } else {
- nkeys += values[i].bv_len - ( SLAP_INDEX_SUBSTR_MINLEN - 1 );
- }
- }
-
- if( flags & SLAP_INDEX_SUBSTR_ANY ) {
- if( values[i].bv_len >= SLAP_INDEX_SUBSTR_MAXLEN ) {
- nkeys += values[i].bv_len - ( SLAP_INDEX_SUBSTR_MAXLEN - 1 );
- }
- }
-
- if( flags & SLAP_INDEX_SUBSTR_FINAL ) {
- if( values[i].bv_len >= SLAP_INDEX_SUBSTR_MAXLEN ) {
- nkeys += SLAP_INDEX_SUBSTR_MAXLEN -
- ( SLAP_INDEX_SUBSTR_MINLEN - 1);
- } else {
- nkeys += values[i].bv_len - ( SLAP_INDEX_SUBSTR_MINLEN - 1 );
- }
- }
- }
-
- if( nkeys == 0 ) {
- /* no keys to generate */
- *keysp = NULL;
-#ifndef SLAP_NVALUES
- ber_bvarray_free( tvalues );
- ch_free( nvalues );
-#endif
- return LDAP_SUCCESS;
- }
-
- keys = ch_malloc( sizeof( struct berval ) * (nkeys+1) );
-
- slen = syntax->ssyn_oidlen;
- mlen = mr->smr_oidlen;
-
- nkeys=0;
- for( i=0; values[i].bv_val != NULL; i++ ) {
- ber_len_t j,max;
-
- if( values[i].bv_len < SLAP_INDEX_SUBSTR_MINLEN ) continue;
-
- if( ( flags & SLAP_INDEX_SUBSTR_ANY ) &&
- ( values[i].bv_len >= SLAP_INDEX_SUBSTR_MAXLEN ) )
- {
- char pre = SLAP_INDEX_SUBSTR_PREFIX;
- max = values[i].bv_len - ( SLAP_INDEX_SUBSTR_MAXLEN - 1);
-
- for( j=0; j<max; j++ ) {
- HASH_Init( &HASHcontext );
- if( prefix != NULL && prefix->bv_len > 0 ) {
- HASH_Update( &HASHcontext,
- prefix->bv_val, prefix->bv_len );
- }
-
- HASH_Update( &HASHcontext,
- &pre, sizeof( pre ) );
- HASH_Update( &HASHcontext,
- syntax->ssyn_oid, slen );
- HASH_Update( &HASHcontext,
- mr->smr_oid, mlen );
- HASH_Update( &HASHcontext,
- &values[i].bv_val[j],
- SLAP_INDEX_SUBSTR_MAXLEN );
- HASH_Final( HASHdigest, &HASHcontext );
-
- ber_dupbv( &keys[nkeys++], &digest );
- }
- }
-
- max = SLAP_INDEX_SUBSTR_MAXLEN < values[i].bv_len
- ? SLAP_INDEX_SUBSTR_MAXLEN : values[i].bv_len;
-
- for( j=SLAP_INDEX_SUBSTR_MINLEN; j<=max; j++ ) {
- char pre;
-
- if( flags & SLAP_INDEX_SUBSTR_INITIAL ) {
- pre = SLAP_INDEX_SUBSTR_INITIAL_PREFIX;
- HASH_Init( &HASHcontext );
- if( prefix != NULL && prefix->bv_len > 0 ) {
- HASH_Update( &HASHcontext,
- prefix->bv_val, prefix->bv_len );
- }
- HASH_Update( &HASHcontext,
- &pre, sizeof( pre ) );
- HASH_Update( &HASHcontext,
- syntax->ssyn_oid, slen );
- HASH_Update( &HASHcontext,
- mr->smr_oid, mlen );
- HASH_Update( &HASHcontext,
- values[i].bv_val, j );
- HASH_Final( HASHdigest, &HASHcontext );
-
- ber_dupbv( &keys[nkeys++], &digest );
- }
-
- if( flags & SLAP_INDEX_SUBSTR_FINAL ) {
- pre = SLAP_INDEX_SUBSTR_FINAL_PREFIX;
- HASH_Init( &HASHcontext );
- if( prefix != NULL && prefix->bv_len > 0 ) {
- HASH_Update( &HASHcontext,
- prefix->bv_val, prefix->bv_len );
- }
- HASH_Update( &HASHcontext,
- &pre, sizeof( pre ) );
- HASH_Update( &HASHcontext,
- syntax->ssyn_oid, slen );
- HASH_Update( &HASHcontext,
- mr->smr_oid, mlen );
- HASH_Update( &HASHcontext,
- &values[i].bv_val[values[i].bv_len-j], j );
- HASH_Final( HASHdigest, &HASHcontext );
-
- ber_dupbv( &keys[nkeys++], &digest );
- }
-
- }
-
- }
-
- if( nkeys > 0 ) {
- keys[nkeys].bv_val = NULL;
- *keysp = keys;
- } else {
- ch_free( keys );
- *keysp = NULL;
- }
-
-#ifndef SLAP_NVALUES
- ber_bvarray_free( tvalues );
- ch_free( nvalues );
-#endif
-
- return LDAP_SUCCESS;
-}
-
-static int
-#ifdef SLAP_NVALUES
-octetStringSubstringsFilter
-#else
-caseExactIgnoreSubstringsFilter
-#endif
- ( slap_mask_t use,
- slap_mask_t flags,
- Syntax *syntax,
- MatchingRule *mr,
- struct berval *prefix,
- void * assertedValue,
- BerVarray *keysp )
-{
- SubstringsAssertion *sa;
- char pre;
- unsigned casefold;
- ber_len_t nkeys = 0;
- size_t slen, mlen, klen;
- BerVarray keys;
- HASH_CONTEXT HASHcontext;
- unsigned char HASHdigest[HASH_BYTES];
- struct berval *value;
- struct berval digest;
-
-#ifndef SLAP_NVALUES
- casefold = ( mr != slap_schema.si_mr_caseExactSubstringsMatch )
- ? LDAP_UTF8_CASEFOLD : LDAP_UTF8_NOCASEFOLD;
-
- sa = UTF8SubstringsAssertionNormalize( assertedValue, casefold );
- 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 )
- {
- nkeys++;
- }
-
- if( flags & SLAP_INDEX_SUBSTR_ANY && sa->sa_any != NULL ) {
- ber_len_t i;
- for( i=0; sa->sa_any[i].bv_val != NULL; i++ ) {
- if( sa->sa_any[i].bv_len >= SLAP_INDEX_SUBSTR_MAXLEN ) {
- /* don't bother accounting for stepping */
- nkeys += sa->sa_any[i].bv_len -
- ( SLAP_INDEX_SUBSTR_MAXLEN - 1 );
- }
- }
- }
-
- if( flags & SLAP_INDEX_SUBSTR_FINAL && sa->sa_final.bv_val != NULL &&
- sa->sa_final.bv_len >= SLAP_INDEX_SUBSTR_MINLEN )
- {
- nkeys++;
- }
-
- 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 );
-#endif
- *keysp = NULL;
- return LDAP_SUCCESS;
- }
-
- digest.bv_val = HASHdigest;
- digest.bv_len = sizeof(HASHdigest);
-
- slen = syntax->ssyn_oidlen;
- mlen = mr->smr_oidlen;
-
- keys = ch_malloc( sizeof( struct berval ) * (nkeys+1) );
- nkeys = 0;
-
- if( flags & SLAP_INDEX_SUBSTR_INITIAL && sa->sa_initial.bv_val != NULL &&
- sa->sa_initial.bv_len >= SLAP_INDEX_SUBSTR_MINLEN )
- {
- pre = SLAP_INDEX_SUBSTR_INITIAL_PREFIX;
- value = &sa->sa_initial;
-
- klen = SLAP_INDEX_SUBSTR_MAXLEN < value->bv_len
- ? SLAP_INDEX_SUBSTR_MAXLEN : value->bv_len;
-
- HASH_Init( &HASHcontext );
- if( prefix != NULL && prefix->bv_len > 0 ) {
- HASH_Update( &HASHcontext,
- prefix->bv_val, prefix->bv_len );
- }
- HASH_Update( &HASHcontext,
- &pre, sizeof( pre ) );
- HASH_Update( &HASHcontext,
- syntax->ssyn_oid, slen );
- HASH_Update( &HASHcontext,
- mr->smr_oid, mlen );
- HASH_Update( &HASHcontext,
- value->bv_val, klen );
- HASH_Final( HASHdigest, &HASHcontext );
-
- ber_dupbv( &keys[nkeys++], &digest );
- }
-
- if( flags & SLAP_INDEX_SUBSTR_ANY && sa->sa_any != NULL ) {
- ber_len_t i, j;
- pre = SLAP_INDEX_SUBSTR_PREFIX;
- klen = SLAP_INDEX_SUBSTR_MAXLEN;
-
- for( i=0; sa->sa_any[i].bv_val != NULL; i++ ) {
- if( sa->sa_any[i].bv_len < SLAP_INDEX_SUBSTR_MAXLEN ) {
- continue;
- }
-
- value = &sa->sa_any[i];
-
- for(j=0;
- j <= value->bv_len - SLAP_INDEX_SUBSTR_MAXLEN;
- j += SLAP_INDEX_SUBSTR_STEP )
- {
- HASH_Init( &HASHcontext );
- if( prefix != NULL && prefix->bv_len > 0 ) {
- HASH_Update( &HASHcontext,
- prefix->bv_val, prefix->bv_len );
- }
- HASH_Update( &HASHcontext,
- &pre, sizeof( pre ) );
- HASH_Update( &HASHcontext,
- syntax->ssyn_oid, slen );
- HASH_Update( &HASHcontext,
- mr->smr_oid, mlen );
- HASH_Update( &HASHcontext,
- &value->bv_val[j], klen );
- HASH_Final( HASHdigest, &HASHcontext );
-
- ber_dupbv( &keys[nkeys++], &digest );
- }
-
- }
- }
-
- if( flags & SLAP_INDEX_SUBSTR_FINAL && sa->sa_final.bv_val != NULL &&
- sa->sa_final.bv_len >= SLAP_INDEX_SUBSTR_MINLEN )
- {
- pre = SLAP_INDEX_SUBSTR_FINAL_PREFIX;
- value = &sa->sa_final;
-
- klen = SLAP_INDEX_SUBSTR_MAXLEN < value->bv_len
- ? SLAP_INDEX_SUBSTR_MAXLEN : value->bv_len;
-
- HASH_Init( &HASHcontext );
- if( prefix != NULL && prefix->bv_len > 0 ) {
- HASH_Update( &HASHcontext,
- prefix->bv_val, prefix->bv_len );
- }
- HASH_Update( &HASHcontext,
- &pre, sizeof( pre ) );
- HASH_Update( &HASHcontext,
- syntax->ssyn_oid, slen );
- HASH_Update( &HASHcontext,
- mr->smr_oid, mlen );
- HASH_Update( &HASHcontext,
- &value->bv_val[value->bv_len-klen], klen );
- HASH_Final( HASHdigest, &HASHcontext );
-
- ber_dupbv( &keys[nkeys++], &digest );
- }
-
- if( nkeys > 0 ) {
- keys[nkeys].bv_val = NULL;
- *keysp = keys;
- } else {
- 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 );
-#endif
-
- return LDAP_SUCCESS;
-}
-#ifndef SLAP_NVALUES
-
-static int
-caseIgnoreMatch(
- int *matchp,
- slap_mask_t flags,
- Syntax *syntax,
- MatchingRule *mr,
- struct berval *value,
- void *assertedValue )
-{
- *matchp = UTF8bvnormcmp( value,
- (struct berval *) assertedValue,
- LDAP_UTF8_CASEFOLD );
- return LDAP_SUCCESS;
-}
-#endif
-
-/* Remove all spaces and '-' characters */
-static int
-#ifdef SLAP_NVALUES
-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 )
-#endif
-{
- char *p, *q;
-
- /* validator should have refused an empty string */
- assert( val->bv_len );
-
- q = normalized->bv_val = ch_malloc( val->bv_len + 1 );
-
- for( p = val->bv_val; *p; p++ ) {
- if ( ! ( ASCII_SPACE( *p ) || *p == '-' )) {
- *q++ = *p;
- }
- }
- *q = '\0';
-
- normalized->bv_len = q - normalized->bv_val;
-
- if( normalized->bv_len == 0 ) {
- free( normalized->bv_val );
- return LDAP_INVALID_SYNTAX;
- }
-
- return LDAP_SUCCESS;
-}
-
-static int
-oidValidate(
- Syntax *syntax,
- struct berval *val )
-{
- ber_len_t i;
-
- if( val->bv_len == 0 ) {
- /* disallow empty strings */
- return LDAP_INVALID_SYNTAX;
- }
-
- if( OID_LEADCHAR(val->bv_val[0]) ) {
- int dot = 0;
- for(i=1; i < val->bv_len; i++) {
- if( OID_SEPARATOR( val->bv_val[i] ) ) {
- if( dot++ ) return 1;
- } else if ( OID_CHAR( val->bv_val[i] ) ) {
- dot = 0;
- } else {
- return LDAP_INVALID_SYNTAX;
- }
- }
-
- return !dot ? LDAP_SUCCESS : LDAP_INVALID_SYNTAX;
-
- } else if( DESC_LEADCHAR(val->bv_val[0]) ) {
- for(i=1; i < val->bv_len; i++) {
- if( !DESC_CHAR(val->bv_val[i] ) ) {
- return LDAP_INVALID_SYNTAX;
- }
- }
-
- return LDAP_SUCCESS;
- }
-
- return LDAP_INVALID_SYNTAX;
-}
-
-static int
-integerMatch(
- int *matchp,
- slap_mask_t flags,
- Syntax *syntax,
- MatchingRule *mr,
- struct berval *value,
- void *assertedValue )
-{
- char *v, *av;
- int vsign = 1, avsign = 1; /* default sign = '+' */
- struct berval *asserted;
- ber_len_t vlen, avlen;
- int match;
-
- /* Skip leading space/sign/zeroes, and get the sign of the *value number */
- v = value->bv_val;
- vlen = value->bv_len;
-
-#ifndef SLAP_NVALUES
- if( mr == slap_schema.si_mr_integerFirstComponentMatch ) {
- char *tmp = memchr( v, '$', vlen );
- if( tmp ) vlen = tmp - v;
- while( vlen && ASCII_SPACE( v[vlen-1] )) vlen--;
- }
-#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;
- av = asserted->bv_val;
- avlen = asserted->bv_len;
- for( ; avlen && ( *av < '1' || '9' < *av ); av++, avlen-- )
- if( *av == '-' )
- avsign = -1;
- if( avlen == 0 )
- avsign = 0;
-
- match = vsign - avsign;
- if( match == 0 ) {
- match = (vlen != avlen
- ? ( vlen < avlen ? -1 : 1 )
- : memcmp( v, av, vlen ));
- if( vsign < 0 )
- match = -match;
- }
-
- *matchp = match;
- return LDAP_SUCCESS;
-}
-
-static int
-integerValidate(
- Syntax *syntax,
- struct berval *val )
-{
- ber_len_t i;
-
- if( !val->bv_len ) 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;
- }
-
- for( i=1; i < val->bv_len; i++ ) {
- if( !ASCII_DIGIT(val->bv_val[i]) ) return LDAP_INVALID_SYNTAX;
- }
-
- return LDAP_SUCCESS;
-}
-
-static int
-#ifdef SLAP_NVALUES
-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 )
-#endif
-{
- char *p;
- int negative=0;
- ber_len_t len;
-
-
- p = val->bv_val;
- len = val->bv_len;
-
- /* Ignore leading spaces */
- while ( len && ( *p == ' ' )) {
- p++;
- len--;
- }
-
- /* save sign */
- if( len ) {
- negative = ( *p == '-' );
- if(( *p == '-' ) || ( *p == '+' )) {
- p++;
- len--;
- }
- }
-
- /* Ignore leading zeros */
- while ( len && ( *p == '0' )) {
- p++;
- len--;
- }
-
- /* If there are no non-zero digits left, the number is zero, otherwise
- allocate space for the number and copy it into the buffer */
- if( len == 0 ) {
- normalized->bv_val = ch_strdup("0");
- normalized->bv_len = 1;
-
- } else {
- normalized->bv_len = len+negative;
- normalized->bv_val = ch_malloc( normalized->bv_len + 1 );
- if( negative ) normalized->bv_val[0] = '-';
- AC_MEMCPY( normalized->bv_val + negative, p, len );
- normalized->bv_val[len+negative] = '\0';
- }
-
- return LDAP_SUCCESS;
-}
-
-#ifndef SLAP_NVALUES
-
-/* Index generation function */
-static int integerIndexer(
- slap_mask_t use,
- slap_mask_t flags,
- Syntax *syntax,
- MatchingRule *mr,
- struct berval *prefix,
- BerVarray values,
- BerVarray *keysp )
-{
- int i;
- size_t slen, mlen;
- BerVarray keys;
- HASH_CONTEXT HASHcontext;
- unsigned char HASHdigest[HASH_BYTES];
- struct berval digest;
- digest.bv_val = HASHdigest;
- digest.bv_len = sizeof(HASHdigest);
-
- for( i=0; values[i].bv_val != NULL; i++ ) {
- /* empty - just count them */
- }
-
- /* we should have at least one value at this point */
- assert( i > 0 );
-
- keys = ch_malloc( sizeof( struct berval ) * (i+1) );
-
- slen = syntax->ssyn_oidlen;
- mlen = mr->smr_oidlen;
-
- for( i=0; values[i].bv_val != NULL; i++ ) {
- struct berval norm;
- xintegerNormalize( syntax, &values[i], &norm );
-
- HASH_Init( &HASHcontext );
- if( prefix != NULL && prefix->bv_len > 0 ) {
- HASH_Update( &HASHcontext,
- prefix->bv_val, prefix->bv_len );
- }
- HASH_Update( &HASHcontext,
- syntax->ssyn_oid, slen );
- HASH_Update( &HASHcontext,
- mr->smr_oid, mlen );
- HASH_Update( &HASHcontext,
- norm.bv_val, norm.bv_len );
- HASH_Final( HASHdigest, &HASHcontext );
-
- ber_dupbv( &keys[i], &digest );
- ch_free( norm.bv_val );
- }
-
- keys[i].bv_val = NULL;
- *keysp = keys;
- return LDAP_SUCCESS;
-}
-
-/* Index generation function */
-static int integerFilter(
- slap_mask_t use,
- slap_mask_t flags,
- Syntax *syntax,
- MatchingRule *mr,
- struct berval *prefix,
- void * assertedValue,
- BerVarray *keysp )
-{
- size_t slen, mlen;
- BerVarray keys;
- HASH_CONTEXT HASHcontext;
- unsigned char HASHdigest[HASH_BYTES];
- struct berval norm;
- struct berval digest;
- digest.bv_val = HASHdigest;
- digest.bv_len = sizeof(HASHdigest);
-
- slen = syntax->ssyn_oidlen;
- mlen = mr->smr_oidlen;
-
- xintegerNormalize( syntax, assertedValue, &norm );
-
- keys = ch_malloc( sizeof( struct berval ) * 2 );
-
- HASH_Init( &HASHcontext );
- if( prefix != NULL && prefix->bv_len > 0 ) {
- HASH_Update( &HASHcontext,
- prefix->bv_val, prefix->bv_len );
- }
- HASH_Update( &HASHcontext,
- syntax->ssyn_oid, slen );
- HASH_Update( &HASHcontext,
- mr->smr_oid, mlen );
- HASH_Update( &HASHcontext,
- norm.bv_val, norm.bv_len );
- HASH_Final( HASHdigest, &HASHcontext );
-
- ber_dupbv( &keys[0], &digest );
- keys[1].bv_val = NULL;
- ch_free( norm.bv_val );
-
- *keysp = keys;
- return LDAP_SUCCESS;
-}
-
-#endif
-
-static int
-countryStringValidate(
- Syntax *syntax,
- struct berval *val )
-{
- if( val->bv_len != 2 ) return LDAP_INVALID_SYNTAX;
-
- if( !SLAP_PRINTABLE(val->bv_val[0]) ) {
- return LDAP_INVALID_SYNTAX;
- }
- if( !SLAP_PRINTABLE(val->bv_val[1]) ) {
- return LDAP_INVALID_SYNTAX;
- }
-
- return LDAP_SUCCESS;
-}
-
-static int
-printableStringValidate(
- Syntax *syntax,
- struct berval *val )
-{
- ber_len_t i;
-
- if( val->bv_len == 0 ) return LDAP_INVALID_SYNTAX;
-
- for(i=0; i < val->bv_len; i++) {
- if( !SLAP_PRINTABLE(val->bv_val[i]) ) {
- return LDAP_INVALID_SYNTAX;
- }
- }
-
- return LDAP_SUCCESS;
-}
-
-static int
-printablesStringValidate(
- Syntax *syntax,
- struct berval *val )
-{
- ber_len_t i, len;
-
- if( val->bv_len == 0 ) return LDAP_INVALID_SYNTAX;
-
- for(i=0,len=0; i < val->bv_len; i++) {
- int c = val->bv_val[i];
-
- if( c == '$' ) {
- if( len == 0 ) {
- return LDAP_INVALID_SYNTAX;
- }
- len = 0;
-
- } else if ( SLAP_PRINTABLE(c) ) {
- len++;
- } else {
- return LDAP_INVALID_SYNTAX;
- }
- }
-
- if( len == 0 ) {
- return LDAP_INVALID_SYNTAX;
- }
-
- return LDAP_SUCCESS;
-}
-
-static int
-IA5StringValidate(
- Syntax *syntax,
- struct berval *val )
-{
- ber_len_t i;
-
- if( val->bv_len == 0 ) return LDAP_INVALID_SYNTAX;
-
- for(i=0; i < val->bv_len; i++) {
- if( !LDAP_ASCII(val->bv_val[i]) ) {
- return LDAP_INVALID_SYNTAX;
- }
- }
-
- return LDAP_SUCCESS;
-}
-
-static int
-#ifdef SLAP_NVALUES
-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 )
-#endif
-{
- char *p, *q;
-#ifdef SLAP_NVALUES
- int casefold = !SLAP_MR_ASSOCIATED(mr, slap_schema.si_mr_caseExactIA5Match);
-#endif
-
- assert( val->bv_len );
-
- p = val->bv_val;
-
- /* Ignore initial whitespace */
- while ( ASCII_SPACE( *p ) ) {
- p++;
- }
-
- normalized->bv_val = ch_strdup( p );
- p = q = normalized->bv_val;
-
- while ( *p ) {
- if ( ASCII_SPACE( *p ) ) {
- *q++ = *p++;
-
- /* Ignore the extra whitespace */
- while ( ASCII_SPACE( *p ) ) {
- p++;
- }
-
-#ifdef SLAP_NVALUES
- } else if ( casefold ) {
- /* Most IA5 rules require casefolding */
- *q++ = TOLOWER(*p++);
-#endif
-
- } else {
- *q++ = *p++;
- }
- }
-
- assert( normalized->bv_val <= p );
- assert( 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 ( ASCII_SPACE( q[-1] ) ) {
- --q;
- }
-
- /* null terminate */
- *q = '\0';
-
- normalized->bv_len = q - normalized->bv_val;
-
- if( normalized->bv_len == 0 ) {
- normalized->bv_val = ch_realloc( normalized->bv_val, 2 );
- normalized->bv_val[0] = ' ';
- normalized->bv_val[1] = '\0';
- normalized->bv_len = 1;
- }
-
- return LDAP_SUCCESS;
-}
-
-#ifndef SLAP_NVALUES
-
-static int
-caseExactIA5Match(
- int *matchp,
- slap_mask_t flags,
- Syntax *syntax,
- MatchingRule *mr,
- struct berval *value,
- void *assertedValue )
-{
- int match = value->bv_len - ((struct berval *) assertedValue)->bv_len;
-
- if( match == 0 ) {
- match = strncmp( value->bv_val,
- ((struct berval *) assertedValue)->bv_val,
- value->bv_len );
- }
-
- *matchp = match;
- return LDAP_SUCCESS;
-}
-
-static int
-caseExactIA5SubstringsMatch
-#else
-static int
-octetStringSubstringsMatch
-#endif
-(
- int *matchp,
- slap_mask_t flags,
- Syntax *syntax,
- MatchingRule *mr,
- struct berval *value,
- void *assertedValue )
-{
- int match = 0;
- SubstringsAssertion *sub = assertedValue;
- struct berval left = *value;
- int i;
- ber_len_t inlen=0;
-
- /* Add up asserted input length */
- if( sub->sa_initial.bv_val ) {
- inlen += sub->sa_initial.bv_len;
- }
- if( sub->sa_any ) {
- for(i=0; sub->sa_any[i].bv_val != NULL; i++) {
- inlen += sub->sa_any[i].bv_len;
- }
- }
- if( sub->sa_final.bv_val ) {
- inlen += sub->sa_final.bv_len;
- }
-
- if( sub->sa_initial.bv_val ) {
- if( inlen > left.bv_len ) {
- match = 1;
- goto done;
- }
-
- match = memcmp( sub->sa_initial.bv_val, left.bv_val,
- sub->sa_initial.bv_len );
-
- if( match != 0 ) {
- goto done;
- }
-
- left.bv_val += sub->sa_initial.bv_len;
- left.bv_len -= sub->sa_initial.bv_len;
- inlen -= sub->sa_initial.bv_len;
- }
-
- if( sub->sa_final.bv_val ) {
- if( inlen > left.bv_len ) {
- match = 1;
- goto done;
- }
-
- match = memcmp( sub->sa_final.bv_val,
- &left.bv_val[left.bv_len - sub->sa_final.bv_len],
- sub->sa_final.bv_len );
-
- if( match != 0 ) {
- goto done;
- }
-
- left.bv_len -= sub->sa_final.bv_len;
- inlen -= sub->sa_final.bv_len;
- }
-
- if( sub->sa_any ) {
- for(i=0; sub->sa_any[i].bv_val; i++) {
- ber_len_t idx;
- char *p;
-
-retry:
- if( inlen > left.bv_len ) {
- /* not enough length */
- match = 1;
- goto done;
- }
-
- if( sub->sa_any[i].bv_len == 0 ) {
- continue;
- }
-
- p = memchr( left.bv_val, *sub->sa_any[i].bv_val, left.bv_len );
-
- if( p == NULL ) {
- match = 1;
- goto done;
- }
-
- idx = p - left.bv_val;
-
- if( idx >= left.bv_len ) {
- /* this shouldn't happen */
- return LDAP_OTHER;
- }
-
- left.bv_val = p;
- left.bv_len -= idx;
-
- if( sub->sa_any[i].bv_len > left.bv_len ) {
- /* not enough left */
- match = 1;
- goto done;
- }
-
- match = memcmp( left.bv_val,
- sub->sa_any[i].bv_val,
- sub->sa_any[i].bv_len );
-
- if( match != 0 ) {
- left.bv_val++;
- left.bv_len--;
- goto retry;
- }
-
- left.bv_val += sub->sa_any[i].bv_len;
- left.bv_len -= sub->sa_any[i].bv_len;
- inlen -= sub->sa_any[i].bv_len;
- }
- }
-
-done:
- *matchp = match;
- return LDAP_SUCCESS;
-}
-
-#ifndef SLAP_NVALUES
-
-/* Index generation function */
-static int caseExactIA5Indexer(
- slap_mask_t use,
- slap_mask_t flags,
- Syntax *syntax,
- MatchingRule *mr,
- struct berval *prefix,
- BerVarray values,
- BerVarray *keysp )
-{
- int i;
- size_t slen, mlen;
- BerVarray keys;
- HASH_CONTEXT HASHcontext;
- unsigned char HASHdigest[HASH_BYTES];
- struct berval digest;
- digest.bv_val = HASHdigest;
- digest.bv_len = sizeof(HASHdigest);
-
- for( i=0; values[i].bv_val != NULL; i++ ) {
- /* empty - just count them */
- }
-
- /* we should have at least one value at this point */
- assert( i > 0 );
-
- keys = ch_malloc( sizeof( struct berval ) * (i+1) );
-
- slen = syntax->ssyn_oidlen;
- mlen = mr->smr_oidlen;
-
- for( i=0; values[i].bv_val != NULL; i++ ) {
- struct berval *value = &values[i];