403 |
sieve_runtime_tag_t t; |
sieve_runtime_tag_t t; |
404 |
|
|
405 |
t.tag = name; |
t.tag = name; |
406 |
if (list_do (taglist, tag_finder, &t)) |
if (taglist && list_do (taglist, tag_finder, &t)) |
407 |
{ |
{ |
408 |
if (arg) |
if (arg) |
409 |
*arg = t.arg; |
*arg = t.arg; |
448 |
struct comp_data { |
struct comp_data { |
449 |
sieve_value_t *val; |
sieve_value_t *val; |
450 |
sieve_comparator_t comp; |
sieve_comparator_t comp; |
451 |
|
sieve_relcmp_t test; |
452 |
sieve_retrieve_t retr; |
sieve_retrieve_t retr; |
453 |
void *data; |
void *data; |
454 |
|
size_t count; |
455 |
}; |
}; |
456 |
|
|
457 |
struct comp_data2 { |
struct comp_data2 { |
458 |
char *sample; |
char *sample; |
459 |
sieve_comparator_t comp; |
sieve_comparator_t comp; |
460 |
|
sieve_relcmp_t test; |
461 |
}; |
}; |
462 |
|
|
463 |
int |
int |
464 |
_comp_action2 (void *item, void *data) |
_comp_action2 (void *item, void *data) |
465 |
{ |
{ |
466 |
struct comp_data2 *cp = data; |
struct comp_data2 *cp = data; |
467 |
return cp->comp (item, cp->sample); |
return cp->test (cp->comp (item, cp->sample), 0); |
468 |
} |
} |
469 |
|
|
470 |
int |
int |
476 |
int i; |
int i; |
477 |
|
|
478 |
d.comp = cp->comp; |
d.comp = cp->comp; |
479 |
|
d.test = cp->test; |
480 |
for (i = 0; cp->retr (item, cp->data, i, &d.sample) == 0; i++) |
for (i = 0; cp->retr (item, cp->data, i, &d.sample) == 0; i++) |
481 |
if (d.sample) |
if (d.sample) |
482 |
{ |
{ |
483 |
|
cp->count++; |
484 |
rc = sieve_vlist_do (cp->val, _comp_action2, &d); |
rc = sieve_vlist_do (cp->val, _comp_action2, &d); |
485 |
free (d.sample); |
free (d.sample); |
486 |
} |
} |
489 |
|
|
490 |
int |
int |
491 |
sieve_vlist_compare (sieve_value_t *a, sieve_value_t *b, |
sieve_vlist_compare (sieve_value_t *a, sieve_value_t *b, |
492 |
sieve_comparator_t comp, sieve_retrieve_t retr, |
sieve_comparator_t comp, sieve_relcmp_t test, |
493 |
void *data) |
sieve_retrieve_t retr, |
494 |
|
void *data, size_t *count) |
495 |
{ |
{ |
496 |
struct comp_data d; |
struct comp_data d; |
497 |
|
int rc; |
498 |
|
|
499 |
d.comp = comp; |
d.comp = comp; |
500 |
|
d.test = test; |
501 |
d.retr = retr; |
d.retr = retr; |
502 |
d.data = data; |
d.data = data; |
503 |
d.val = b; |
d.val = b; |
504 |
return sieve_vlist_do (a, _comp_action, &d); |
d.count = 0; |
505 |
|
rc = sieve_vlist_do (a, _comp_action, &d); |
506 |
|
if (count) |
507 |
|
*count = d.count; |
508 |
|
return rc; |
509 |
} |
} |