The va_list trick does not seem to be portable, revert dots-in-section fix

This reverts commit 8f50d06c35.
This commit is contained in:
Martin Willi
2010-07-30 10:57:59 +02:00
parent 5d2e159b41
commit 63163cc340
+22 -58
View File
@@ -88,12 +88,11 @@ struct kv_t {
}; };
/** /**
* find a section by a given key, using buffered key, reusable buffer * find a section by a given key
*/ */
static section_t *find_section_buffered(section_t *section, char *key, static section_t *find_section(section_t *section, char *key, va_list args)
va_list args, char *buf, int len)
{ {
char *pos; char name[512], *pos;
enumerator_t *enumerator; enumerator_t *enumerator;
section_t *current, *found = NULL; section_t *current, *found = NULL;
@@ -101,20 +100,21 @@ static section_t *find_section_buffered(section_t *section, char *key,
{ {
return NULL; return NULL;
} }
pos = strchr(key, '.'); if (vsnprintf(name, sizeof(name), key, args) >= sizeof(name))
{
return NULL;
}
pos = strchr(name, '.');
if (pos) if (pos)
{ {
*pos = '\0'; *pos = '\0';
pos++; pos++;
} }
if (vsnprintf(buf, len, key, args) >= len)
{
return NULL;
}
enumerator = section->sections->create_enumerator(section->sections); enumerator = section->sections->create_enumerator(section->sections);
while (enumerator->enumerate(enumerator, &current)) while (enumerator->enumerate(enumerator, &current))
{ {
if (streq(current->name, buf)) if (streq(current->name, name))
{ {
found = current; found = current;
break; break;
@@ -123,32 +123,14 @@ static section_t *find_section_buffered(section_t *section, char *key,
enumerator->destroy(enumerator); enumerator->destroy(enumerator);
if (found && pos) if (found && pos)
{ {
return find_section_buffered(found, pos, args, buf, len); return find_section(found, pos, args);
} }
return found; return found;
} }
/** static char *find_value(section_t *section, char *key, va_list args)
* find a section by a given key
*/
static section_t *find_section(section_t *section, char *key, va_list args)
{ {
char buf[128], keybuf[512]; char name[512], *pos, *value = NULL;
if (snprintf(keybuf, sizeof(keybuf), "%s", key) >= sizeof(keybuf))
{
return NULL;
}
return find_section_buffered(section, keybuf, args, buf, sizeof(buf));
}
/**
* Find the string value for a key, using buffered key, reusable buffer
*/
static char *find_value_buffered(section_t *section, char *key, va_list args,
char *buf, int len)
{
char *pos, *value = NULL;
enumerator_t *enumerator; enumerator_t *enumerator;
kv_t *kv; kv_t *kv;
section_t *current, *found = NULL; section_t *current, *found = NULL;
@@ -158,20 +140,20 @@ static char *find_value_buffered(section_t *section, char *key, va_list args,
return NULL; return NULL;
} }
pos = strchr(key, '.'); if (vsnprintf(name, sizeof(name), key, args) >= sizeof(name))
{
return NULL;
}
pos = strchr(name, '.');
if (pos) if (pos)
{ {
*pos = '\0'; *pos = '\0';
pos++; pos++;
if (vsnprintf(buf, len, key, args) >= len)
{
return NULL;
}
enumerator = section->sections->create_enumerator(section->sections); enumerator = section->sections->create_enumerator(section->sections);
while (enumerator->enumerate(enumerator, &current)) while (enumerator->enumerate(enumerator, &current))
{ {
if (streq(current->name, buf)) if (streq(current->name, name))
{ {
found = current; found = current;
break; break;
@@ -180,19 +162,15 @@ static char *find_value_buffered(section_t *section, char *key, va_list args,
enumerator->destroy(enumerator); enumerator->destroy(enumerator);
if (found) if (found)
{ {
return find_value_buffered(found, pos, args, buf, len); return find_value(found, pos, args);
} }
} }
else else
{ {
if (vsnprintf(buf, len, key, args) >= len)
{
return NULL;
}
enumerator = section->kv->create_enumerator(section->kv); enumerator = section->kv->create_enumerator(section->kv);
while (enumerator->enumerate(enumerator, &kv)) while (enumerator->enumerate(enumerator, &kv))
{ {
if (streq(kv->key, buf)) if (streq(kv->key, name))
{ {
value = kv->value; value = kv->value;
break; break;
@@ -203,20 +181,6 @@ static char *find_value_buffered(section_t *section, char *key, va_list args,
return value; return value;
} }
/**
* Find the string value for a key
*/
static char *find_value(section_t *section, char *key, va_list args)
{
char buf[128], keybuf[512];
if (snprintf(keybuf, sizeof(keybuf), "%s", key) >= sizeof(keybuf))
{
return NULL;
}
return find_value_buffered(section, keybuf, args, buf, sizeof(buf));
}
/** /**
* Implementation of settings_t.get. * Implementation of settings_t.get.
*/ */