]> sigrok.org Git - libsigrok.git/blobdiff - src/device.c
output/csv: use intermediate time_t var, silence compiler warning
[libsigrok.git] / src / device.c
index e7be567d20ad705ffdd3da315198e37494d2684b..5c681378fab01a99a33befa74dc0df3754e0a1ae 100644 (file)
@@ -62,12 +62,12 @@ SR_PRIV struct sr_channel *sr_channel_new(struct sr_dev_inst *sdi,
 {
        struct sr_channel *ch;
 
-       ch = g_malloc0(sizeof(struct sr_channel));
+       ch = g_malloc0(sizeof(*ch));
        ch->sdi = sdi;
        ch->index = index;
        ch->type = type;
        ch->enabled = enabled;
-       if (name)
+       if (name && *name)
                ch->name = g_strdup(name);
 
        sdi->channels = g_slist_append(sdi->channels, ch);
@@ -92,7 +92,9 @@ SR_PRIV void sr_channel_free(struct sr_channel *ch)
 }
 
 /**
- * Wrapper around @ref sr_channel_free(), suitable for glib iterators.
+ * Wrapper around sr_channel_free(), suitable for glib iterators.
+ *
+ * @private
  */
 SR_PRIV void sr_channel_free_cb(void *p)
 {
@@ -118,6 +120,8 @@ SR_API int sr_dev_channel_name_set(struct sr_channel *channel,
 {
        if (!channel)
                return SR_ERR_ARG;
+       if (!name || !*name)
+               return SR_ERR_ARG;
 
        g_free(channel->name);
        channel->name = g_strdup(name);
@@ -201,9 +205,9 @@ SR_PRIV struct sr_channel *sr_next_enabled_channel(const struct sr_dev_inst *sdi
  * @param[in] ch1 First channel.
  * @param[in] ch2 Second channel.
  *
- * @return #TRUE upon differences or unexpected input, #FALSE otherwise.
+ * @return TRUE upon differences or unexpected input, FALSE otherwise.
  *
- * @internal
+ * @private
  */
 SR_PRIV gboolean sr_channels_differ(struct sr_channel *ch1, struct sr_channel *ch2)
 {
@@ -227,9 +231,9 @@ SR_PRIV gboolean sr_channels_differ(struct sr_channel *ch1, struct sr_channel *c
  * @param[in] l1 First channel list.
  * @param[in] l2 Second channel list.
  *
- * @return #TRUE upon differences or unexpected input, #FALSE otherwise.
+ * @return TRUE upon differences or unexpected input, FALSE otherwise.
  *
- * @internal
+ * @private
  */
 SR_PRIV gboolean sr_channel_lists_differ(GSList *l1, GSList *l2)
 {
@@ -253,6 +257,62 @@ SR_PRIV gboolean sr_channel_lists_differ(GSList *l1, GSList *l2)
        return FALSE;
 }
 
+/**
+ * Allocate and initialize a new channel group, and add it to sdi.
+ *
+ * @param[in] sdi The device instance the channel group is connected to.
+ *                Optional, can be NULL.
+ * @param[in] name @copydoc sr_channel_group::name
+ * @param[in] priv @copydoc sr_channel_group::priv
+ *
+ * @return A pointer to a new struct sr_channel_group, NULL upon error.
+ *
+ * @private
+ */
+SR_PRIV struct sr_channel_group *sr_channel_group_new(struct sr_dev_inst *sdi,
+       const char *name, void *priv)
+{
+       struct sr_channel_group *cg;
+
+       cg = g_malloc0(sizeof(*cg));
+       if (name && *name)
+               cg->name = g_strdup(name);
+       cg->priv = priv;
+
+       if (sdi)
+               sdi->channel_groups = g_slist_append(sdi->channel_groups, cg);
+
+       return cg;
+}
+
+/**
+ * Release a previously allocated struct sr_channel_group.
+ *
+ * @param[in] cg Pointer to struct sr_channel_group.
+ *
+ * @private
+ */
+SR_PRIV void sr_channel_group_free(struct sr_channel_group *cg)
+{
+       if (!cg)
+               return;
+
+       g_free(cg->name);
+       g_slist_free(cg->channels);
+       g_free(cg->priv);
+       g_free(cg);
+}
+
+/**
+ * Wrapper around sr_channel_group_free(), suitable for glib iterators.
+ *
+ * @private
+ */
+SR_PRIV void sr_channel_group_free_cb(void *cg)
+{
+       return sr_channel_group_free(cg);
+}
+
 /**
  * Determine whether the specified device instance has the specified
  * capability.
@@ -405,7 +465,7 @@ SR_API struct sr_dev_inst *sr_dev_inst_user_new(const char *vendor,
 {
        struct sr_dev_inst *sdi;
 
-       sdi = g_malloc0(sizeof(struct sr_dev_inst));
+       sdi = g_malloc0(sizeof(*sdi));
 
        sdi->vendor = g_strdup(vendor);
        sdi->model = g_strdup(model);
@@ -418,6 +478,7 @@ SR_API struct sr_dev_inst *sr_dev_inst_user_new(const char *vendor,
 /**
  * Add a new channel to the specified device instance.
  *
+ * @param[in] sdi Device instance to use. Must not be NULL.
  * @param[in] index @copydoc sr_channel::index
  * @param[in] type @copydoc sr_channel::type
  * @param[in] name @copydoc sr_channel::name
@@ -430,7 +491,8 @@ SR_API int sr_dev_inst_channel_add(struct sr_dev_inst *sdi, int index, int type,
        if (!sdi || sdi->inst_type != SR_INST_USER || index < 0)
                return SR_ERR_ARG;
 
-       sr_channel_new(sdi, index, type, TRUE, name);
+       if (!sr_channel_new(sdi, index, type, TRUE, name))
+               return SR_ERR_DATA;
 
        return SR_OK;
 }
@@ -445,7 +507,6 @@ SR_API int sr_dev_inst_channel_add(struct sr_dev_inst *sdi, int index, int type,
 SR_PRIV void sr_dev_inst_free(struct sr_dev_inst *sdi)
 {
        struct sr_channel *ch;
-       struct sr_channel_group *cg;
        GSList *l;
 
        if (!sdi)
@@ -456,15 +517,7 @@ SR_PRIV void sr_dev_inst_free(struct sr_dev_inst *sdi)
                sr_channel_free(ch);
        }
        g_slist_free(sdi->channels);
-
-       for (l = sdi->channel_groups; l; l = l->next) {
-               cg = l->data;
-               g_free(cg->name);
-               g_slist_free(cg->channels);
-               g_free(cg->priv);
-               g_free(cg);
-       }
-       g_slist_free(sdi->channel_groups);
+       g_slist_free_full(sdi->channel_groups, sr_channel_group_free_cb);
 
        if (sdi->session)
                sr_session_dev_remove(sdi->session, sdi);
@@ -495,7 +548,7 @@ SR_PRIV struct sr_usb_dev_inst *sr_usb_dev_inst_new(uint8_t bus,
 {
        struct sr_usb_dev_inst *udi;
 
-       udi = g_malloc0(sizeof(struct sr_usb_dev_inst));
+       udi = g_malloc0(sizeof(*udi));
        udi->bus = bus;
        udi->address = address;
        udi->devhdl = hdl;
@@ -516,9 +569,18 @@ SR_PRIV void sr_usb_dev_inst_free(struct sr_usb_dev_inst *usb)
        g_free(usb);
 }
 
+/**
+ * Wrapper for g_slist_free_full() convenience.
+ *
+ * @private
+ */
+SR_PRIV void sr_usb_dev_inst_free_cb(gpointer p)
+{
+       sr_usb_dev_inst_free(p);
+}
 #endif
 
-#ifdef HAVE_LIBSERIALPORT
+#ifdef HAVE_SERIAL_COMM
 
 /**
  * Allocate and init a struct for a serial device instance.
@@ -544,7 +606,7 @@ SR_PRIV struct sr_serial_dev_inst *sr_serial_dev_inst_new(const char *port,
 {
        struct sr_serial_dev_inst *serial;
 
-       serial = g_malloc0(sizeof(struct sr_serial_dev_inst));
+       serial = g_malloc0(sizeof(*serial));
        serial->port = g_strdup(port);
        if (serialcomm)
                serial->serialcomm = g_strdup(serialcomm);
@@ -576,7 +638,7 @@ SR_PRIV struct sr_usbtmc_dev_inst *sr_usbtmc_dev_inst_new(const char *device)
 {
        struct sr_usbtmc_dev_inst *usbtmc;
 
-       usbtmc = g_malloc0(sizeof(struct sr_usbtmc_dev_inst));
+       usbtmc = g_malloc0(sizeof(*usbtmc));
        usbtmc->device = g_strdup(device);
        usbtmc->fd = -1;
 
@@ -814,7 +876,7 @@ SR_API const char *sr_dev_inst_connid_get(const struct sr_dev_inst *sdi)
        struct libusb_device **devlist;
 #endif
 
-#ifdef HAVE_LIBSERIALPORT
+#ifdef HAVE_SERIAL_COMM
        struct sr_serial_dev_inst *serial;
 #endif
 
@@ -824,7 +886,7 @@ SR_API const char *sr_dev_inst_connid_get(const struct sr_dev_inst *sdi)
        if (!sdi)
                return NULL;
 
-#ifdef HAVE_LIBSERIALPORT
+#ifdef HAVE_SERIAL_COMM
        if ((!sdi->connection_id) && (sdi->inst_type == SR_INST_SERIAL)) {
                /* connection_id isn't populated, let's do that for serial devices. */