From ab959d7b4194715870128e616b8e29d4a101e488 Mon Sep 17 00:00:00 2001 From: etobi Date: Tue, 3 Sep 2013 09:48:41 +0200 Subject: Imported Upstream version 1.1.1+rev1207 --- lib/libdvbcfg/dvbcfg_common.c | 136 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 lib/libdvbcfg/dvbcfg_common.c (limited to 'lib/libdvbcfg/dvbcfg_common.c') diff --git a/lib/libdvbcfg/dvbcfg_common.c b/lib/libdvbcfg/dvbcfg_common.c new file mode 100644 index 0000000..1609e51 --- /dev/null +++ b/lib/libdvbcfg/dvbcfg_common.c @@ -0,0 +1,136 @@ +/* + * dvbcfg - support for linuxtv configuration files + * common functions + * + * Copyright (C) 2006 Christoph Pfister + * Copyright (C) 2005 Andrew de Quincey + * + * 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. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include +#include +#include +#include "dvbcfg_common.h" + +int dvbcfg_parse_int(char **text, char *tokens) +{ + char *start = *text; + char *stop = *text; + int value; + + while (*stop != '\0') { + if (strchr(tokens, *stop) != NULL) { + *stop = '\0'; + stop++; + break; + } + stop++; + } + + if (sscanf(start, "%i", &value) == 1) { + *text = stop; + return value; + } + + *text = NULL; + return -1; +} + +int dvbcfg_parse_char(char **text, char *tokens) +{ + char *start = *text; + char *stop = *text; + char value; + + while (*stop != '\0') { + if (strchr(tokens, *stop) != NULL) { + *stop = '\0'; + stop++; + break; + } + stop++; + } + + if (sscanf(start, "%c", &value) == 1) { + *text = stop; + return value; + } + + *text = NULL; + return -1; +} + +int dvbcfg_parse_setting(char **text, char *tokens, const struct dvbcfg_setting *settings) +{ + char *start = *text; + char *stop = *text; + + while (*stop != '\0') { + if (strchr(tokens, *stop) != NULL) { + *stop = '\0'; + stop++; + break; + } + stop++; + } + + while (settings->name) { + if (strcmp(start, settings->name) == 0) { + *text = stop; + return settings->value; + } + settings++; + } + + *text = NULL; + return -1; +} + +void dvbcfg_parse_string(char **text, char *tokens, char *dest, unsigned long size) +{ + char *start = *text; + char *stop = *text; + unsigned long length; + + while ((*stop != '\0') && (strchr(tokens, *stop) == NULL)) + stop++; + + length = (stop - start) + 1; + + if (length <= size) { + if (strchr(tokens, *stop) != NULL) { + *stop = '\0'; + *text = stop + 1; + } else + *text = stop; + memcpy(dest, start, length); + return; + } + + *text = NULL; + return; +} + +const char *dvbcfg_lookup_setting(unsigned int setting, const struct dvbcfg_setting *settings) +{ + while (settings->name) { + if (setting == settings->value) + return settings->name; + settings++; + } + + return NULL; +} -- cgit v1.2.3