diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2003-01-05 16:56:41 +0000 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2003-01-05 16:56:41 +0000 |
commit | 83abd0daf114b5e365bf819e1de046d1dfaad198 (patch) | |
tree | 4aa3c45141edc018f8db5be3eec2717e2e5551af | |
parent | c9e92991135ee0ce8cdcb02c6458d1cb40ae9cae (diff) | |
download | mailutils-83abd0daf114b5e365bf819e1de046d1dfaad198.tar.gz mailutils-83abd0daf114b5e365bf819e1de046d1dfaad198.tar.bz2 |
(sieve_test_address,sieve_test_header): Added support for relational tests.
-rw-r--r-- | libsieve/tests.c | 55 |
1 files changed, 48 insertions, 7 deletions
diff --git a/libsieve/tests.c b/libsieve/tests.c index c025a744d..cdb7e15df 100644 --- a/libsieve/tests.c +++ b/libsieve/tests.c @@ -89,11 +89,13 @@ retrieve_address (void *item, void *data, int idx, char **pval) int sieve_test_address (sieve_machine_t mach, list_t args, list_t tags) { - sieve_value_t *h, *v; + sieve_value_t *h, *v, *arg; header_t header = NULL; sieve_comparator_t comp = sieve_get_comparator (mach, tags); + sieve_relcmp_t test = sieve_get_relcmp (mach, tags); struct address_closure clos; int rc; + size_t count; if (mach->debug_level & MU_SIEVE_DEBUG_TRACE) sieve_debug (mach, "ADDRESS\n"); @@ -115,8 +117,24 @@ sieve_test_address (sieve_machine_t mach, list_t args, list_t tags) clos.data = header; clos.aget = sieve_get_address_part (tags); clos.addr = NULL; - rc = sieve_vlist_compare (h, v, comp, retrieve_address, &clos); + rc = sieve_vlist_compare (h, v, comp, test, retrieve_address, &clos, &count); address_destroy (&clos.addr); + + if (sieve_tag_lookup (tags, "count", &arg)) + { + size_t limit; + char *str; + sieve_value_t *val; + sieve_relcmpn_t stest; + + val = sieve_value_get (args, 1); + list_get (val->v.list, 0, (void **) &str); + limit = strtoul (str, &str, 10); + + sieve_str_to_relcmp (arg->v.string, NULL, &stest); + return stest (count, limit); + } + return rc; } @@ -131,9 +149,11 @@ retrieve_header (void *item, void *data, int idx, char **pval) int sieve_test_header (sieve_machine_t mach, list_t args, list_t tags) { - sieve_value_t *h, *v; + sieve_value_t *h, *v, *arg; header_t header = NULL; sieve_comparator_t comp = sieve_get_comparator (mach, tags); + sieve_relcmp_t test = sieve_get_relcmp (mach, tags); + size_t count, mcount = 0; if (mach->debug_level & MU_SIEVE_DEBUG_TRACE) sieve_debug (mach, "HEADER\n"); @@ -168,15 +188,33 @@ sieve_test_header (sieve_machine_t mach, list_t args, list_t tags) if (message_get_part (mach->msg, i, &message) == 0) { message_get_header (message, &header); - if (sieve_vlist_compare (h, v, comp, - retrieve_header, header)) + if (sieve_vlist_compare (h, v, comp, test, + retrieve_header, header, &mcount)) return 1; } } } } message_get_header (mach->msg, &header); - return sieve_vlist_compare (h, v, comp, retrieve_header, header); + if (sieve_vlist_compare (h, v, comp, test, retrieve_header, header, &count)) + return 1; + + if (sieve_tag_lookup (tags, "count", &arg)) + { + size_t limit; + char *str; + sieve_value_t *val; + sieve_relcmpn_t stest; + + val = sieve_value_get (args, 1); + list_get (val->v.list, 0, (void **) &str); + limit = strtoul (str, &str, 10); + + sieve_str_to_relcmp (arg->v.string, NULL, &stest); + return stest (count + mcount, limit); + } + + return 0; } int @@ -212,6 +250,7 @@ sieve_test_envelope (sieve_machine_t mach, list_t args, list_t tags) { sieve_value_t *h, *v; sieve_comparator_t comp = sieve_get_comparator (mach, tags); + sieve_relcmp_t test = sieve_get_relcmp (mach, tags); struct address_closure clos; int rc; @@ -234,7 +273,7 @@ sieve_test_envelope (sieve_machine_t mach, list_t args, list_t tags) message_get_envelope (sieve_get_message (mach), (envelope_t*)&clos.data); clos.aget = sieve_get_address_part (tags); clos.addr = NULL; - rc = sieve_vlist_compare (h, v, comp, retrieve_envelope, &clos); + rc = sieve_vlist_compare (h, v, comp, test, retrieve_envelope, &clos, NULL); address_destroy (&clos.addr); return rc; } @@ -322,6 +361,8 @@ static sieve_tag_def_t match_part_tags[] = { { "contains", SVT_VOID }, { "matches", SVT_VOID }, { "regex", SVT_VOID }, + { "count", SVT_STRING }, + { "value", SVT_STRING }, { "comparator", SVT_STRING }, { NULL } }; |