diff --git a/src/backend/configitem.c b/src/backend/configitem.c index 6252b0bcf..96012ad14 100644 --- a/src/backend/configitem.c +++ b/src/backend/configitem.c @@ -107,7 +107,6 @@ lumiera_configitem_new (const char* line) ? tmp.vtable->new (&tmp) : lumiera_configitem_move (lumiera_malloc (sizeof (*self)), &tmp); - TRACE (config_item, "key size of %s is %d", tmp.key, tmp.key_size); return self; } @@ -215,6 +214,60 @@ lumiera_configitem_parse (LumieraConfigitem self, const char* line) else if (*itr == '@' ) { /*this is a directive*/ + + /*itr points now to @*/ + self->key = itr; + + /*check whether there are illegal whitespaces after @*/ + itr++; + if (*itr && !isspace(*itr)) + { + /*now look for the end of the directive and set the keysize*/ + self->key_size = strspn (itr, LUMIERA_CONFIG_KEY_CHARS); + + itr += self->key_size; + + /*we need a key with a length greather than zero and + * either the end of the line + * or a whitespace after the key */ + + if ( self->key_size && ( !*itr || (*itr && isspace(*itr)) )) + { + /*look for given arguments*/ + + /*skip blanks*/ + while (*itr && isspace (*itr)) + itr++; + + if (*itr) + { + /*there are arguments given, thus set delim*/ + self->delim = itr - 1; + } + else + { + /*no arguments were given*/ + self->delim = NULL; + } + } + else + { + /*malformed lines shall be treated like if they were comments*/ + self->key = NULL; + self->key_size = 0; + + LUMIERA_ERROR_SET (config_item, CONFIG_SYNTAX); + } + } + else + { + /*there occurred already an error right after the @!*/ + /*malformed lines shall be treated like if they were comments*/ + self->key = NULL; + self->key_size = 0; + + LUMIERA_ERROR_SET (config_item, CONFIG_SYNTAX); + } } else if (*itr == '[' ) { diff --git a/tests/22config_highlevel.tests b/tests/22config_highlevel.tests index ab07af113..dbd86005a 100644 --- a/tests/22config_highlevel.tests +++ b/tests/22config_highlevel.tests @@ -128,3 +128,65 @@ END PLANNED "bool set" <line = ' #comment bla' +END + +TEST "check content of configitem with section" configitem_simple_content_check $'[ key.foo suffix.bar ] ' << END +out: item->line = '[ key.foo suffix.bar ] ' +out: item->key_size = '7' +out: item->key = 'key.foo suffix.bar ] ' +out: item->delim = ' suffix.bar ] ' +END + +TEST "check content of configitem with directive (without argument)" configitem_simple_content_check $'\t @directive ' << END +out: item->line = ' @directive ' +out: item->key_size = '9' +out: item->key = '@directive ' +END + +TEST "check content of configitem with directive (with argument)" configitem_simple_content_check $'\t @directive \targument' << END +out: item->line = ' @directive argument' +out: item->key_size = '9' +out: item->key = '@directive argument' +out: item->delim = ' argument' +END + +TEST "check content of configitem with configentry" configitem_simple_content_check $' \t\t key.foo \t\t=\tbar' << END +out: item->line = ' key.foo = bar' +out: item->key_size = '7' +out: item->key = 'key.foo = bar' +out: item->delim = '= bar' +END + +TEST "check content of configitem with configentry (redirect)" configitem_simple_content_check $' \t\t key.foo \t\t<\tkey.bar' << END +out: item->line = ' key.foo < key.bar' +out: item->key_size = '7' +out: item->key = 'key.foo < key.bar' +out: item->delim = '< key.bar' +END diff --git a/tests/backend/test-config.c b/tests/backend/test-config.c index 8fed601f8..c9b2aeca3 100644 --- a/tests/backend/test-config.c +++ b/tests/backend/test-config.c @@ -178,4 +178,45 @@ TEST ("word_get") lumiera_config_destroy (); } +TEST ("configitem_simple_ctor_dtor") +{ + REQUIRE (argv[2]); + lumiera_config_init ("./"); + + LumieraConfigitem item; + + item = lumiera_configitem_new (argv[2]); + + lumiera_config_destroy (); +} + +TEST ("configitem_simple_content_check") +{ + REQUIRE (argv[2]); + lumiera_config_init ("./"); + + LumieraConfigitem item; + + item = lumiera_configitem_new (argv[2]); + + if ( item->line ) + { + printf("item->line = '%s'\n", item->line); + } + if ( item->key_size ) + { + printf("item->key_size = '%zi'\n", item->key_size); + } + if ( item->key ) + { + printf("item->key = '%s'\n", item->key); + } + if ( item->delim ) + { + printf("item->delim = '%s'\n", item->delim); + } + + lumiera_config_destroy (); +} + TESTS_END diff --git a/tests/library/test-llist.c b/tests/library/test-llist.c index 6f859b3f7..520cf9012 100644 --- a/tests/library/test-llist.c +++ b/tests/library/test-llist.c @@ -1,5 +1,5 @@ /* - test-llist.c - test the linked lis lib + test-llist.c - test the linked list lib Copyright (C) Lumiera.org 2008, Christian Thaeter