Paul Cercueil / libiio

Dependencies:   libserialport libxml2

Committer:
pcercuei
Date:
Thu Aug 25 15:54:09 2016 +0000
Revision:
0:df031b60ca29
Child:
2:9eb0a9a1f958
Add first version of libiio, from upsteam commit 775b9f6 unmodified.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
pcercuei 0:df031b60ca29 1 /*
pcercuei 0:df031b60ca29 2 * libiio - Library for interfacing industrial I/O (IIO) devices
pcercuei 0:df031b60ca29 3 *
pcercuei 0:df031b60ca29 4 * Copyright (C) 2014 Analog Devices, Inc.
pcercuei 0:df031b60ca29 5 * Author: Paul Cercueil <paul.cercueil@analog.com>
pcercuei 0:df031b60ca29 6 *
pcercuei 0:df031b60ca29 7 * This library is free software; you can redistribute it and/or
pcercuei 0:df031b60ca29 8 * modify it under the terms of the GNU Lesser General Public
pcercuei 0:df031b60ca29 9 * License as published by the Free Software Foundation; either
pcercuei 0:df031b60ca29 10 * version 2.1 of the License, or (at your option) any later version.
pcercuei 0:df031b60ca29 11 *
pcercuei 0:df031b60ca29 12 * This library is distributed in the hope that it will be useful,
pcercuei 0:df031b60ca29 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
pcercuei 0:df031b60ca29 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
pcercuei 0:df031b60ca29 15 * Lesser General Public License for more details.
pcercuei 0:df031b60ca29 16 *
pcercuei 0:df031b60ca29 17 * */
pcercuei 0:df031b60ca29 18
pcercuei 0:df031b60ca29 19 #include "debug.h"
pcercuei 0:df031b60ca29 20 #include "iio-config.h"
pcercuei 0:df031b60ca29 21 #include "iio-errno.h"
pcercuei 0:df031b60ca29 22 #include "iio-private.h"
pcercuei 0:df031b60ca29 23
pcercuei 0:df031b60ca29 24 #include <string.h>
pcercuei 0:df031b60ca29 25
pcercuei 0:df031b60ca29 26 #ifdef _WIN32
pcercuei 0:df031b60ca29 27 #define LOCAL_BACKEND 0
pcercuei 0:df031b60ca29 28 #define NETWORK_BACKEND 1
pcercuei 0:df031b60ca29 29 #endif
pcercuei 0:df031b60ca29 30
pcercuei 0:df031b60ca29 31 static const char xml_header[] = "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
pcercuei 0:df031b60ca29 32 "<!DOCTYPE context ["
pcercuei 0:df031b60ca29 33 "<!ELEMENT context (device)*>"
pcercuei 0:df031b60ca29 34 "<!ELEMENT device (channel | attribute | debug-attribute)*>"
pcercuei 0:df031b60ca29 35 "<!ELEMENT channel (scan-element?, attribute*)>"
pcercuei 0:df031b60ca29 36 "<!ELEMENT attribute EMPTY>"
pcercuei 0:df031b60ca29 37 "<!ELEMENT scan-element EMPTY>"
pcercuei 0:df031b60ca29 38 "<!ELEMENT debug-attribute EMPTY>"
pcercuei 0:df031b60ca29 39 "<!ATTLIST context name CDATA #REQUIRED description CDATA #IMPLIED>"
pcercuei 0:df031b60ca29 40 "<!ATTLIST device id CDATA #REQUIRED name CDATA #IMPLIED>"
pcercuei 0:df031b60ca29 41 "<!ATTLIST channel id CDATA #REQUIRED type (input|output) #REQUIRED name CDATA #IMPLIED>"
pcercuei 0:df031b60ca29 42 "<!ATTLIST scan-element index CDATA #REQUIRED format CDATA #REQUIRED scale CDATA #IMPLIED>"
pcercuei 0:df031b60ca29 43 "<!ATTLIST attribute name CDATA #REQUIRED filename CDATA #IMPLIED>"
pcercuei 0:df031b60ca29 44 "<!ATTLIST debug-attribute name CDATA #REQUIRED>"
pcercuei 0:df031b60ca29 45 "]>";
pcercuei 0:df031b60ca29 46
pcercuei 0:df031b60ca29 47 /* Returns a string containing the XML representation of this context */
pcercuei 0:df031b60ca29 48 char * iio_context_create_xml(const struct iio_context *ctx)
pcercuei 0:df031b60ca29 49 {
pcercuei 0:df031b60ca29 50 size_t len, *devices_len;
pcercuei 0:df031b60ca29 51 char *str, *ptr, **devices;
pcercuei 0:df031b60ca29 52 unsigned int i;
pcercuei 0:df031b60ca29 53
pcercuei 0:df031b60ca29 54 len = strlen(ctx->name) + sizeof(xml_header) - 1 +
pcercuei 0:df031b60ca29 55 sizeof("<context name=\"\" ></context>");
pcercuei 0:df031b60ca29 56 if (ctx->description)
pcercuei 0:df031b60ca29 57 len += strlen(ctx->description) +
pcercuei 0:df031b60ca29 58 sizeof(" description=\"\"") - 1;
pcercuei 0:df031b60ca29 59
pcercuei 0:df031b60ca29 60 if (!ctx->nb_devices) {
pcercuei 0:df031b60ca29 61 str = malloc(len);
pcercuei 0:df031b60ca29 62 if (!str) {
pcercuei 0:df031b60ca29 63 errno = ENOMEM;
pcercuei 0:df031b60ca29 64 return NULL;
pcercuei 0:df031b60ca29 65 }
pcercuei 0:df031b60ca29 66
pcercuei 0:df031b60ca29 67 if (ctx->description)
pcercuei 0:df031b60ca29 68 snprintf(str, len, "%s<context name=\"%s\" "
pcercuei 0:df031b60ca29 69 "description=\"%s\" ></context>",
pcercuei 0:df031b60ca29 70 xml_header, ctx->name,
pcercuei 0:df031b60ca29 71 ctx->description);
pcercuei 0:df031b60ca29 72 else
pcercuei 0:df031b60ca29 73 snprintf(str, len, "%s<context name=\"%s\" ></context>",
pcercuei 0:df031b60ca29 74 xml_header, ctx->name);
pcercuei 0:df031b60ca29 75 return str;
pcercuei 0:df031b60ca29 76 }
pcercuei 0:df031b60ca29 77
pcercuei 0:df031b60ca29 78 devices_len = malloc(ctx->nb_devices * sizeof(*devices_len));
pcercuei 0:df031b60ca29 79 if (!devices_len) {
pcercuei 0:df031b60ca29 80 errno = ENOMEM;
pcercuei 0:df031b60ca29 81 return NULL;
pcercuei 0:df031b60ca29 82 }
pcercuei 0:df031b60ca29 83
pcercuei 0:df031b60ca29 84 devices = malloc(ctx->nb_devices * sizeof(*devices));
pcercuei 0:df031b60ca29 85 if (!devices)
pcercuei 0:df031b60ca29 86 goto err_free_devices_len;
pcercuei 0:df031b60ca29 87
pcercuei 0:df031b60ca29 88 for (i = 0; i < ctx->nb_devices; i++) {
pcercuei 0:df031b60ca29 89 char *xml = iio_device_get_xml(ctx->devices[i],
pcercuei 0:df031b60ca29 90 &devices_len[i]);
pcercuei 0:df031b60ca29 91 if (!xml)
pcercuei 0:df031b60ca29 92 goto err_free_devices;
pcercuei 0:df031b60ca29 93 devices[i] = xml;
pcercuei 0:df031b60ca29 94 len += devices_len[i];
pcercuei 0:df031b60ca29 95 }
pcercuei 0:df031b60ca29 96
pcercuei 0:df031b60ca29 97 str = malloc(len);
pcercuei 0:df031b60ca29 98 if (!str) {
pcercuei 0:df031b60ca29 99 errno = ENOMEM;
pcercuei 0:df031b60ca29 100 goto err_free_devices;
pcercuei 0:df031b60ca29 101 }
pcercuei 0:df031b60ca29 102
pcercuei 0:df031b60ca29 103 if (ctx->description)
pcercuei 0:df031b60ca29 104 snprintf(str, len, "%s<context name=\"%s\" "
pcercuei 0:df031b60ca29 105 "description=\"%s\" >",
pcercuei 0:df031b60ca29 106 xml_header, ctx->name, ctx->description);
pcercuei 0:df031b60ca29 107 else
pcercuei 0:df031b60ca29 108 snprintf(str, len, "%s<context name=\"%s\" >",
pcercuei 0:df031b60ca29 109 xml_header, ctx->name);
pcercuei 0:df031b60ca29 110 ptr = strrchr(str, '\0');
pcercuei 0:df031b60ca29 111
pcercuei 0:df031b60ca29 112 for (i = 0; i < ctx->nb_devices; i++) {
pcercuei 0:df031b60ca29 113 strcpy(ptr, devices[i]);
pcercuei 0:df031b60ca29 114 ptr += devices_len[i];
pcercuei 0:df031b60ca29 115 free(devices[i]);
pcercuei 0:df031b60ca29 116 }
pcercuei 0:df031b60ca29 117
pcercuei 0:df031b60ca29 118 free(devices);
pcercuei 0:df031b60ca29 119 free(devices_len);
pcercuei 0:df031b60ca29 120 strcpy(ptr, "</context>");
pcercuei 0:df031b60ca29 121 return str;
pcercuei 0:df031b60ca29 122
pcercuei 0:df031b60ca29 123 err_free_devices:
pcercuei 0:df031b60ca29 124 while (i--)
pcercuei 0:df031b60ca29 125 free(devices[i]);
pcercuei 0:df031b60ca29 126 free(devices);
pcercuei 0:df031b60ca29 127 err_free_devices_len:
pcercuei 0:df031b60ca29 128 free(devices_len);
pcercuei 0:df031b60ca29 129 return NULL;
pcercuei 0:df031b60ca29 130 }
pcercuei 0:df031b60ca29 131
pcercuei 0:df031b60ca29 132 const char * iio_context_get_xml(const struct iio_context *ctx)
pcercuei 0:df031b60ca29 133 {
pcercuei 0:df031b60ca29 134 return ctx->xml;
pcercuei 0:df031b60ca29 135 }
pcercuei 0:df031b60ca29 136
pcercuei 0:df031b60ca29 137 const char * iio_context_get_name(const struct iio_context *ctx)
pcercuei 0:df031b60ca29 138 {
pcercuei 0:df031b60ca29 139 return ctx->name;
pcercuei 0:df031b60ca29 140 }
pcercuei 0:df031b60ca29 141
pcercuei 0:df031b60ca29 142 const char * iio_context_get_description(const struct iio_context *ctx)
pcercuei 0:df031b60ca29 143 {
pcercuei 0:df031b60ca29 144 if (ctx->description)
pcercuei 0:df031b60ca29 145 return ctx->description;
pcercuei 0:df031b60ca29 146 else
pcercuei 0:df031b60ca29 147 return "";
pcercuei 0:df031b60ca29 148 }
pcercuei 0:df031b60ca29 149
pcercuei 0:df031b60ca29 150 void iio_context_destroy(struct iio_context *ctx)
pcercuei 0:df031b60ca29 151 {
pcercuei 0:df031b60ca29 152 unsigned int i;
pcercuei 0:df031b60ca29 153 if (ctx->ops->shutdown)
pcercuei 0:df031b60ca29 154 ctx->ops->shutdown(ctx);
pcercuei 0:df031b60ca29 155
pcercuei 0:df031b60ca29 156 for (i = 0; i < ctx->nb_devices; i++)
pcercuei 0:df031b60ca29 157 free_device(ctx->devices[i]);
pcercuei 0:df031b60ca29 158 if (ctx->nb_devices)
pcercuei 0:df031b60ca29 159 free(ctx->devices);
pcercuei 0:df031b60ca29 160 if (ctx->xml)
pcercuei 0:df031b60ca29 161 free(ctx->xml);
pcercuei 0:df031b60ca29 162 if (ctx->description)
pcercuei 0:df031b60ca29 163 free(ctx->description);
pcercuei 0:df031b60ca29 164 free(ctx);
pcercuei 0:df031b60ca29 165 }
pcercuei 0:df031b60ca29 166
pcercuei 0:df031b60ca29 167 unsigned int iio_context_get_devices_count(const struct iio_context *ctx)
pcercuei 0:df031b60ca29 168 {
pcercuei 0:df031b60ca29 169 return ctx->nb_devices;
pcercuei 0:df031b60ca29 170 }
pcercuei 0:df031b60ca29 171
pcercuei 0:df031b60ca29 172 struct iio_device * iio_context_get_device(const struct iio_context *ctx,
pcercuei 0:df031b60ca29 173 unsigned int index)
pcercuei 0:df031b60ca29 174 {
pcercuei 0:df031b60ca29 175 if (index >= ctx->nb_devices)
pcercuei 0:df031b60ca29 176 return NULL;
pcercuei 0:df031b60ca29 177 else
pcercuei 0:df031b60ca29 178 return ctx->devices[index];
pcercuei 0:df031b60ca29 179 }
pcercuei 0:df031b60ca29 180
pcercuei 0:df031b60ca29 181 struct iio_device * iio_context_find_device(const struct iio_context *ctx,
pcercuei 0:df031b60ca29 182 const char *name)
pcercuei 0:df031b60ca29 183 {
pcercuei 0:df031b60ca29 184 unsigned int i;
pcercuei 0:df031b60ca29 185 for (i = 0; i < ctx->nb_devices; i++) {
pcercuei 0:df031b60ca29 186 struct iio_device *dev = ctx->devices[i];
pcercuei 0:df031b60ca29 187 if (!strcmp(dev->id, name) ||
pcercuei 0:df031b60ca29 188 (dev->name && !strcmp(dev->name, name)))
pcercuei 0:df031b60ca29 189 return dev;
pcercuei 0:df031b60ca29 190 }
pcercuei 0:df031b60ca29 191 return NULL;
pcercuei 0:df031b60ca29 192 }
pcercuei 0:df031b60ca29 193
pcercuei 0:df031b60ca29 194 static void reorder_channels(struct iio_device *dev)
pcercuei 0:df031b60ca29 195 {
pcercuei 0:df031b60ca29 196 bool found;
pcercuei 0:df031b60ca29 197 unsigned int i;
pcercuei 0:df031b60ca29 198
pcercuei 0:df031b60ca29 199 /* Reorder channels by index */
pcercuei 0:df031b60ca29 200 do {
pcercuei 0:df031b60ca29 201 found = false;
pcercuei 0:df031b60ca29 202 for (i = 1; i < dev->nb_channels; i++) {
pcercuei 0:df031b60ca29 203 struct iio_channel **channels = dev->channels;
pcercuei 0:df031b60ca29 204 long ch1 = channels[i - 1]->index;
pcercuei 0:df031b60ca29 205 long ch2 = channels[i]->index;
pcercuei 0:df031b60ca29 206
pcercuei 0:df031b60ca29 207 if (ch1 == ch2 && ch1 >= 0) {
pcercuei 0:df031b60ca29 208 ch1 = channels[i - 1]->format.shift;
pcercuei 0:df031b60ca29 209 ch2 = channels[i]->format.shift;
pcercuei 0:df031b60ca29 210 }
pcercuei 0:df031b60ca29 211
pcercuei 0:df031b60ca29 212 if (ch2 >= 0 && ((ch1 > ch2) || ch1 < 0)) {
pcercuei 0:df031b60ca29 213 struct iio_channel *bak = channels[i];
pcercuei 0:df031b60ca29 214 channels[i] = channels[i - 1];
pcercuei 0:df031b60ca29 215 channels[i - 1] = bak;
pcercuei 0:df031b60ca29 216 found = true;
pcercuei 0:df031b60ca29 217 }
pcercuei 0:df031b60ca29 218 }
pcercuei 0:df031b60ca29 219 } while (found);
pcercuei 0:df031b60ca29 220 }
pcercuei 0:df031b60ca29 221
pcercuei 0:df031b60ca29 222 int iio_context_init(struct iio_context *ctx)
pcercuei 0:df031b60ca29 223 {
pcercuei 0:df031b60ca29 224 unsigned int i;
pcercuei 0:df031b60ca29 225
pcercuei 0:df031b60ca29 226 for (i = 0; i < ctx->nb_devices; i++)
pcercuei 0:df031b60ca29 227 reorder_channels(ctx->devices[i]);
pcercuei 0:df031b60ca29 228
pcercuei 0:df031b60ca29 229 if (!ctx->xml) {
pcercuei 0:df031b60ca29 230 ctx->xml = iio_context_create_xml(ctx);
pcercuei 0:df031b60ca29 231 if (!ctx->xml)
pcercuei 0:df031b60ca29 232 return -ENOMEM;
pcercuei 0:df031b60ca29 233 }
pcercuei 0:df031b60ca29 234
pcercuei 0:df031b60ca29 235 return 0;
pcercuei 0:df031b60ca29 236 }
pcercuei 0:df031b60ca29 237
pcercuei 0:df031b60ca29 238 int iio_context_get_version(const struct iio_context *ctx,
pcercuei 0:df031b60ca29 239 unsigned int *major, unsigned int *minor, char git_tag[8])
pcercuei 0:df031b60ca29 240 {
pcercuei 0:df031b60ca29 241 if (ctx->ops->get_version)
pcercuei 0:df031b60ca29 242 return ctx->ops->get_version(ctx, major, minor, git_tag);
pcercuei 0:df031b60ca29 243
pcercuei 0:df031b60ca29 244 iio_library_get_version(major, minor, git_tag);
pcercuei 0:df031b60ca29 245 return 0;
pcercuei 0:df031b60ca29 246 }
pcercuei 0:df031b60ca29 247
pcercuei 0:df031b60ca29 248 int iio_context_set_timeout(struct iio_context *ctx, unsigned int timeout)
pcercuei 0:df031b60ca29 249 {
pcercuei 0:df031b60ca29 250 if (ctx->ops->set_timeout)
pcercuei 0:df031b60ca29 251 return ctx->ops->set_timeout(ctx, timeout);
pcercuei 0:df031b60ca29 252 else
pcercuei 0:df031b60ca29 253 return -ENOSYS;
pcercuei 0:df031b60ca29 254 }
pcercuei 0:df031b60ca29 255
pcercuei 0:df031b60ca29 256 struct iio_context * iio_context_clone(const struct iio_context *ctx)
pcercuei 0:df031b60ca29 257 {
pcercuei 0:df031b60ca29 258 if (ctx->ops->clone) {
pcercuei 0:df031b60ca29 259 return ctx->ops->clone(ctx);
pcercuei 0:df031b60ca29 260 } else {
pcercuei 0:df031b60ca29 261 errno = ENOSYS;
pcercuei 0:df031b60ca29 262 return NULL;
pcercuei 0:df031b60ca29 263 }
pcercuei 0:df031b60ca29 264 }
pcercuei 0:df031b60ca29 265
pcercuei 0:df031b60ca29 266 struct iio_context * iio_create_context_from_uri(const char *uri)
pcercuei 0:df031b60ca29 267 {
pcercuei 0:df031b60ca29 268 #ifdef WITH_LOCAL_BACKEND
pcercuei 0:df031b60ca29 269 if (strcmp(uri, "local:") == 0) /* No address part */
pcercuei 0:df031b60ca29 270 return iio_create_local_context();
pcercuei 0:df031b60ca29 271 #endif
pcercuei 0:df031b60ca29 272
pcercuei 0:df031b60ca29 273 #ifdef WITH_XML_BACKEND
pcercuei 0:df031b60ca29 274 if (strncmp(uri, "xml:", sizeof("xml:") - 1) == 0)
pcercuei 0:df031b60ca29 275 return iio_create_xml_context(uri + sizeof("xml:") - 1);
pcercuei 0:df031b60ca29 276 #endif
pcercuei 0:df031b60ca29 277
pcercuei 0:df031b60ca29 278 #ifdef WITH_NETWORK_BACKEND
pcercuei 0:df031b60ca29 279 if (strncmp(uri, "ip:", sizeof("ip:") - 1) == 0)
pcercuei 0:df031b60ca29 280 return iio_create_network_context(uri+3);
pcercuei 0:df031b60ca29 281 #endif
pcercuei 0:df031b60ca29 282
pcercuei 0:df031b60ca29 283 #ifdef WITH_USB_BACKEND
pcercuei 0:df031b60ca29 284 if (strncmp(uri, "usb:", sizeof("usb:") - 1) == 0)
pcercuei 0:df031b60ca29 285 return usb_create_context_from_uri(uri);
pcercuei 0:df031b60ca29 286 #endif
pcercuei 0:df031b60ca29 287
pcercuei 0:df031b60ca29 288 #ifdef WITH_SERIAL_BACKEND
pcercuei 0:df031b60ca29 289 if (strncmp(uri, "serial:", sizeof("serial:") - 1) == 0)
pcercuei 0:df031b60ca29 290 return serial_create_context_from_uri(uri);
pcercuei 0:df031b60ca29 291 #endif
pcercuei 0:df031b60ca29 292
pcercuei 0:df031b60ca29 293 errno = ENOSYS;
pcercuei 0:df031b60ca29 294 return NULL;
pcercuei 0:df031b60ca29 295 }
pcercuei 0:df031b60ca29 296
pcercuei 0:df031b60ca29 297 struct iio_context * iio_create_default_context(void)
pcercuei 0:df031b60ca29 298 {
pcercuei 0:df031b60ca29 299 char *hostname = getenv("IIOD_REMOTE");
pcercuei 0:df031b60ca29 300
pcercuei 0:df031b60ca29 301 if (hostname) {
pcercuei 0:df031b60ca29 302 struct iio_context *ctx;
pcercuei 0:df031b60ca29 303
pcercuei 0:df031b60ca29 304 ctx = iio_create_context_from_uri(hostname);
pcercuei 0:df031b60ca29 305 if (ctx)
pcercuei 0:df031b60ca29 306 return ctx;
pcercuei 0:df031b60ca29 307
pcercuei 0:df031b60ca29 308 #ifdef WITH_NETWORK_BACKEND
pcercuei 0:df031b60ca29 309 /* If the environment variable is an empty string, we will
pcercuei 0:df031b60ca29 310 * discover the server using ZeroConf */
pcercuei 0:df031b60ca29 311 if (strlen(hostname) == 0)
pcercuei 0:df031b60ca29 312 hostname = NULL;
pcercuei 0:df031b60ca29 313
pcercuei 0:df031b60ca29 314 return iio_create_network_context(hostname);
pcercuei 0:df031b60ca29 315 #endif
pcercuei 0:df031b60ca29 316 }
pcercuei 0:df031b60ca29 317
pcercuei 0:df031b60ca29 318 return iio_create_local_context();
pcercuei 0:df031b60ca29 319 }
pcercuei 0:df031b60ca29 320
pcercuei 0:df031b60ca29 321 struct iio_context * iio_create_local_context(void)
pcercuei 0:df031b60ca29 322 {
pcercuei 0:df031b60ca29 323 #ifdef WITH_LOCAL_BACKEND
pcercuei 0:df031b60ca29 324 return local_create_context();
pcercuei 0:df031b60ca29 325 #else
pcercuei 0:df031b60ca29 326 errno = ENOSYS;
pcercuei 0:df031b60ca29 327 return NULL;
pcercuei 0:df031b60ca29 328 #endif
pcercuei 0:df031b60ca29 329 }
pcercuei 0:df031b60ca29 330
pcercuei 0:df031b60ca29 331 struct iio_context * iio_create_network_context(const char *hostname)
pcercuei 0:df031b60ca29 332 {
pcercuei 0:df031b60ca29 333 #ifdef WITH_NETWORK_BACKEND
pcercuei 0:df031b60ca29 334 return network_create_context(hostname);
pcercuei 0:df031b60ca29 335 #else
pcercuei 0:df031b60ca29 336 errno = ENOSYS;
pcercuei 0:df031b60ca29 337 return NULL;
pcercuei 0:df031b60ca29 338 #endif
pcercuei 0:df031b60ca29 339 }
pcercuei 0:df031b60ca29 340
pcercuei 0:df031b60ca29 341 struct iio_context * iio_create_xml_context_mem(const char *xml, size_t len)
pcercuei 0:df031b60ca29 342 {
pcercuei 0:df031b60ca29 343 #ifdef WITH_XML_BACKEND
pcercuei 0:df031b60ca29 344 return xml_create_context_mem(xml, len);
pcercuei 0:df031b60ca29 345 #else
pcercuei 0:df031b60ca29 346 errno = ENOSYS;
pcercuei 0:df031b60ca29 347 return NULL;
pcercuei 0:df031b60ca29 348 #endif
pcercuei 0:df031b60ca29 349 }
pcercuei 0:df031b60ca29 350
pcercuei 0:df031b60ca29 351 struct iio_context * iio_create_xml_context(const char *xml_file)
pcercuei 0:df031b60ca29 352 {
pcercuei 0:df031b60ca29 353 #ifdef WITH_XML_BACKEND
pcercuei 0:df031b60ca29 354 return xml_create_context(xml_file);
pcercuei 0:df031b60ca29 355 #else
pcercuei 0:df031b60ca29 356 errno = ENOSYS;
pcercuei 0:df031b60ca29 357 return NULL;
pcercuei 0:df031b60ca29 358 #endif
pcercuei 0:df031b60ca29 359 }
pcercuei 0:df031b60ca29 360