summaryrefslogtreecommitdiffstats
path: root/fmt_ldapsearchfilterstring.c
diff options
context:
space:
mode:
authorSimon Rettberg2014-03-15 01:49:50 +0100
committerSimon Rettberg2014-03-15 01:49:50 +0100
commitbedd2e7ccb1595c23e159eaa952ae1b0b5a3d2ad (patch)
treec7d1995a09f6ed0c4e6873252e957d72f5d07d07 /fmt_ldapsearchfilterstring.c
downloadldadp-bedd2e7ccb1595c23e159eaa952ae1b0b5a3d2ad.tar.gz
ldadp-bedd2e7ccb1595c23e159eaa952ae1b0b5a3d2ad.tar.xz
ldadp-bedd2e7ccb1595c23e159eaa952ae1b0b5a3d2ad.zip
Lean and mean initial commit
Not much functionality yet
Diffstat (limited to 'fmt_ldapsearchfilterstring.c')
-rw-r--r--fmt_ldapsearchfilterstring.c69
1 files changed, 69 insertions, 0 deletions
diff --git a/fmt_ldapsearchfilterstring.c b/fmt_ldapsearchfilterstring.c
new file mode 100644
index 0000000..cd53ea3
--- /dev/null
+++ b/fmt_ldapsearchfilterstring.c
@@ -0,0 +1,69 @@
+#include "fmt.h"
+#include "byte.h"
+#include <str.h>
+#include "ldap.h"
+
+size_t fmt_ldapsearchfilterstring(char* dest,const struct Filter* f) {
+ size_t len;
+ len = fmt_str(dest,"(");
+ switch (f->type) {
+ case AND: case OR: case NOT:
+ if (dest) dest[len]="&|!"[f->type];
+ ++len;
+ len += fmt_ldapsearchfilterstring(dest?dest+len:0,f->x);
+ break;
+ case EQUAL: case GREATEQUAL: case LESSEQUAL: case APPROX:
+ if (dest) {
+ byte_copy(dest+len,f->ava.desc.l,f->ava.desc.s);
+ len += f->ava.desc.l;
+ if (f->type!=EQUAL) {
+ dest[len]="><~"[f->type-GREATEQUAL];
+ ++len;
+ }
+ dest[len]='='; ++len;
+ byte_copy(dest+len,f->ava.value.l,f->ava.value.s);
+ len += f->ava.value.l;
+ } else
+ len += f->ava.desc.l + f->ava.value.l + 1 + (f->type>EQUAL);
+ break;
+ case SUBSTRING:
+ {
+ struct Substring* x=f->substrings;
+ while (x) {
+ if (dest) {
+ byte_copy(dest+len,f->ava.desc.l,f->ava.desc.s);
+ len += f->ava.desc.l;
+ dest[len]='='; ++len;
+ if (x->substrtype != prefix) {
+ dest[len]='*'; ++len;
+ }
+ byte_copy(dest+len,x->s.l,x->s.s);
+ len += x->s.l;
+ if (x->substrtype != suffix) {
+ dest[len]='*'; ++len;
+ }
+ if (x->next) {
+ dest[len]=')';
+ dest[len+1]='(';
+ len+=2;
+ }
+ } else
+ len += f->ava.desc.l + 1 + x->s.l + 1 + (x->substrtype==any) + (x->next?2:0);
+ x=x->next;
+ }
+ }
+ break;
+ case PRESENT:
+ if (dest) {
+ byte_copy(dest+len,f->ava.desc.l,f->ava.desc.s);
+ dest[len+f->ava.desc.l]='=';
+ dest[len+f->ava.desc.l+1]='*';
+ }
+ len += f->ava.desc.l+2;
+ break;
+ default:
+ return -1;
+ }
+ if (dest) dest[len]=')';
+ return len+1;
+}