Home | History | Annotate | Line # | Download | only in slapd
      1 /*	$NetBSD: index.c,v 1.4 2025/09/05 21:16:25 christos Exp $	*/
      2 
      3 /* index.c - index utilities */
      4 /* $OpenLDAP$ */
      5 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
      6  *
      7  * Copyright 1998-2024 The OpenLDAP Foundation.
      8  * All rights reserved.
      9  *
     10  * Redistribution and use in source and binary forms, with or without
     11  * modification, are permitted only as authorized by the OpenLDAP
     12  * Public License.
     13  *
     14  * A copy of this license is available in the file LICENSE in the
     15  * top-level directory of the distribution or, alternatively, at
     16  * <http://www.OpenLDAP.org/license.html>.
     17  */
     18 
     19 #include <sys/cdefs.h>
     20 __RCSID("$NetBSD: index.c,v 1.4 2025/09/05 21:16:25 christos Exp $");
     21 
     22 #include "portable.h"
     23 
     24 #include <stdio.h>
     25 #include <ac/string.h>
     26 #include <lutil.h>
     27 
     28 #include "slap.h"
     29 
     30 static slap_verbmasks idxstr[] = {
     31 	{ BER_BVC("pres"), SLAP_INDEX_PRESENT },
     32 	{ BER_BVC("eq"), SLAP_INDEX_EQUALITY },
     33 	{ BER_BVC("approx"), SLAP_INDEX_APPROX },
     34 	{ BER_BVC("subinitial"), SLAP_INDEX_SUBSTR_INITIAL },
     35 	{ BER_BVC("subany"), SLAP_INDEX_SUBSTR_ANY },
     36 	{ BER_BVC("subfinal"), SLAP_INDEX_SUBSTR_FINAL },
     37 	{ BER_BVC("sub"), SLAP_INDEX_SUBSTR_DEFAULT },
     38 	{ BER_BVC("substr"), 0 },
     39 	{ BER_BVC("notags"), SLAP_INDEX_NOTAGS },
     40 	{ BER_BVC("nolang"), 0 },	/* backwards compat */
     41 	{ BER_BVC("nosubtypes"), SLAP_INDEX_NOSUBTYPES },
     42 	{ BER_BVNULL, 0 }
     43 };
     44 
     45 
     46 int slap_str2index( const char *str, slap_mask_t *idx )
     47 {
     48 	int i;
     49 
     50 	i = verb_to_mask( str, idxstr );
     51 	if ( BER_BVISNULL(&idxstr[i].word) ) return LDAP_OTHER;
     52 	while ( !idxstr[i].mask ) i--;
     53 	*idx = idxstr[i].mask;
     54 
     55 
     56 	return LDAP_SUCCESS;
     57 }
     58 
     59 void slap_index2bvlen( slap_mask_t idx, struct berval *bv )
     60 {
     61 	int i;
     62 
     63 	bv->bv_len = 0;
     64 
     65 	for ( i=0; !BER_BVISNULL( &idxstr[i].word ); i++ ) {
     66 		if ( !idxstr[i].mask ) continue;
     67 		if ( IS_SLAP_INDEX( idx, idxstr[i].mask )) {
     68 			if ( (idxstr[i].mask & SLAP_INDEX_SUBSTR) &&
     69 				((idx & SLAP_INDEX_SUBSTR_DEFAULT) != idxstr[i].mask))
     70 				continue;
     71 			if ( bv->bv_len ) bv->bv_len++;
     72 			bv->bv_len += idxstr[i].word.bv_len;
     73 		}
     74 	}
     75 }
     76 
     77 /* caller must provide buffer space, after calling index2bvlen */
     78 void slap_index2bv( slap_mask_t idx, struct berval *bv )
     79 {
     80 	int i;
     81 	char *ptr;
     82 
     83 	if ( !bv->bv_len ) return;
     84 
     85 	ptr = bv->bv_val;
     86 	for ( i=0; !BER_BVISNULL( &idxstr[i].word ); i++ ) {
     87 		if ( !idxstr[i].mask ) continue;
     88 		if ( IS_SLAP_INDEX( idx, idxstr[i].mask )) {
     89 			if ( (idxstr[i].mask & SLAP_INDEX_SUBSTR) &&
     90 				((idx & SLAP_INDEX_SUBSTR_DEFAULT) != idxstr[i].mask))
     91 				continue;
     92 			if ( ptr != bv->bv_val ) *ptr++ = ',';
     93 			ptr = lutil_strcopy( ptr, idxstr[i].word.bv_val );
     94 		}
     95 	}
     96 }
     97