1 #include "fmt.h"
2 #include "byte.h"
3 #include "str.h"
4 #include "ldap.h"
5
fmt_ldapsearchfilterstring(char * dest,const struct Filter * f)6 size_t fmt_ldapsearchfilterstring(char* dest,const struct Filter* f) {
7 size_t len;
8 len = fmt_str(dest,"(");
9 switch (f->type) {
10 case AND: case OR: case NOT:
11 if (dest) dest[len]="&|!"[f->type];
12 ++len;
13 len += fmt_ldapsearchfilterstring(dest?dest+len:0,f->x);
14 break;
15 case EQUAL: case GREATEQUAL: case LESSEQUAL: case APPROX:
16 if (dest) {
17 byte_copy(dest+len,f->ava.desc.l,f->ava.desc.s);
18 len += f->ava.desc.l;
19 if (f->type!=EQUAL) {
20 dest[len]="><~"[f->type-GREATEQUAL];
21 ++len;
22 }
23 dest[len]='='; ++len;
24 byte_copy(dest+len,f->ava.value.l,f->ava.value.s);
25 len += f->ava.value.l;
26 } else
27 len += f->ava.desc.l + f->ava.value.l + 1 + (f->type>EQUAL);
28 break;
29 case SUBSTRING:
30 {
31 struct Substring* x=f->substrings;
32 while (x) {
33 if (dest) {
34 byte_copy(dest+len,f->ava.desc.l,f->ava.desc.s);
35 len += f->ava.desc.l;
36 dest[len]='='; ++len;
37 if (x->substrtype != prefix) {
38 dest[len]='*'; ++len;
39 }
40 byte_copy(dest+len,x->s.l,x->s.s);
41 len += x->s.l;
42 if (x->substrtype != suffix) {
43 dest[len]='*'; ++len;
44 }
45 if (x->next) {
46 dest[len]=')';
47 dest[len+1]='(';
48 len+=2;
49 }
50 } else
51 len += f->ava.desc.l + 1 + x->s.l + 1 + (x->substrtype==any) + (x->next?2:0);
52 x=x->next;
53 }
54 }
55 break;
56 case PRESENT:
57 if (dest) {
58 byte_copy(dest+len,f->ava.desc.l,f->ava.desc.s);
59 dest[len+f->ava.desc.l]='=';
60 dest[len+f->ava.desc.l+1]='*';
61 }
62 len += f->ava.desc.l+2;
63 break;
64 default:
65 return -1;
66 }
67 if (dest) dest[len]=')';
68 return len+1;
69 }
70