LUMIERA.clone/src/common/config-typed.c
Ichthyostega 41ad41d1f1 clean-up: sourcefile layout and spell checking
Uniform sequence at start of source files
- copyright claim
- license
- file comment
- header guard
- lumiera includes
- library / system includes

Lumiera uses Brittish spelling. Add an according note to the styleguide.
2014-10-23 23:04:35 +02:00

377 lines
8.6 KiB
C

/*
Config-typed - Lumiera configuration high-level interface
Copyright (C) Lumiera.org
2008, Christian Thaeter <ct@pipapo.org>
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of
the License, or (at your option) any later version.
This program 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
* *****************************************************/
/** @file config-type.d
** Implementation: high level typed configuration interfaces.
** @note unfinished draft from 2008
*/
#include "include/logging.h"
#include "lib/tmpbuf.h"
#include "common/config.h"
#include <stdint.h>
extern LumieraConfig lumiera_global_config;
const char*
lumiera_config_link_get (const char* key, const char** value)
{
(void) key; (void) value;
TRACE (configtyped_dbg);
UNIMPLEMENTED();
return 0;
}
LumieraConfigitem
lumiera_config_link_set (const char* key, const char** value)
{
(void) key; (void) value;
TRACE (configtyped_dbg);
UNIMPLEMENTED();
return 0;
}
/**
* Number
* signed integer numbers, in different formats (decimal, hex, oct, binary(for masks))
*/
const char*
lumiera_config_number_get (const char* key, long long* value)
{
TRACE (configtyped_dbg);
const char* raw_value = NULL;
LUMIERA_MUTEX_SECTION (mutex_sync, &lumiera_global_config->lock)
{
if (lumiera_config_get (key, &raw_value))
{
if (raw_value)
{
/* got it, scan it */
if (sscanf (raw_value, "%Li", value) != 1)
{
LUMIERA_ERROR_SET (config, CONFIG_SYNTAX_VALUE, lumiera_tmpbuf_snprintf (5000, "key '%s', value '%s'", key, raw_value));
raw_value = NULL;
}
}
else
LUMIERA_ERROR_SET_WARNING (config, CONFIG_NO_ENTRY, key);
}
}
return raw_value;
}
LumieraConfigitem
lumiera_config_number_set (const char* key, long long* value)
{
TRACE (configtyped_dbg);
LumieraConfigitem item = NULL;
LUMIERA_MUTEX_SECTION (mutex_sync, &lumiera_global_config->lock)
{
const char* fmt = "= %lld"; TODO ("use the config system (config.format*...) to deduce the desired format for this key");
item = lumiera_config_set (key, lumiera_tmpbuf_snprintf (SIZE_MAX, fmt, *value));
}
return item;
}
/**
* Real
* floating point number in standard formats (see printf/scanf)
*/
const char*
lumiera_config_real_get (const char* key, long double* value)
{
(void) key; (void) value;
TRACE (configtyped_dbg);
UNIMPLEMENTED();
return 0;
}
LumieraConfigitem
lumiera_config_real_set (const char* key, long double* value)
{
(void) key; (void) value;
TRACE (configtyped_dbg);
UNIMPLEMENTED();
return 0;
}
/**
* String
* unquoted string which covers the whole value area and gets chopped or
* quoted string which preserves leading/trailing spaces
* either single or double quotes are allowed, doubling the quote in a string escapes it
*/
/**
* helper function, takes a raw input string and give a tmpbuf with the string parsed back.
*/
static char*
scan_string (const char* in)
{
/* chop leading blanks */
in += strspn(in, " \t");
char quote = *in;
char* end;
char* ret = NULL;
if (quote == '"' || quote == '\'')
{
/* quoted string */
++in;
end = strchr (in, quote);
while (end && end[1] == quote)
end = strchr (end + 2, quote);
if (end)
{
ret = lumiera_tmpbuf_strndup (in, end - in);
/* replace double quote chars with single one */
char* wpos;
char* rpos;
for (wpos = rpos = ret; *rpos; ++rpos, ++wpos)
{
if (*rpos == quote)
++rpos;
*wpos = *rpos;
}
*wpos = '\0';
}
else
/* quotes doesn't match */
LUMIERA_ERROR_SET (config, CONFIG_SYNTAX_VALUE, "unmatched quotes");
}
else
{
/* unquoted string */
ret = lumiera_tmpbuf_strndup (in, SIZE_MAX);
/* chop trailing blanks */
end = ret + strlen (ret) - 1;
while (end > ret && (*end == ' ' || *end == '\t'))
*end-- = '\0';
}
return ret;
}
const char*
lumiera_config_string_get (const char* key, const char** value)
{
TRACE (configtyped_dbg);
const char* raw_value = *value = NULL;
LUMIERA_MUTEX_SECTION (mutex_sync, &lumiera_global_config->lock)
{
if (lumiera_config_get (key, &raw_value))
{
if (raw_value)
{
*value = scan_string (raw_value);
}
else
LUMIERA_ERROR_SET_WARNING (config, CONFIG_NO_ENTRY, key);
}
}
return *value;
}
LumieraConfigitem
lumiera_config_string_set (const char* key, const char** value)
{
TRACE (configtyped_dbg);
LumieraConfigitem item = NULL;
LUMIERA_MUTEX_SECTION (mutex_sync, &lumiera_global_config->lock)
{
const char* fmt = "= %s"; TODO ("use the config system (config.format*...) to deduce the desired format for this key");
item = lumiera_config_set (key, lumiera_tmpbuf_snprintf (SIZE_MAX, fmt, *value));
}
return item;
}
/**
* Wordlist
* words delimited by any of " \t,;"
*/
const char*
lumiera_config_wordlist_get (const char* key, const char** value)
{
TRACE (configtyped_dbg, "KEY %s", key);
const char* raw_value = *value = NULL;
LUMIERA_MUTEX_SECTION (mutex_sync, &lumiera_global_config->lock)
{
if (lumiera_config_get (key, &raw_value))
{
if (raw_value)
{
*value = raw_value;
}
else
LUMIERA_ERROR_SET_WARNING (config, CONFIG_NO_ENTRY, key);
/////////////////////////TODO "remove the ERROR_SET because config_get sets it already? also in all other getters in this file
}
}
return *value;
}
LumieraConfigitem
lumiera_config_wordlist_set (const char* key, const char** value)
{
TRACE (configtyped_dbg);
LumieraConfigitem item = NULL;
LUMIERA_MUTEX_SECTION (mutex_sync, &lumiera_global_config->lock)
{
const char* fmt = "= %s"; TODO ("use the config system (config.format*...) to deduce the desired format for this key");
item = lumiera_config_set (key, lumiera_tmpbuf_snprintf (SIZE_MAX, fmt, *value));
}
return item;
}
/**
* helper function, takes a raw input string and give a tmpbuf with the word parsed back.
* @remarks 'Word' is a single word, no quotes, chopped
*/
static char*
scan_word (const char* in)
{
/* chop leading blanks */
in += strspn(in, " \t");
char* ret = lumiera_tmpbuf_strndup (in, SIZE_MAX);
char* end = ret;
/* chop trailing blanks */
while (*end && *end != ' ' && *end != '\t')
++end;
*end++ = '\0';
return ret;
}
const char*
lumiera_config_word_get (const char* key, const char** value)
{
TRACE (configtyped_dbg, "KEY %s", key);
const char* raw_value = *value = NULL;
LUMIERA_MUTEX_SECTION (mutex_sync, &lumiera_global_config->lock)
{
if (lumiera_config_get (key, &raw_value))
{
if (raw_value)
{
*value = scan_word (raw_value);
}
else
LUMIERA_ERROR_SET_WARNING (config, CONFIG_NO_ENTRY, key);
}
}
return *value;
}
LumieraConfigitem
lumiera_config_word_set (const char* key, const char** value)
{
TRACE (configtyped_dbg);
LumieraConfigitem item = NULL;
LUMIERA_MUTEX_SECTION (mutex_sync, &lumiera_global_config->lock)
{
const char* fmt = "= %s"; ///////////////////////TODO use the config system (config.format*...) to deduce the desired format for this key
item = lumiera_config_set (key, lumiera_tmpbuf_snprintf (SIZE_MAX, fmt, scan_word (*value)));
}
return item;
}
/**
* Bool
* Bool in various formats, (0,1(!1), yes/no, true/false, on/off, set/clear)
*/
const char*
lumiera_config_bool_get (const char* key, int* value)
{
(void) key; (void) value;
TRACE (configtyped_dbg);
UNIMPLEMENTED("get bool from config system");
return 0;
}
LumieraConfigitem
lumiera_config_bool_set (const char* key, int* value)
{
(void) key; (void) value;
TRACE (configtyped_dbg);
UNIMPLEMENTED("set bool in config system");
return 0;
}
/*
// Local Variables:
// mode: C
// c-file-style: "gnu"
// indent-tabs-mode: nil
// End:
*/