Pratyush Mallick
/
testing
this is testing
Diff: app/noos_mbed/libraries/iio/libtinyiiod/parser.c
- Revision:
- 0:3afcd581558d
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/app/noos_mbed/libraries/iio/libtinyiiod/parser.c Thu Jan 14 18:54:16 2021 +0530 @@ -0,0 +1,217 @@ +/* + * libtinyiiod - Tiny IIO Daemon Library + * + * Copyright (C) 2016 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 "tinyiiod-private.h" + +#include "compat.h" + +static int32_t parse_rw_string(struct tinyiiod *iiod, char *str, bool write) +{ + char *device, *channel, *attr, *ptr; + bool is_channel = false, output = false; + enum iio_attr_type type = IIO_ATTR_TYPE_DEVICE; + long bytes; + + ptr = strchr(str, ' '); + if (!ptr) + return -EINVAL; + + *ptr = '\0'; + device = str; + str = ptr + 1; + + if (!strncmp(str, "INPUT ", sizeof("INPUT ") - 1)) { + is_channel = true; + str += sizeof("INPUT ") - 1; + } else if (!strncmp(str, "OUTPUT ", sizeof("OUTPUT ") - 1)) { + is_channel = true; + output = true; + str += sizeof("OUTPUT ") - 1; + } else if (!strncmp(str, "DEBUG ", sizeof("DEBUG ") - 1)) { + type = IIO_ATTR_TYPE_DEBUG; + str += sizeof("DEBUG ") - 1; + } else if (!strncmp(str, "BUFFER ", sizeof("BUFFER ") - 1)) { + type = IIO_ATTR_TYPE_BUFFER; + str += sizeof("BUFFER ") - 1; + } + + if (is_channel) { + ptr = strchr(str, ' '); + if (!ptr) + return -EINVAL; + + *ptr = '\0'; + channel = str; + str = ptr + 1; + } else { + channel = NULL; + } + + ptr = strchr(str, ' '); + if ((!!ptr) ^ write) + return -EINVAL; + + attr = str; + + if (write) { + *ptr = '\0'; + str = ptr + 1; + } else { + tinyiiod_do_read_attr(iiod, device, channel, + output, attr, type); + return 0; + } + + bytes = strtol(str, &ptr, 10); + if (str == ptr || bytes < 0) + return -EINVAL; + + tinyiiod_do_write_attr(iiod, device, channel, + output, attr, (size_t) bytes, type); + + return 0; +} + +static int32_t parse_open_string(struct tinyiiod *iiod, char *str) +{ + char *device, *ptr; + long samples_count; + uint32_t mask = 0; + + ptr = strchr(str, ' '); + if (!ptr) + return -EINVAL; + + *ptr = '\0'; + device = str; + str = ptr + 1; + + samples_count = strtol(str, &ptr, 10); + if (str == ptr || *ptr != ' ' || samples_count < 0) + return -EINVAL; + + str = ptr + 1; + + mask = strtoul(str, NULL, 16); + + tinyiiod_do_open(iiod, device, (size_t) samples_count, mask); + + return 0; +} + +static int32_t parse_timeout_string(struct tinyiiod *iiod, char *str) +{ + uint32_t timeout = strtoul(str, NULL, 10); + + return tinyiiod_set_timeout(iiod, timeout); +} + +static int32_t parse_writebuf_string(struct tinyiiod *iiod, char *str) +{ + char *device, *ptr; + long bytes_count; + + ptr = strchr(str, ' '); + if (!ptr) + return -EINVAL; + + *ptr = '\0'; + device = str; + str = ptr + 1; + + bytes_count = strtol(str, &ptr, 10); + if (str == ptr || *ptr != '\0' || bytes_count < 0) + return -EINVAL; + + return tinyiiod_do_writebuf(iiod, device, (size_t) bytes_count); +} + +static int32_t parse_readbuf_string(struct tinyiiod *iiod, char *str) +{ + char *device, *ptr; + long bytes_count; + + ptr = strchr(str, ' '); + if (!ptr) + return -EINVAL; + + *ptr = '\0'; + device = str; + str = ptr + 1; + + bytes_count = strtol(str, &ptr, 10); + if (str == ptr || *ptr != '\0' || bytes_count < 0) + return -EINVAL; + + return tinyiiod_do_readbuf(iiod, device, (size_t) bytes_count); +} + +int32_t tinyiiod_parse_string(struct tinyiiod *iiod, char *str) +{ + while (*str == '\n' || *str == '\r') + str++; + + if (str[0] == '\0') + return 0; + + if (!strncmp(str, "VERSION", sizeof("VERSION"))) { + char buf[32]; + + snprintf(buf, sizeof(buf), "%"PRIu16".%"PRIu16".%07x\n", + TINYIIOD_VERSION_MAJOR, + TINYIIOD_VERSION_MINOR, + TINYIIOD_VERSION_GIT); + tinyiiod_write_string(iiod, buf); + return 0; + } + + if (!strncmp(str, "PRINT", sizeof("PRINT"))) { + tinyiiod_write_xml(iiod); + return 0; + } + + if (!strncmp(str, "READ ", sizeof("READ ") - 1)) + return parse_rw_string(iiod, str + sizeof("READ ") - 1, false); + + if (!strncmp(str, "WRITE ", sizeof("WRITE ") -1)) + return parse_rw_string(iiod, str + sizeof("WRITE ") - 1, true); + + if (!strncmp(str, "OPEN ", sizeof("OPEN ") -1)) + return parse_open_string(iiod, str + sizeof("OPEN ") - 1); + + if (!strncmp(str, "CLOSE ", sizeof("CLOSE ") -1)) { + tinyiiod_do_close(iiod, str + sizeof("CLOSE ") - 1); + return 0; + } + + if (!strncmp(str, "READBUF ", sizeof("READBUF ") -1)) + return parse_readbuf_string(iiod, str + sizeof("READBUF ") - 1); + + if (!strncmp(str, "TIMEOUT ", sizeof("TIMEOUT ") - 1)) + return parse_timeout_string(iiod, str + sizeof("TIMEOUT ") - 1); + + if (!strncmp(str, "WRITEBUF ", sizeof("WRITEBUF ") -1)) + return parse_writebuf_string(iiod, str + sizeof("WRITEBUF ") - 1); + + if (!strncmp(str, "EXIT", sizeof("EXIT") - 1)) + return tinyiiod_do_close_instance(iiod); + + if (!strncmp(str, "GETTRIG", sizeof("GETTRIG") - 1)) + return tinyiiod_write_value(iiod, -ENODEV); + + return -EINVAL; +}