]> git.sur5r.net Git - openldap/blob - servers/slapd/value.c
Y2k copyright update
[openldap] / servers / slapd / value.c
1 /* value.c - routines for dealing with values */
2 /* $OpenLDAP$ */
3 /*
4  * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved.
5  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
6  */
7
8 #include "portable.h"
9
10 #include <stdio.h>
11
12 #include <ac/ctype.h>
13 #include <ac/socket.h>
14 #include <ac/string.h>
15 #include <ac/time.h>
16
17 #include <sys/stat.h>
18
19 #include "slap.h"
20
21 int
22 value_add_fast( 
23     struct berval       ***vals,
24     struct berval       **addvals,
25     int                 nvals,
26     int                 naddvals,
27     int                 *maxvals
28 )
29 {
30         int     need, i, j;
31
32         if ( *maxvals == 0 ) {
33                 *maxvals = 1;
34         }
35         need = nvals + naddvals + 1;
36         while ( *maxvals < need ) {
37                 *maxvals *= 2;
38                 *vals = (struct berval **) ch_realloc( (char *) *vals,
39                     *maxvals * sizeof(struct berval *) );
40         }
41
42         for ( i = 0, j = 0; i < naddvals; i++ ) {
43                 if ( addvals[i]->bv_len > 0 ) {
44                         (*vals)[nvals + j] = ber_bvdup( addvals[i] );
45                         if( (*vals)[nvals + j] != NULL ) j++;
46                 }
47         }
48         (*vals)[nvals + j] = NULL;
49
50         return( 0 );
51 }
52
53 int
54 value_add( 
55     struct berval       ***vals,
56     struct berval       **addvals
57 )
58 {
59         int     n, nn, i, j;
60
61         for ( nn = 0; addvals != NULL && addvals[nn] != NULL; nn++ )
62                 ;       /* NULL */
63
64         if ( *vals == NULL ) {
65                 *vals = (struct berval **) ch_malloc( (nn + 1)
66                     * sizeof(struct berval *) );
67                 n = 0;
68         } else {
69                 for ( n = 0; (*vals)[n] != NULL; n++ )
70                         ;       /* NULL */
71                 *vals = (struct berval **) ch_realloc( (char *) *vals,
72                     (n + nn + 1) * sizeof(struct berval *) );
73         }
74
75         for ( i = 0, j = 0; i < nn; i++ ) {
76                 if ( addvals[i]->bv_len > 0 ) {
77                         (*vals)[n + j] = ber_bvdup( addvals[i] );
78                         if( (*vals)[n + j++] == NULL ) break;
79                 }
80         }
81         (*vals)[n + j] = NULL;
82
83         return( 0 );
84 }
85
86 #ifdef SLAPD_SCHEMA_NOT_COMPAT
87         /* not yet implemented */
88 #else
89 void
90 value_normalize(
91     char        *s,
92     int         syntax
93 )
94 {
95         char    *d, *save;
96
97         if ( ! (syntax & SYNTAX_CIS) ) {
98                 return;
99         }
100
101         if ( syntax & SYNTAX_DN ) {
102                 (void) dn_normalize( s );
103                 return;
104         }
105
106         save = s;
107         for ( d = s; *s; s++ ) {
108                 if ( (syntax & SYNTAX_TEL) && (*s == ' ' || *s == '-') ) {
109                         continue;
110                 }
111                 *d++ = TOUPPER( (unsigned char) *s );
112         }
113         *d = '\0';
114 }
115
116 int
117 value_cmp(
118     struct berval       *v1,
119     struct berval       *v2,
120     int                 syntax,
121     int                 normalize       /* 1 => arg 1; 2 => arg 2; 3 => both */
122 )
123 {
124         int             rc;
125
126         if ( normalize & 1 ) {
127                 v1 = ber_bvdup( v1 );
128                 value_normalize( v1->bv_val, syntax );
129         }
130         if ( normalize & 2 ) {
131                 v2 = ber_bvdup( v2 );
132                 value_normalize( v2->bv_val, syntax );
133         }
134
135         switch ( syntax ) {
136         case SYNTAX_CIS:
137         case (SYNTAX_CIS | SYNTAX_TEL):
138         case (SYNTAX_CIS | SYNTAX_DN):
139                 rc = strcasecmp( v1->bv_val, v2->bv_val );
140                 break;
141
142         case SYNTAX_CES:
143                 rc = strcmp( v1->bv_val, v2->bv_val );
144                 break;
145
146         default:        /* Unknown syntax */
147         case SYNTAX_BIN:
148                 rc = (v1->bv_len == v2->bv_len
149                       ? memcmp( v1->bv_val, v2->bv_val, v1->bv_len )
150                       : v1->bv_len > v2->bv_len ? 1 : -1);
151                 break;
152         }
153
154         if ( normalize & 1 ) {
155                 ber_bvfree( v1 );
156         }
157         if ( normalize & 2 ) {
158                 ber_bvfree( v2 );
159         }
160
161         return( rc );
162 }
163
164 int
165 value_find(
166     struct berval       **vals,
167     struct berval       *v,
168     int                 syntax,
169     int                 normalize
170 )
171 {
172         int     i;
173
174         for ( i = 0; vals[i] != NULL; i++ ) {
175                 if ( value_cmp( vals[i], v, syntax, normalize ) == 0 ) {
176                         return( 0 );
177                 }
178         }
179
180         return( 1 );
181 }
182 #endif