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