add wordlist_add function to add a word to a wordlist

This commit is contained in:
Christian Thaeter 2008-09-26 03:31:22 +02:00
parent 211b470e85
commit 2ae274ea51
4 changed files with 104 additions and 7 deletions

View file

@ -261,6 +261,15 @@ const char*
lumiera_config_wordlist_replace (const char* key, const char* value, const char* subst1, const char* subst2);
/**
* Add a word to the end of a wordlist if it doesnt exist already
* @param key key under which this wordlist is stored
* @param value new word to add
* @return internal representation of the wordlist in a tmpbuf or NULL in case of an error
*/
const char*
lumiera_config_wordlist_add (const char* key, const char* value);
// * {{{ lumiera_config_TYPE_set (const char* key, TYPE*value, const char* fmt) }}}
// Highlevel interface for different types, fmt is a printf format specifier for the desired format, when NULL, defaults apply.
/**

View file

@ -91,6 +91,9 @@ lumiera_config_wordlist_replace (const char* key, const char* value, const char*
size_t vlen = strlen (value);
size_t len;
if (!value)
return NULL;
LUMIERA_MUTEX_SECTION (config_typed, &lumiera_global_config->lock)
{
if (lumiera_config_get (key, &wordlist))
@ -138,15 +141,56 @@ lumiera_config_wordlist_replace (const char* key, const char* value, const char*
}
const char*
lumiera_config_wordlist_add (const char* key, const char* value)
{
const char* wordlist = NULL;
if (value && *value)
{
LUMIERA_MUTEX_SECTION (config_typed, &lumiera_global_config->lock)
{
if (lumiera_config_get (key, &wordlist))
{
size_t vlen = strlen (value);
size_t len;
for (const char* itr = wordlist; *itr; itr += len)
{
itr += strspn (itr, " \t,;");
len = strcspn (itr, " \t,;");
if (len == vlen && !strncmp (itr, value, vlen))
goto end;
}
TODO ("figure delimiter from original string out");
const char* delim = " ";
wordlist = lumiera_tmpbuf_snprintf (SIZE_MAX, "%s%s%s",
wordlist,
wordlist[strspn (wordlist, " \t,;")]?delim:"",
value);
if (!lumiera_config_set (key, lumiera_tmpbuf_snprintf (SIZE_MAX, "=%s", wordlist)))
wordlist = NULL;
}
end:;
}
}
return wordlist;
}
#if 0
LumieraConfigitem
lumiera_config_wordlist_remove_nth (const char* key, const char** value, unsigned nth)
const char*
lumiera_config_wordlist_remove_nth (const char* key, unsigned nth)
{
}
LumieraConfigitem
lumiera_config_wordlist_append (const char* key, const char** value, unsigned nth)
{
@ -158,10 +202,6 @@ lumiera_config_wordlist_preprend (const char* key, const char** value, unsigned
}
LumieraConfigitem
lumiera_config_wordlist_add (const char* key, const char** value, unsigned nth)
{
}
#endif

View file

@ -202,3 +202,23 @@ END
TEST "wordlist replace, last, insert after" wordlist_replace 'foo.bar' 'baz barf gnarf' gnarf 'gnarf' 'last' << END
out: ' baz barf gnarf last'
END
TEST "wordlist add 2 words" wordlist_add 'foo.bar' 'baz barf gnarf' first second << END
out: ' baz barf gnarf first'
out: ' baz barf gnarf first second'
END
TEST "wordlist add same word" wordlist_add 'foo.bar' 'baz barf gnarf' same same << END
out: ' baz barf gnarf same'
out: ' baz barf gnarf same'
END
TEST "wordlist add to empty list" wordlist_add 'foo.bar' '' first second << END
out: ' first'
out: ' first second'
END
TEST "wordlist add to empty list, same" wordlist_add 'foo.bar' '' same same << END
out: ' same'
out: ' same'
END

View file

@ -381,5 +381,33 @@ TEST ("wordlist_replace")
}
TEST ("wordlist_add")
{
REQUIRE (argv[2]);
REQUIRE (argv[3]);
REQUIRE (argv[4]);
REQUIRE (argv[5]);
lumiera_config_init ("./");
if (!lumiera_config_wordlist_set (argv[2], &argv[3]))
printf ("failed setting word '%s=%s': %s\n", argv[2], argv[3], lumiera_error ());
const char* wordlist = lumiera_config_wordlist_add (argv[2], argv[4]);
if (wordlist)
printf ("'%s'\n", wordlist);
else
printf ("%s\n", lumiera_error ());
wordlist = lumiera_config_wordlist_add (argv[2], argv[5]);
if (wordlist)
printf ("'%s'\n", wordlist);
else
printf ("%s\n", lumiera_error ());
lumiera_config_destroy ();
}
TESTS_END