return message_sub_part_by_idx(parts, idx);
}
-bool message_part_is_equal(const struct message_part *p1,
- const struct message_part *p2)
+bool message_part_is_equal_ex(const struct message_part *p1,
+ const struct message_part *p2,
+ message_part_comparator_t *equals_ex)
{
/* This cannot be p1 && p2, because then we would return
TRUE when either part is NULL, and we should return FALSE */
p1->flags != p2->flags)
return FALSE;
+ if (equals_ex != NULL && !equals_ex(p1, p2))
+ return FALSE;
+
/* Move forward */
p1 = p1->next;
p2 = p2->next;
/* Parts are equal */
return TRUE;
}
+
+bool message_part_is_equal(const struct message_part *p1,
+ const struct message_part *p2) ATTR_NULL(1, 2)
+{
+ return message_part_is_equal_ex(p1, p2, NULL);
+}
struct message_part *
message_part_by_idx(struct message_part *parts, unsigned int idx);
+typedef bool message_part_comparator_t(
+ const struct message_part *p1, const struct message_part *p2);
+
/* Returns TRUE when message parts are considered equal. Equality is determined
to be TRUE, when
bool message_part_is_equal(const struct message_part *p1,
const struct message_part *p2) ATTR_NULL(1, 2);
+/* Same as message_part_is_equal(), but it allows to invoke an additional
+ comparator on each incountered part */
+bool message_part_is_equal_ex(const struct message_part *p1,
+ const struct message_part *p2,
+ message_part_comparator_t *equals_ex) ATTR_NULL(1, 2, 3);
+
#endif