Revision control

Copy as Markdown

Other Tools

/*
* (C) 2018 Ribose Inc
*
* Botan is released under the Simplified BSD License (see license.txt)
*/
#include <botan/parsing.h>
#include <botan/exceptn.h>
namespace Botan {
std::map<std::string, std::string> read_kv(const std::string& kv)
{
std::map<std::string, std::string> m;
if(kv == "")
return m;
std::vector<std::string> parts;
try
{
parts = split_on(kv, ',');
}
catch(std::exception&)
{
throw Invalid_Argument("Bad KV spec");
}
bool escaped = false;
bool reading_key = true;
std::string cur_key;
std::string cur_val;
for(char c : kv)
{
if(c == '\\' && !escaped)
{
escaped = true;
}
else if(c == ',' && !escaped)
{
if(cur_key.empty())
throw Invalid_Argument("Bad KV spec empty key");
if(m.find(cur_key) != m.end())
throw Invalid_Argument("Bad KV spec duplicated key");
m[cur_key] = cur_val;
cur_key = "";
cur_val = "";
reading_key = true;
}
else if(c == '=' && !escaped)
{
if(reading_key == false)
throw Invalid_Argument("Bad KV spec unexpected equals sign");
reading_key = false;
}
else
{
if(reading_key)
cur_key += c;
else
cur_val += c;
if(escaped)
escaped = false;
}
}
if(!cur_key.empty())
{
if(reading_key == false)
{
if(m.find(cur_key) != m.end())
throw Invalid_Argument("Bad KV spec duplicated key");
m[cur_key] = cur_val;
}
else
throw Invalid_Argument("Bad KV spec incomplete string");
}
return m;
}
}