- 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;
-}
-
-#ifdef SLAP_NVALUES
-static int
-IA5StringNormalize(
- slap_mask_t use,
- Syntax *syntax,
- MatchingRule *mr,
- struct berval *val,
- struct berval *normalized )
-#else
-static int
-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];
-
- 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,
- value->bv_val, value->bv_len );
- HASH_Final( HASHdigest, &HASHcontext );
-
- ber_dupbv( &keys[i], &digest );
- }
-
- keys[i].bv_val = NULL;
- *keysp = keys;
- return LDAP_SUCCESS;
-}
-
-/* Index generation function */
-static int caseExactIA5Filter(
- 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 *value;
- struct berval digest;
- digest.bv_val = HASHdigest;
- digest.bv_len = sizeof(HASHdigest);
-
- slen = syntax->ssyn_oidlen;
- mlen = mr->smr_oidlen;
-
- value = (struct berval *) assertedValue;
-
- 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,
- value->bv_val, value->bv_len );
- HASH_Final( HASHdigest, &HASHcontext );
-
- ber_dupbv( &keys[0], &digest );
- keys[1].bv_val = NULL;
-
- *keysp = keys;
- return LDAP_SUCCESS;
-}
-
-/* Substrings Index generation function */
-static int caseExactIA5SubstringsIndexer(
- slap_mask_t use,
- slap_mask_t flags,
- Syntax *syntax,
- MatchingRule *mr,
- struct berval *prefix,
- BerVarray values,
- BerVarray *keysp )
-{
- ber_len_t i, nkeys;
- 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);
-
- /* we should have at least one value at this point */
- assert( values != NULL && values[0].bv_val != NULL );
-
- 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;
- 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;
- struct berval *value;
-
- value = &values[i];
- if( value->bv_len < SLAP_INDEX_SUBSTR_MINLEN ) continue;
-
- if( ( flags & SLAP_INDEX_SUBSTR_ANY ) &&
- ( value->bv_len >= SLAP_INDEX_SUBSTR_MAXLEN ) )
- {
- char pre = SLAP_INDEX_SUBSTR_PREFIX;
- max = value->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,
- &value->bv_val[j],
- SLAP_INDEX_SUBSTR_MAXLEN );
- HASH_Final( HASHdigest, &HASHcontext );
-
- ber_dupbv( &keys[nkeys++], &digest );
- }
- }