diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2003-01-05 16:55:33 +0000 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2003-01-05 16:55:33 +0000 |
commit | 2b74ba3aaf67363f6bceed21a905d0a42b59ce3b (patch) | |
tree | 92b75f83311971ac1bd58242ce1dec8b27e92708 /libsieve | |
parent | 677d309dd58a066f639edeb5b1140ea7a42a827f (diff) | |
download | mailutils-2b74ba3aaf67363f6bceed21a905d0a42b59ce3b.tar.gz mailutils-2b74ba3aaf67363f6bceed21a905d0a42b59ce3b.tar.bz2 |
Added relational.c.
Diffstat (limited to 'libsieve')
-rw-r--r-- | libsieve/Makefile.am | 1 | ||||
-rw-r--r-- | libsieve/relational.c | 99 |
2 files changed, 100 insertions, 0 deletions
diff --git a/libsieve/Makefile.am b/libsieve/Makefile.am index 432a67bd3..109f92bd4 100644 --- a/libsieve/Makefile.am +++ b/libsieve/Makefile.am @@ -31,6 +31,7 @@ libsieve_la_SOURCES = \ load.c\ prog.c\ register.c\ + relational.c\ require.c\ runtime.c\ sieve-gram.c\ diff --git a/libsieve/relational.c b/libsieve/relational.c new file mode 100644 index 000000000..852c18b35 --- /dev/null +++ b/libsieve/relational.c @@ -0,0 +1,99 @@ +/* GNU Mailutils -- a suite of utilities for electronic mail + Copyright (C) 2003 Free Software Foundation, Inc. + + GNU Mailutils is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GNU Mailutils is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with GNU Mailutils; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <unistd.h> +#include <string.h> +#include <sieve.h> + +#define CAT2(a,b) a##b +#define CAT3(a,b,c) a##b##c + +#define DCL(name,op)\ + static int CAT2(op_,name) (int num, int lim) { return num op lim; }\ + static int CAT3(op_,name,_size_t) (size_t num, size_t lim) { return num op lim; } + +DCL(eq,==) +DCL(ne,!=) +DCL(gt,>) +DCL(ge,>=) +DCL(lt,<) +DCL(le,<=) + +static struct reltest_tab { + char *name; + sieve_relcmp_t test; + sieve_relcmpn_t stest; +} testtab[] = { +#define DEF(name) { #name, CAT2(op_,name), CAT3(op_,name,_size_t) } + + DEF(eq), + DEF(ne), + DEF(gt), + DEF(ge), + DEF(lt), + DEF(le) +}; + +static struct reltest_tab * +_relcmp_lookup (const char *str) +{ + int i; + + for (i = 0; i < sizeof(testtab) / sizeof(testtab[0]); i++) + if (strcmp (testtab[i].name, str) == 0) + return &testtab[i]; + return 0; +} + +int +sieve_str_to_relcmp (const char *str, + sieve_relcmp_t *test, sieve_relcmpn_t *stest) +{ + struct reltest_tab *t = _relcmp_lookup (str); + if (t) + { + if (test) + *test = t->test; + if (stest) + *stest = t->stest; + return 0; + } + return 1; +} + +sieve_relcmp_t +sieve_get_relcmp (sieve_machine_t mach, list_t tags) +{ + sieve_value_t *arg; + sieve_relcmp_t test = NULL; + + if (sieve_tag_lookup (tags, "value", &arg) == 0) + return op_ne; + sieve_str_to_relcmp (arg->v.string, &test, NULL); + return test; +} + +int +sieve_require_relational (sieve_machine_t mach, const char *name) +{ + /* noop */ + return 0; +} |