settings: Extract section and key/value pair types and helper functions
This allows us to use them in the upcoming parser.
This commit is contained in:
@@ -32,9 +32,9 @@ networking/streams/stream_service.c networking/streams/stream_manager.c \
|
||||
pen/pen.c plugins/plugin_loader.c plugins/plugin_feature.c processing/jobs/job.c \
|
||||
processing/jobs/callback_job.c processing/processor.c processing/scheduler.c \
|
||||
processing/watcher.c resolver/resolver_manager.c resolver/rr_set.c \
|
||||
selectors/traffic_selector.c settings/settings.c \
|
||||
threading/thread.c threading/thread_value.c \
|
||||
threading/mutex.c threading/semaphore.c threading/rwlock.c threading/spinlock.c \
|
||||
selectors/traffic_selector.c settings/settings.c settings/settings_types.c \
|
||||
threading/thread.c threading/thread_value.c threading/mutex.c \
|
||||
threading/semaphore.c threading/rwlock.c threading/spinlock.c \
|
||||
utils/utils.c utils/chunk.c utils/debug.c utils/enum.c utils/identification.c \
|
||||
utils/lexparser.c utils/optionsfrom.c utils/capabilities.c utils/backtrace.c \
|
||||
utils/parser_helper.c utils/test.c utils/utils/strerror.c \
|
||||
|
||||
@@ -30,13 +30,17 @@ networking/streams/stream_service.c networking/streams/stream_manager.c \
|
||||
pen/pen.c plugins/plugin_loader.c plugins/plugin_feature.c processing/jobs/job.c \
|
||||
processing/jobs/callback_job.c processing/processor.c processing/scheduler.c \
|
||||
processing/watcher.c resolver/resolver_manager.c resolver/rr_set.c \
|
||||
selectors/traffic_selector.c settings/settings.c \
|
||||
threading/thread.c threading/thread_value.c \
|
||||
threading/mutex.c threading/semaphore.c threading/rwlock.c threading/spinlock.c \
|
||||
selectors/traffic_selector.c settings/settings.c settings/settings_types.c \
|
||||
threading/thread.c threading/thread_value.c threading/mutex.c \
|
||||
threading/semaphore.c threading/rwlock.c threading/spinlock.c \
|
||||
utils/utils.c utils/chunk.c utils/debug.c utils/enum.c utils/identification.c \
|
||||
utils/lexparser.c utils/optionsfrom.c utils/capabilities.c utils/backtrace.c \
|
||||
utils/parser_helper.c utils/test.c utils/utils/strerror.c
|
||||
|
||||
# private header files
|
||||
noinst_HEADERS = \
|
||||
settings/settings_types.h
|
||||
|
||||
if USE_DEV_HEADERS
|
||||
strongswan_includedir = ${dev_headers}
|
||||
nobase_strongswan_include_HEADERS = \
|
||||
|
||||
@@ -0,0 +1,150 @@
|
||||
/*
|
||||
* Copyright (C) 2010-2014 Tobias Brunner
|
||||
* Hochschule fuer Technik Rapperswil
|
||||
*
|
||||
* 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. See <http://www.fsf.org/copyleft/gpl.txt>.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#include "settings_types.h"
|
||||
|
||||
/*
|
||||
* Described in header
|
||||
*/
|
||||
kv_t *settings_kv_create(char *key, char *value)
|
||||
{
|
||||
kv_t *this;
|
||||
|
||||
INIT(this,
|
||||
.key = key,
|
||||
.value = value,
|
||||
);
|
||||
return this;
|
||||
}
|
||||
|
||||
/*
|
||||
* Described in header
|
||||
*/
|
||||
void settings_kv_destroy(kv_t *this)
|
||||
{
|
||||
free(this->key);
|
||||
free(this->value);
|
||||
free(this);
|
||||
}
|
||||
|
||||
/*
|
||||
* Described in header
|
||||
*/
|
||||
section_t *settings_section_create(char *name)
|
||||
{
|
||||
section_t *this;
|
||||
|
||||
INIT(this,
|
||||
.name = name,
|
||||
);
|
||||
return this;
|
||||
}
|
||||
|
||||
/*
|
||||
* Described in header
|
||||
*/
|
||||
void settings_section_destroy(section_t *this)
|
||||
{
|
||||
array_destroy_function(this->sections, (void*)settings_section_destroy, NULL);
|
||||
array_destroy_function(this->kv, (void*)settings_kv_destroy, NULL);
|
||||
array_destroy(this->fallbacks);
|
||||
free(this->name);
|
||||
free(this);
|
||||
}
|
||||
|
||||
/*
|
||||
* Described in header
|
||||
*/
|
||||
void settings_section_extend(section_t *base, section_t *extension)
|
||||
{
|
||||
enumerator_t *enumerator;
|
||||
section_t *sec;
|
||||
kv_t *kv;
|
||||
|
||||
enumerator = array_create_enumerator(extension->sections);
|
||||
while (enumerator->enumerate(enumerator, (void**)&sec))
|
||||
{
|
||||
section_t *found;
|
||||
if (array_bsearch(base->sections, sec->name, settings_section_find,
|
||||
&found) != -1)
|
||||
{
|
||||
settings_section_extend(found, sec);
|
||||
}
|
||||
else
|
||||
{
|
||||
array_remove_at(extension->sections, enumerator);
|
||||
array_insert_create(&base->sections, ARRAY_TAIL, sec);
|
||||
array_sort(base->sections, settings_section_sort, NULL);
|
||||
}
|
||||
}
|
||||
enumerator->destroy(enumerator);
|
||||
|
||||
enumerator = array_create_enumerator(extension->kv);
|
||||
while (enumerator->enumerate(enumerator, (void**)&kv))
|
||||
{
|
||||
kv_t *found;
|
||||
if (array_bsearch(base->kv, kv->key, settings_kv_find, &found) != -1)
|
||||
{
|
||||
free(found->value);
|
||||
found->value = kv->value;
|
||||
kv->value = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
array_remove_at(extension->kv, enumerator);
|
||||
array_insert_create(&base->kv, ARRAY_TAIL, kv);
|
||||
array_sort(base->kv, settings_kv_sort, NULL);
|
||||
}
|
||||
}
|
||||
enumerator->destroy(enumerator);
|
||||
}
|
||||
|
||||
/*
|
||||
* Described in header
|
||||
*/
|
||||
int settings_section_find(const void *a, const void *b)
|
||||
{
|
||||
const char *key = a;
|
||||
const section_t *item = b;
|
||||
return strcmp(key, item->name);
|
||||
}
|
||||
|
||||
/*
|
||||
* Described in header
|
||||
*/
|
||||
int settings_section_sort(const void *a, const void *b, void *user)
|
||||
{
|
||||
const section_t *sa = a, *sb = b;
|
||||
return strcmp(sa->name, sb->name);
|
||||
}
|
||||
|
||||
/*
|
||||
* Described in header
|
||||
*/
|
||||
int settings_kv_find(const void *a, const void *b)
|
||||
{
|
||||
const char *key = a;
|
||||
const kv_t *item = b;
|
||||
return strcmp(key, item->key);
|
||||
}
|
||||
|
||||
/*
|
||||
* Described in header
|
||||
*/
|
||||
int settings_kv_sort(const void *a, const void *b, void *user)
|
||||
{
|
||||
const kv_t *kva = a, *kvb = b;
|
||||
return strcmp(kva->key, kvb->key);
|
||||
}
|
||||
@@ -0,0 +1,134 @@
|
||||
/*
|
||||
* Copyright (C) 2010-2014 Tobias Brunner
|
||||
* Hochschule fuer Technik Rapperswil
|
||||
*
|
||||
* 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. See <http://www.fsf.org/copyleft/gpl.txt>.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Internal data types and functions shared between the parser and t.
|
||||
*
|
||||
* @defgroup settings_types settings_types
|
||||
* @{ @ingroup settings
|
||||
*/
|
||||
|
||||
#ifndef SETTINGS_TYPES_H_
|
||||
#define SETTINGS_TYPES_H_
|
||||
|
||||
typedef struct kv_t kv_t;
|
||||
typedef struct section_t section_t;
|
||||
|
||||
#include "collections/array.h"
|
||||
|
||||
/**
|
||||
* Key/value pair.
|
||||
*/
|
||||
struct kv_t {
|
||||
|
||||
/**
|
||||
* Key string, relative, not the full name.
|
||||
*/
|
||||
char *key;
|
||||
|
||||
/**
|
||||
* Value as string.
|
||||
*/
|
||||
char *value;
|
||||
};
|
||||
|
||||
/**
|
||||
* Section containing subsections and key value pairs.
|
||||
*/
|
||||
struct section_t {
|
||||
|
||||
/**
|
||||
* Name of the section.
|
||||
*/
|
||||
char *name;
|
||||
|
||||
/**
|
||||
* Fallback sections, as section_t.
|
||||
*/
|
||||
array_t *fallbacks;
|
||||
|
||||
/**
|
||||
* Subsections, as section_t.
|
||||
*/
|
||||
array_t *sections;
|
||||
|
||||
/**
|
||||
* Key value pairs, as kv_t.
|
||||
*/
|
||||
array_t *kv;
|
||||
};
|
||||
|
||||
/**
|
||||
* Create a key/value pair.
|
||||
*
|
||||
* @param key key (gets adopted)
|
||||
* @param value value (gets adopted)
|
||||
* @return allocated key/value pair
|
||||
*/
|
||||
kv_t *settings_kv_create(char *key, char *value);
|
||||
|
||||
/**
|
||||
* Destroy a key/value pair.
|
||||
*
|
||||
* @param this key/value pair to destroy
|
||||
*/
|
||||
void settings_kv_destroy(kv_t *this);
|
||||
|
||||
/**
|
||||
* Create a section with the given name.
|
||||
*
|
||||
* @param name name (gets adopted)
|
||||
* @return allocated section
|
||||
*/
|
||||
section_t *settings_section_create(char *name);
|
||||
|
||||
/**
|
||||
* Destroy a section.
|
||||
*
|
||||
* @param this section to destroy
|
||||
*/
|
||||
void settings_section_destroy(section_t *this);
|
||||
|
||||
/**
|
||||
* Extend the first section with the values and sub-sections of the second
|
||||
* section, from where they are consequently moved/removed (but there might
|
||||
* still remain some leftovers).
|
||||
*
|
||||
* @param base base section to extend
|
||||
* @param extension section whose data is extracted
|
||||
*/
|
||||
void settings_section_extend(section_t *base, section_t *extension);
|
||||
|
||||
/**
|
||||
* Callback to find a section by name
|
||||
*/
|
||||
int settings_section_find(const void *a, const void *b);
|
||||
|
||||
/**
|
||||
* Callback to sort sections by name
|
||||
*/
|
||||
int settings_section_sort(const void *a, const void *b, void *user);
|
||||
|
||||
/**
|
||||
* Callback to find a key/value pair by key
|
||||
*/
|
||||
int settings_kv_find(const void *a, const void *b);
|
||||
|
||||
/**
|
||||
* Callback to sort kv pairs by key
|
||||
*/
|
||||
int settings_kv_sort(const void *a, const void *b, void *user);
|
||||
|
||||
#endif /** SETTINGS_TYPES_H_ @}*/
|
||||
Reference in New Issue
Block a user