/* Returns a string containing the XML representation of this channel */ char * iio_channel_get_xml(const struct iio_channel *chn, size_t *length) { size_t len = sizeof("<channel id=\"\" name=\"\" " "type=\"output\" ></channel>") + strlen(chn->id) + (chn->name ? strlen(chn->name) : 0); char *ptr, *str, **attrs, *scan_element = NULL; size_t *attrs_len, scan_element_len = 0; unsigned int i; if (chn->is_scan_element) { scan_element = get_scan_element(chn, &scan_element_len); if (!scan_element) return NULL; else len += scan_element_len; } attrs_len = malloc(chn->nb_attrs * sizeof(*attrs_len)); if (!attrs_len) goto err_free_scan_element; attrs = malloc(chn->nb_attrs * sizeof(*attrs)); if (!attrs) goto err_free_attrs_len; for (i = 0; i < chn->nb_attrs; i++) { char *xml = get_attr_xml(&chn->attrs[i], &attrs_len[i]); if (!xml) goto err_free_attrs; attrs[i] = xml; len += attrs_len[i]; } str = malloc(len); if (!str) goto err_free_attrs; snprintf(str, len, "<channel id=\"%s\"", chn->id); ptr = strrchr(str, '\0'); if (chn->name) { sprintf(ptr, " name=\"%s\"", chn->name); ptr = strrchr(ptr, '\0'); } sprintf(ptr, " type=\"%s\" >", chn->is_output ? "output" : "input"); ptr = strrchr(ptr, '\0'); if (chn->is_scan_element) { strcpy(ptr, scan_element); ptr += scan_element_len; } for (i = 0; i < chn->nb_attrs; i++) { strcpy(ptr, attrs[i]); ptr += attrs_len[i]; free(attrs[i]); } free(scan_element); free(attrs); free(attrs_len); strcpy(ptr, "</channel>"); *length = ptr - str + sizeof("</channel>") - 1; return str; err_free_attrs: while (i--) free(attrs[i]); free(attrs); err_free_attrs_len: free(attrs_len); err_free_scan_element: if (chn->is_scan_element) free(scan_element); return NULL; }
/* Returns a string containing the XML representation of this device */ char * iio_device_get_xml(const struct iio_device *dev, size_t *length) { size_t len = sizeof("<device id=\"\" name=\"\" ></device>") + strlen(dev->id) + (dev->name ? strlen(dev->name) : 0); char *ptr, *str, **attrs, **channels, **debug_attrs; size_t *attrs_len, *channels_len, *debug_attrs_len; unsigned int i, j, k; attrs_len = malloc(dev->nb_attrs * sizeof(*attrs_len)); if (!attrs_len) return NULL; attrs = malloc(dev->nb_attrs * sizeof(*attrs)); if (!attrs) goto err_free_attrs_len; for (i = 0; i < dev->nb_attrs; i++) { char *xml = get_attr_xml(dev->attrs[i], &attrs_len[i], false); if (!xml) goto err_free_attrs; attrs[i] = xml; len += attrs_len[i]; } channels_len = malloc(dev->nb_channels * sizeof(*channels_len)); if (!channels_len) goto err_free_attrs; channels = malloc(dev->nb_channels * sizeof(*channels)); if (!channels) goto err_free_channels_len; for (j = 0; j < dev->nb_channels; j++) { char *xml = iio_channel_get_xml(dev->channels[j], &channels_len[j]); if (!xml) goto err_free_channels; channels[j] = xml; len += channels_len[j]; } debug_attrs_len = malloc(dev->nb_debug_attrs * sizeof(*debug_attrs_len)); if (!debug_attrs_len) goto err_free_channels; debug_attrs = malloc(dev->nb_debug_attrs * sizeof(*debug_attrs)); if (!debug_attrs) goto err_free_debug_attrs_len; for (k = 0; k < dev->nb_debug_attrs; k++) { char *xml = get_attr_xml(dev->debug_attrs[k], &debug_attrs_len[k], true); if (!xml) goto err_free_debug_attrs; debug_attrs[k] = xml; len += debug_attrs_len[k]; } str = malloc(len); if (!str) goto err_free_debug_attrs; snprintf(str, len, "<device id=\"%s\"", dev->id); ptr = strrchr(str, '\0'); if (dev->name) { sprintf(ptr, " name=\"%s\"", dev->name); ptr = strrchr(ptr, '\0'); } strcpy(ptr, " >"); ptr += 2; for (i = 0; i < dev->nb_channels; i++) { strcpy(ptr, channels[i]); ptr += channels_len[i]; free(channels[i]); } free(channels); free(channels_len); for (i = 0; i < dev->nb_attrs; i++) { strcpy(ptr, attrs[i]); ptr += attrs_len[i]; free(attrs[i]); } free(attrs); free(attrs_len); for (i = 0; i < dev->nb_debug_attrs; i++) { strcpy(ptr, debug_attrs[i]); ptr += debug_attrs_len[i]; free(debug_attrs[i]); } free(debug_attrs); free(debug_attrs_len); strcpy(ptr, "</device>"); *length = ptr - str + sizeof("</device>") - 1; return str; err_free_debug_attrs: while (k--) free(debug_attrs[k]); free(debug_attrs); err_free_debug_attrs_len: free(debug_attrs_len); err_free_channels: while (j--) free(channels[j]); free(channels); err_free_channels_len: free(channels_len); err_free_attrs: while (i--) free(attrs[i]); free(attrs); err_free_attrs_len: free(attrs_len); return NULL; }