diff options
Diffstat (limited to 'filter/filter-rule.c')
-rw-r--r-- | filter/filter-rule.c | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/filter/filter-rule.c b/filter/filter-rule.c index 89e0d76726..4adffeaf3c 100644 --- a/filter/filter-rule.c +++ b/filter/filter-rule.c @@ -41,6 +41,7 @@ #define d(x) static int validate(FilterRule *); +static int rule_eq(FilterRule *fr, FilterRule *cm); static xmlNodePtr xml_encode (FilterRule *); static int xml_decode (FilterRule *, xmlNodePtr, RuleContext *); static void build_code (FilterRule *, GString * out); @@ -100,6 +101,7 @@ filter_rule_class_init (FilterRuleClass * class) /* override methods */ class->validate = validate; + class->eq = rule_eq; class->xml_encode = xml_encode; class->xml_decode = xml_decode; class->build_code = build_code; @@ -231,6 +233,43 @@ validate (FilterRule *fr) return valid; } +int +filter_rule_eq(FilterRule *fr, FilterRule *cm) +{ + g_assert(IS_FILTER_RULE(fr)); + g_assert(IS_FILTER_RULE(cm)); + + return ((GtkObject *)fr)->klass == ((GtkObject *)cm)->klass + && ((FilterRuleClass *) ((GtkObject *) fr)->klass)->eq(fr, cm); +} + +static int +list_eq(GList *al, GList *bl) +{ + int truth = TRUE; + + while (truth && al && bl) { + FilterPart *a = al->data, *b = bl->data; + + truth = filter_part_eq(a, b); + al = al->next; + bl = bl->next; + } + + return truth && al == NULL && bl == NULL; +} + +static int +rule_eq(FilterRule *fr, FilterRule *cm) +{ + return fr->grouping == cm->grouping + && ( (fr->name && cm->name && strcmp(fr->name, cm->name) == 0) + || (fr->name == NULL && cm->name == NULL)) + && ( (fr->source && cm->source && strcmp(fr->source, cm->source) == 0) + || (fr->source == NULL && cm->source == NULL) ) + && list_eq(fr->parts, cm->parts); +} + xmlNodePtr filter_rule_xml_encode (FilterRule *fr) { |