mirror of
https://github.com/subsurface/subsurface.git
synced 2024-11-28 13:10:19 +00:00
b9b51ffd4e
The XML-parameter code is a mess. Ownership is unclear. Allocation and freeing of strings is in different functions. Sometimes only every second string is free()d, because keys are not copied. But this is done inconsistently. The caller has to know how many parameters the callee may add. Instead, let's add a small helper-struct that uses C++ memory management, but exports a C-API. The array for the XML-library is generated on the fly. This is only the implementation, the old code is not yet replaced. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
62 lines
1.6 KiB
C++
62 lines
1.6 KiB
C++
// SPDX-License-Identifier: GPL-2.0
|
|
#include "xmlparams.h"
|
|
|
|
extern "C" struct xml_params *alloc_xml_params()
|
|
{
|
|
return new xml_params;
|
|
}
|
|
|
|
extern "C" void free_xml_params(struct xml_params *params)
|
|
{
|
|
delete params;
|
|
}
|
|
|
|
extern "C" void xml_params_resize(struct xml_params *params, int count)
|
|
{
|
|
params->items.resize(count);
|
|
}
|
|
|
|
extern "C" void xml_params_add(struct xml_params *params, const char *key, const char *value)
|
|
{
|
|
params->items.push_back({ std::string(key), std::string(value) });
|
|
}
|
|
|
|
extern "C" void xml_params_add_int(struct xml_params *params, const char *key, int value)
|
|
{
|
|
params->items.push_back({ std::string(key), std::to_string(value) });
|
|
}
|
|
|
|
extern "C" int xml_params_count(const struct xml_params *params)
|
|
{
|
|
return (int)params->items.size();
|
|
}
|
|
|
|
extern "C" const char *xml_params_get_key(const struct xml_params *params, int idx)
|
|
{
|
|
return params->items[idx].first.c_str();
|
|
}
|
|
|
|
extern "C" const char *xml_params_get_value(const struct xml_params *params, int idx)
|
|
{
|
|
return params->items[idx].second.c_str();
|
|
}
|
|
|
|
extern void xml_params_set_value(struct xml_params *params, int idx, const char *value)
|
|
{
|
|
if (idx < 0 || idx >= (int)params->items.size())
|
|
return;
|
|
params->items[idx].second = value;
|
|
}
|
|
|
|
extern "C" const char **xml_params_get(const struct xml_params *params)
|
|
{
|
|
if (!params)
|
|
return nullptr;
|
|
params->data.resize(params->items.size() * 2 + 1);
|
|
for (size_t i = 0; i < params->items.size(); ++i) {
|
|
params->data[i * 2] = params->items[i].first.c_str();
|
|
params->data[i * 2 + 1] = params->items[i].second.c_str();
|
|
}
|
|
params->data[params->items.size() * 2] = nullptr;
|
|
return params->data.data();
|
|
}
|