X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Ftrigger.c;h=51d8368a11b3373110c758dc9a6b7f4864d04db3;hb=3b93d3c24bb21d1619d7098d7a87706a0bcf474a;hp=eab7a1c02e9701595e508ac0de05f887e8749e15;hpb=a445f8aa080d18964ac45f352f6e61022b0a12bd;p=libsigrok.git
diff --git a/src/trigger.c b/src/trigger.c
index eab7a1c0..51d8368a 100644
--- a/src/trigger.c
+++ b/src/trigger.c
@@ -17,13 +17,14 @@
* along with this program. If not, see .
*/
-#include "libsigrok.h"
+#include
+#include
#include "libsigrok-internal.h"
-/* * @cond PRIVATE */
+/** @cond PRIVATE */
#define LOG_PREFIX "trigger"
-/* * @endcond */
-
+/** @endcond */
+
/**
* @file
*
@@ -75,9 +76,14 @@ SR_API void sr_trigger_free(struct sr_trigger *trig)
struct sr_trigger_stage *stage;
GSList *l;
+ if (!trig)
+ return;
+
for (l = trig->stages; l; l = l->next) {
stage = l->data;
- g_slist_free_full(stage->matches, g_free);
+
+ if (stage->matches)
+ g_slist_free_full(stage->matches, g_free);
}
g_slist_free_full(trig->stages, g_free);
@@ -93,8 +99,9 @@ SR_API void sr_trigger_free(struct sr_trigger *trig)
*
* @param trig The trigger to add a stage to. Must not be NULL.
*
- * @return A newly allocated trigger stage (which has also been added to the
- * list of stages of the specified trigger).
+ * @retval NULL An invalid (NULL) trigger was passed into the function.
+ * @retval other A newly allocated trigger stage (which has also been added
+ * to the list of stages of the specified trigger).
*
* @since 0.4.0
*/
@@ -102,6 +109,9 @@ SR_API struct sr_trigger_stage *sr_trigger_stage_add(struct sr_trigger *trig)
{
struct sr_trigger_stage *stage;
+ if (!trig)
+ return NULL;
+
stage = g_malloc0(sizeof(struct sr_trigger_stage));
stage->stage = g_slist_length(trig->stages);
trig->stages = g_slist_append(trig->stages, stage);
@@ -133,6 +143,9 @@ SR_API int sr_trigger_match_add(struct sr_trigger_stage *stage,
{
struct sr_trigger_match *match;
+ if (!stage || !ch)
+ return SR_ERR_ARG;
+
if (ch->type == SR_CHANNEL_LOGIC) {
if (trigger_match != SR_TRIGGER_ZERO &&
trigger_match != SR_TRIGGER_ONE &&
@@ -143,12 +156,17 @@ SR_API int sr_trigger_match_add(struct sr_trigger_stage *stage,
return SR_ERR_ARG;
}
} else if (ch->type == SR_CHANNEL_ANALOG) {
- if (trigger_match != SR_TRIGGER_FALLING &&
+ if (trigger_match != SR_TRIGGER_RISING &&
+ trigger_match != SR_TRIGGER_FALLING &&
+ trigger_match != SR_TRIGGER_EDGE &&
trigger_match != SR_TRIGGER_OVER &&
trigger_match != SR_TRIGGER_UNDER) {
sr_err("Invalid trigger match for an analog channel.");
return SR_ERR_ARG;
}
+ } else {
+ sr_err("Unsupported channel type: %d.", ch->type);
+ return SR_ERR_ARG;
}
match = g_malloc0(sizeof(struct sr_trigger_match));