summaryrefslogtreecommitdiff
path: root/tests/iio_genxml.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/iio_genxml.c')
-rw-r--r--tests/iio_genxml.c145
1 files changed, 145 insertions, 0 deletions
diff --git a/tests/iio_genxml.c b/tests/iio_genxml.c
new file mode 100644
index 0000000..4a83c8c
--- /dev/null
+++ b/tests/iio_genxml.c
@@ -0,0 +1,145 @@
+/*
+ * libiio - Library for interfacing industrial I/O (IIO) devices
+ *
+ * Copyright (C) 2014 Analog Devices, Inc.
+ * Author: Paul Cercueil <paul.cercueil@analog.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * */
+
+#include <getopt.h>
+#include <iio.h>
+#include <stdio.h>
+#include <string.h>
+
+#ifndef _WIN32
+#define _strdup strdup
+#endif
+
+#define MY_NAME "iio_genxml"
+
+enum backend {
+ LOCAL,
+ XML,
+ NETWORK,
+ AUTO,
+};
+
+static const struct option options[] = {
+ {"help", no_argument, 0, 'h'},
+ {"xml", required_argument, 0, 'x'},
+ {"network", required_argument, 0, 'n'},
+ {"uri", required_argument, 0, 'u'},
+ {0, 0, 0, 0},
+};
+
+static const char *options_descriptions[] = {
+ "Show this help and quit.",
+ "Use the XML backend with the provided XML file.",
+ "Use the network backend with the provided hostname.",
+ "Use the context with the provided URI.",
+};
+
+static void usage(void)
+{
+ unsigned int i;
+
+ printf("Usage:\n\t" MY_NAME " [-x <xml_file>]\n\t"
+ MY_NAME " [-u <uri>]\n\t"
+ MY_NAME " [-n <hostname>]\n\nOptions:\n");
+ for (i = 0; options[i].name; i++)
+ printf("\t-%c, --%s\n\t\t\t%s\n",
+ options[i].val, options[i].name,
+ options_descriptions[i]);
+}
+
+int main(int argc, char **argv)
+{
+ char *xml;
+ struct iio_context *ctx;
+ int c, option_index = 0;
+ const char *arg_uri = NULL;
+ const char *arg_xml = NULL;
+ const char *arg_ip = NULL;
+ enum backend backend = LOCAL;
+
+ while ((c = getopt_long(argc, argv, "+hn:x:u:",
+ options, &option_index)) != -1) {
+ switch (c) {
+ case 'h':
+ usage();
+ return EXIT_SUCCESS;
+ case 'n':
+ if (backend != LOCAL) {
+ fprintf(stderr, "-x and -n are mutually exclusive\n");
+ return EXIT_FAILURE;
+ }
+ backend = NETWORK;
+ arg_ip = optarg;
+ break;
+ case 'x':
+ if (backend != LOCAL) {
+ fprintf(stderr, "-x and -n are mutually exclusive\n");
+ return EXIT_FAILURE;
+ }
+ backend = XML;
+ arg_xml = optarg;
+ break;
+ case 'u':
+ arg_uri = optarg;
+ backend = AUTO;
+ break;
+ case '?':
+ return EXIT_FAILURE;
+ }
+ }
+
+ if (optind != argc) {
+ fprintf(stderr, "Incorrect number of arguments.\n\n");
+ usage();
+ return EXIT_FAILURE;
+ }
+
+ if (backend == AUTO)
+ ctx = iio_create_context_from_uri(arg_uri);
+ else if (backend == XML)
+ ctx = iio_create_xml_context(arg_xml);
+ else if (backend == NETWORK)
+ ctx = iio_create_network_context(arg_ip);
+ else
+ ctx = iio_create_default_context();
+
+ if (!ctx) {
+ fprintf(stderr, "Unable to create IIO context\n");
+ return EXIT_FAILURE;
+ }
+
+ xml = _strdup(iio_context_get_xml(ctx));
+ if (!xml) {
+ iio_context_destroy(ctx);
+ return EXIT_FAILURE;
+ }
+
+ printf("XML generated:\n\n%s\n\n", xml);
+
+ iio_context_destroy(ctx);
+
+ ctx = iio_create_xml_context_mem(xml, strlen(xml));
+ if (!ctx) {
+ fprintf(stderr, "Unable to re-generate context\n");
+ } else {
+ printf("Context re-creation from generated XML succeeded!\n");
+ iio_context_destroy(ctx);
+ }
+ free(xml);
+ return EXIT_SUCCESS;
+}