From 056bb87f30d10a2f3ebe4bb58da78375f89c585b Mon Sep 17 00:00:00 2001 From: Christian Thaeter Date: Tue, 9 Sep 2008 21:34:40 +0200 Subject: [PATCH] config api change, return pointers as truth value NULL indicates some failure, anything else success (with some usable value) --- src/backend/config.c | 67 ++++++++++++++++++++++--------------- src/backend/config.h | 16 ++++----- src/backend/config_typed.c | 56 ++++++++++++------------------- tests/backend/test-config.c | 14 ++++---- 4 files changed, 77 insertions(+), 76 deletions(-) diff --git a/src/backend/config.c b/src/backend/config.c index 276088673..d907645dc 100644 --- a/src/backend/config.c +++ b/src/backend/config.c @@ -171,14 +171,14 @@ lumiera_config_purge (const char* filename) } -int +const char* lumiera_config_get (const char* key, const char** value) { TRACE (config); REQUIRE (key); REQUIRE (value); - int ret = -1; + *value = NULL; /* we translate the key for the env var override by making it uppercase and replace . with _, as side effect, this also checks the key syntax */ @@ -194,7 +194,6 @@ lumiera_config_get (const char* key, const char** value) *value = getenv(env); if (*value) { - ret = 0; NOTICE (config, "envvar override for config %s = %s", env, *value); } else @@ -205,7 +204,6 @@ lumiera_config_get (const char* key, const char** value) if (item) { *value = item->delim+1; - ret = 0; } else LUMIERA_ERROR_SET (config, CONFIG_NO_ENTRY); @@ -216,18 +214,18 @@ lumiera_config_get (const char* key, const char** value) LUMIERA_ERROR_SET (config, CONFIG_SYNTAX_KEY); } - return ret; + return *value; } -int +const char* lumiera_config_get_default (const char* key, const char** value) { TRACE (config); REQUIRE (key); REQUIRE (value); - int ret = -1; + *value = NULL; TODO ("follow '<' delegates?"); TODO ("refactor _get and get_default to iterator access (return LList or Lookupentry)"); @@ -236,39 +234,54 @@ lumiera_config_get_default (const char* key, const char** value) if (item && item->parent == &lumiera_global_config->defaults) { *value = item->delim+1; - ret = 0; } - return ret; + return *value; } -int +LumieraConfigitem lumiera_config_set (const char* key, const char* delim_value) { TRACE (config); - TODO ("if does this item already exist in a user writeable file?"); - TODO (" replace delim_value"); + LumieraConfigitem item = lumiera_config_lookup_item_find (&lumiera_global_config->keys, key); + if (item && item->parent != &lumiera_global_config->defaults) + { + TODO ("a user writeable file?"); + TODO (" replace delim_value"); + //LumieraConfigitem + lumiera_configitem_set_value (item, delim_value); + } + else + { + TODO ("create item"); + TODO (" find matching prefix"); + TODO (" find matching suffix"); + TODO (" find proper prefix indentation, else use config.indent"); + TODO (" create configitem with prefix/suffix removed"); - TODO ("else"); - TODO (" find matching prefix"); - TODO (" find matching suffix"); - TODO (" find proper prefix indentation, else use config.indent"); - TODO (" create configitem with prefix/suffix removed"); - + char* line = lumiera_tmpbuf_snprintf (SIZE_MAX, "%s %s", key, delim_value); + item = lumiera_configitem_new (line); + if (item) + { + TODO ("next 2 ensure must generate runtime errors"); + ENSURE (item->delim, "syntax error"); + ENSURE (*item->delim == '=' || *item->delim == '<', "syntax error,"); -// * set a value by key -// * handles internally everything as string:string key:value pair. -// * lowlevel function -// * tag file as dirty -// * set will create a new user configuration file if it does not exist yet or will append a line to the existing one in RAM. These files, tagged as 'dirty', will be only written if save() is called. + TODO ("insert in proper parent (file)"); + llist_insert_tail (&lumiera_global_config->TODO_unknown.childs, &item->link); + item->parent = &lumiera_global_config->TODO_unknown; + lumiera_config_lookup_insert (&lumiera_global_config->keys, item); + TODO ("tag file as dirty"); + } + } + TODO ("return item?"); - UNIMPLEMENTED(); - return -1; + return item; } @@ -294,14 +307,14 @@ lumiera_config_setdefault (const char* line) if (item) { - ENSURE (item->delim, "default must be a configentry with key=value or keydelim, "default must be a configentry with key=value or keydelim == '=' || *item->delim == '<', "default must be a configentry with key=value or keyline); llist_insert_head (&lumiera_global_config->defaults.childs, &item->link); item->parent = &lumiera_global_config->defaults; - lumiera_config_lookup_insert_default (&lumiera_global_config->keys, item); + lumiera_config_lookup_insert (&lumiera_global_config->keys, item); } } } diff --git a/src/backend/config.h b/src/backend/config.h index 7667f26f1..494e59961 100644 --- a/src/backend/config.h +++ b/src/backend/config.h @@ -91,11 +91,11 @@ typedef lumiera_config* LumieraConfig; */ /* TODO: add here as 'LUMIERA_CONFIG_TYPE(name, ctype)' the _get/_set prototypes are declared automatically below, you still have to implement them in config.c */ #define LUMIERA_CONFIG_TYPES \ - LUMIERA_CONFIG_TYPE(link, char*) \ + LUMIERA_CONFIG_TYPE(link, const char*) \ LUMIERA_CONFIG_TYPE(number, signed long long) \ LUMIERA_CONFIG_TYPE(real, long double) \ - LUMIERA_CONFIG_TYPE(string, char*) \ - LUMIERA_CONFIG_TYPE(word, char*) \ + LUMIERA_CONFIG_TYPE(string, const char*) \ + LUMIERA_CONFIG_TYPE(word, const char*) \ LUMIERA_CONFIG_TYPE(bool, int) @@ -166,11 +166,11 @@ lumiera_config_dump (FILE* out); /** * */ -int +const char* lumiera_config_get (const char* key, const char** value); -int +const char* lumiera_config_get_default (const char* key, const char** value); @@ -188,7 +188,7 @@ lumiera_config_get_default (const char* key, const char** value); * @param delim_value delimiter (= or <) followed by the value to be set * */ -int +LumieraConfigitem lumiera_config_set (const char* key, const char* delim_value); @@ -196,7 +196,7 @@ lumiera_config_set (const char* key, const char* delim_value); * Installs a default value for a config key. * Any key might have an associated default value which is used when * no other configuration is available, this can be set once. - * Any subsequent call will be a no-op. + * Any subsequent call will be a no-op. This function writelocks the config system. * @param line line with key, delimiter and value to store as default value * @return NULL in case of an error, else a pointer to the default configitem */ @@ -217,7 +217,7 @@ lumiera_config_setdefault (const char* line); * */ #define LUMIERA_CONFIG_TYPE(name, type) \ - int \ + const char* \ lumiera_config_##name##_get (const char* key, type* value); LUMIERA_CONFIG_TYPES #undef LUMIERA_CONFIG_TYPE diff --git a/src/backend/config_typed.c b/src/backend/config_typed.c index 07c2bb486..4c3604f82 100644 --- a/src/backend/config_typed.c +++ b/src/backend/config_typed.c @@ -38,8 +38,8 @@ extern LumieraConfig lumiera_global_config; * Here are the high level typed configuration interfaces defined. */ -int -lumiera_config_link_get (const char* key, char** value) +const char* +lumiera_config_link_get (const char* key, const char** value) { TRACE (config_typed); UNIMPLEMENTED(); @@ -47,7 +47,7 @@ lumiera_config_link_get (const char* key, char** value) } int -lumiera_config_link_set (const char* key, char** value) +lumiera_config_link_set (const char* key, const char** value) { TRACE (config_typed); UNIMPLEMENTED(); @@ -59,26 +59,23 @@ lumiera_config_link_set (const char* key, char** value) * Number * signed integer numbers, in different formats (decimal, hex, oct, binary(for masks)) */ -int +const char* lumiera_config_number_get (const char* key, long long* value) { TRACE (config_typed); - int ret = -1; - const char* raw_value = NULL; LUMIERA_RDLOCK_SECTION (config_typed, &lumiera_global_config->lock) { - if (!lumiera_config_get (key, &raw_value)) + if (lumiera_config_get (key, &raw_value)) { if (raw_value) { /* got it, scan it */ - if (sscanf (raw_value, "%Li", value) == 1) - ret = 0; /* all ok */ - else + if (sscanf (raw_value, "%Li", value) != 1) { + raw_value = NULL; LUMIERA_ERROR_SET (config_typed, CONFIG_SYNTAX_VALUE); } } @@ -87,7 +84,7 @@ lumiera_config_number_get (const char* key, long long* value) } } - return ret; + return raw_value; } int @@ -103,7 +100,7 @@ lumiera_config_number_set (const char* key, long long* value) * Real * floating point number in standard formats (see printf/scanf) */ -int +const char* lumiera_config_real_get (const char* key, long double* value) { TRACE (config_typed); @@ -183,36 +180,31 @@ scan_string (const char* in) return ret; } -int -lumiera_config_string_get (const char* key, char** value) +const char* +lumiera_config_string_get (const char* key, const char** value) { TRACE (config_typed); - int ret = -1; - - const char* raw_value = NULL; + const char* raw_value = *value = NULL; LUMIERA_RDLOCK_SECTION (config_typed, &lumiera_global_config->lock) { - if (!lumiera_config_get (key, &raw_value)) + if (lumiera_config_get (key, &raw_value)) { if (raw_value) { *value = scan_string (raw_value); - if (*value) - ret = 0; /* all ok */ - /* else error was raised by scan_string */ } else LUMIERA_ERROR_SET (config, CONFIG_NO_ENTRY); } } - return ret; + return *value; } int -lumiera_config_string_set (const char* key, char** value) +lumiera_config_string_set (const char* key, const char** value) { TRACE (config_typed); UNIMPLEMENTED(); @@ -247,35 +239,31 @@ scan_word (const char* in) return ret; } -int -lumiera_config_word_get (const char* key, char** value) +const char* +lumiera_config_word_get (const char* key, const char** value) { TRACE (config_typed, "KEY %s", key); - int ret = -1; - - const char* raw_value = NULL; + const char* raw_value = *value = NULL; LUMIERA_RDLOCK_SECTION (config_typed, &lumiera_global_config->lock) { - if (!lumiera_config_get (key, &raw_value)) + if (lumiera_config_get (key, &raw_value)) { if (raw_value) { *value = scan_word (raw_value); - if (*value) - ret = 0; /* all ok */ } else LUMIERA_ERROR_SET (config, CONFIG_NO_ENTRY); } } - return ret; + return *value; } int -lumiera_config_word_set (const char* key, char** value) +lumiera_config_word_set (const char* key, const char** value) { TRACE (config_typed); UNIMPLEMENTED(); @@ -287,7 +275,7 @@ lumiera_config_word_set (const char* key, char** value) * Bool * Bool in various formats, (0,1(!1), yes/no, true/false, on/off, set/clear) */ -int +const char* lumiera_config_bool_get (const char* key, int* value) { TRACE (config_typed); diff --git a/tests/backend/test-config.c b/tests/backend/test-config.c index c9b2aeca3..80446f0a0 100644 --- a/tests/backend/test-config.c +++ b/tests/backend/test-config.c @@ -94,7 +94,7 @@ TEST ("number_get") lumiera_config_setdefault (lumiera_tmpbuf_snprintf (SIZE_MAX, "%s = %s", argv[2], argv[3])); - if (!lumiera_config_number_get (argv[2], &number)) + if (lumiera_config_number_get (argv[2], &number)) printf ("%lld\n", number); else printf ("%s, %lld\n", lumiera_error (), number); @@ -111,7 +111,7 @@ TEST ("number_get_nodefault") long long number = 0; - if (!lumiera_config_number_get (argv[2], &number)) + if (lumiera_config_number_get (argv[2], &number)) printf ("%lld\n", number); else printf ("%s\n", lumiera_error ()); @@ -127,11 +127,11 @@ TEST ("string_get") lumiera_config_init ("./"); - char* string; + const char* string; lumiera_config_setdefault (lumiera_tmpbuf_snprintf (SIZE_MAX, "%s = %s", argv[2], argv[3])); - if (!lumiera_config_string_get (argv[2], &string)) + if (lumiera_config_string_get (argv[2], &string)) printf ("'%s'\n", string); else printf ("%s, '%s'\n", lumiera_error (), string); @@ -150,7 +150,7 @@ TEST ("string_set") FIXME ("handle error"); const char* string; - if (!lumiera_config_get (argv[2], &string)) + if (lumiera_config_get (argv[2], &string)) printf ("'%s'\n", string); else printf ("%s, '%s'\n", lumiera_error (), string); @@ -166,11 +166,11 @@ TEST ("word_get") lumiera_config_init ("./"); - char* word; + const char* word; lumiera_config_setdefault (lumiera_tmpbuf_snprintf (SIZE_MAX, "%s = %s", argv[2], argv[3])); - if (!lumiera_config_word_get (argv[2], &word)) + if (lumiera_config_word_get (argv[2], &word)) printf ("'%s'\n", word); else printf ("%s, '%s'\n", lumiera_error (), word);