X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fdevice.c;fp=src%2Fdevice.c;h=34d80a9dadf45771b3751c1ba1a5917aba034900;hb=712f981dffbcb19291e86f41d565bf4627f3a5f4;hp=dbbb2e26ac122e446f4c4c4efcf66e16260a5a2a;hpb=fe71c7e42ea442d7706c7dab4d98c2c9f1658537;p=libsigrok.git diff --git a/src/device.c b/src/device.c index dbbb2e26..34d80a9d 100644 --- a/src/device.c +++ b/src/device.c @@ -18,8 +18,9 @@ */ #include -#include #include +#include +#include #include #include "libsigrok-internal.h" @@ -188,6 +189,69 @@ SR_PRIV struct sr_channel *sr_next_enabled_channel(const struct sr_dev_inst *sdi return next_channel; } +/** + * Compare two channels, return whether they differ. + * + * The channels' names and types are checked. The enabled state is not + * considered a condition for difference. The test is motivated by the + * desire to detect changes in the configuration of acquisition setups + * between re-reads of an input file. + * + * @param[in] ch1 First channel. + * @param[in] ch2 Second channel. + * + * @return #TRUE upon differences or unexpected input, #FALSE otherwise. + * + * @internal + */ +SR_PRIV gboolean sr_channels_differ(struct sr_channel *ch1, struct sr_channel *ch2) +{ + if (!ch1 || !ch2) + return TRUE; + + if (ch1->type != ch2->type) + return TRUE; + if (strcmp(ch1->name, ch2->name)) + return TRUE; + + return FALSE; +} + +/** + * Compare two channel lists, return whether they differ. + * + * Listing the same set of channels but in a different order is considered + * a difference in the lists. + * + * @param[in] l1 First channel list. + * @param[in] l2 Second channel list. + * + * @return #TRUE upon differences or unexpected input, #FALSE otherwise. + * + * @internal + */ +SR_PRIV gboolean sr_channel_lists_differ(GSList *l1, GSList *l2) +{ + struct sr_channel *ch1, *ch2; + + while (l1 && l2) { + ch1 = l1->data; + ch2 = l2->data; + l1 = l1->next; + l2 = l2->next; + if (!ch1 || !ch2) + return TRUE; + if (sr_channels_differ(ch1, ch2)) + return TRUE; + if (ch1->index != ch2->index) + return TRUE; + } + if (l1 || l2) + return TRUE; + + return FALSE; +} + /** * Determine whether the specified device instance has the specified * capability.