1*549b59edSchristos /* $NetBSD: index.c,v 1.3 2021/08/14 16:14:58 christos Exp $ */
24e6df137Slukem
32de962bdSlukem /* index.c - index utilities */
4d11b170bStron /* $OpenLDAP$ */
52de962bdSlukem /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
62de962bdSlukem *
7*549b59edSchristos * Copyright 1998-2021 The OpenLDAP Foundation.
82de962bdSlukem * All rights reserved.
92de962bdSlukem *
102de962bdSlukem * Redistribution and use in source and binary forms, with or without
112de962bdSlukem * modification, are permitted only as authorized by the OpenLDAP
122de962bdSlukem * Public License.
132de962bdSlukem *
142de962bdSlukem * A copy of this license is available in the file LICENSE in the
152de962bdSlukem * top-level directory of the distribution or, alternatively, at
162de962bdSlukem * <http://www.OpenLDAP.org/license.html>.
172de962bdSlukem */
182de962bdSlukem
19376af7d7Schristos #include <sys/cdefs.h>
20*549b59edSchristos __RCSID("$NetBSD: index.c,v 1.3 2021/08/14 16:14:58 christos Exp $");
21376af7d7Schristos
222de962bdSlukem #include "portable.h"
232de962bdSlukem
242de962bdSlukem #include <stdio.h>
252de962bdSlukem #include <ac/string.h>
262de962bdSlukem #include <lutil.h>
272de962bdSlukem
282de962bdSlukem #include "slap.h"
292de962bdSlukem
302de962bdSlukem static slap_verbmasks idxstr[] = {
312de962bdSlukem { BER_BVC("pres"), SLAP_INDEX_PRESENT },
322de962bdSlukem { BER_BVC("eq"), SLAP_INDEX_EQUALITY },
332de962bdSlukem { BER_BVC("approx"), SLAP_INDEX_APPROX },
342de962bdSlukem { BER_BVC("subinitial"), SLAP_INDEX_SUBSTR_INITIAL },
352de962bdSlukem { BER_BVC("subany"), SLAP_INDEX_SUBSTR_ANY },
362de962bdSlukem { BER_BVC("subfinal"), SLAP_INDEX_SUBSTR_FINAL },
372de962bdSlukem { BER_BVC("sub"), SLAP_INDEX_SUBSTR_DEFAULT },
382de962bdSlukem { BER_BVC("substr"), 0 },
392de962bdSlukem { BER_BVC("notags"), SLAP_INDEX_NOTAGS },
402de962bdSlukem { BER_BVC("nolang"), 0 }, /* backwards compat */
412de962bdSlukem { BER_BVC("nosubtypes"), SLAP_INDEX_NOSUBTYPES },
422de962bdSlukem { BER_BVNULL, 0 }
432de962bdSlukem };
442de962bdSlukem
452de962bdSlukem
slap_str2index(const char * str,slap_mask_t * idx)462de962bdSlukem int slap_str2index( const char *str, slap_mask_t *idx )
472de962bdSlukem {
482de962bdSlukem int i;
492de962bdSlukem
502de962bdSlukem i = verb_to_mask( str, idxstr );
512de962bdSlukem if ( BER_BVISNULL(&idxstr[i].word) ) return LDAP_OTHER;
522de962bdSlukem while ( !idxstr[i].mask ) i--;
532de962bdSlukem *idx = idxstr[i].mask;
542de962bdSlukem
552de962bdSlukem
562de962bdSlukem return LDAP_SUCCESS;
572de962bdSlukem }
582de962bdSlukem
slap_index2bvlen(slap_mask_t idx,struct berval * bv)592de962bdSlukem void slap_index2bvlen( slap_mask_t idx, struct berval *bv )
602de962bdSlukem {
612de962bdSlukem int i;
622de962bdSlukem
632de962bdSlukem bv->bv_len = 0;
642de962bdSlukem
652de962bdSlukem for ( i=0; !BER_BVISNULL( &idxstr[i].word ); i++ ) {
662de962bdSlukem if ( !idxstr[i].mask ) continue;
672de962bdSlukem if ( IS_SLAP_INDEX( idx, idxstr[i].mask )) {
682de962bdSlukem if ( (idxstr[i].mask & SLAP_INDEX_SUBSTR) &&
692de962bdSlukem ((idx & SLAP_INDEX_SUBSTR_DEFAULT) != idxstr[i].mask))
702de962bdSlukem continue;
712de962bdSlukem if ( bv->bv_len ) bv->bv_len++;
722de962bdSlukem bv->bv_len += idxstr[i].word.bv_len;
732de962bdSlukem }
742de962bdSlukem }
752de962bdSlukem }
762de962bdSlukem
772de962bdSlukem /* caller must provide buffer space, after calling index2bvlen */
slap_index2bv(slap_mask_t idx,struct berval * bv)782de962bdSlukem void slap_index2bv( slap_mask_t idx, struct berval *bv )
792de962bdSlukem {
802de962bdSlukem int i;
812de962bdSlukem char *ptr;
822de962bdSlukem
832de962bdSlukem if ( !bv->bv_len ) return;
842de962bdSlukem
852de962bdSlukem ptr = bv->bv_val;
862de962bdSlukem for ( i=0; !BER_BVISNULL( &idxstr[i].word ); i++ ) {
872de962bdSlukem if ( !idxstr[i].mask ) continue;
882de962bdSlukem if ( IS_SLAP_INDEX( idx, idxstr[i].mask )) {
892de962bdSlukem if ( (idxstr[i].mask & SLAP_INDEX_SUBSTR) &&
902de962bdSlukem ((idx & SLAP_INDEX_SUBSTR_DEFAULT) != idxstr[i].mask))
912de962bdSlukem continue;
922de962bdSlukem if ( ptr != bv->bv_val ) *ptr++ = ',';
932de962bdSlukem ptr = lutil_strcopy( ptr, idxstr[i].word.bv_val );
942de962bdSlukem }
952de962bdSlukem }
962de962bdSlukem }
97