1 /* $NetBSD: index.c,v 1.2 2020/08/11 13:15:39 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-2020 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.2 2020/08/11 13:15:39 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