blob: 6efee8efeeb6c9c333797c4815b82cf4f2133340 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
/*
* Simple config/test file reader
* (C) 2013,2014,2015 Jack Lloyd
*
* Botan is released under the Simplified BSD License (see license.txt)
*/
#include <botan/internal/parsing.h>
#include <botan/exceptn.h>
namespace Botan {
std::string clean_ws(const std::string& s)
{
const char* ws = " \t\n";
auto start = s.find_first_not_of(ws);
auto end = s.find_last_not_of(ws);
if(start == std::string::npos)
return "";
if(end == std::string::npos)
return s.substr(start, end);
else
return s.substr(start, start + end + 1);
}
std::map<std::string, std::string> read_cfg(std::istream& is)
{
std::map<std::string, std::string> kv;
size_t line = 0;
while(is.good())
{
std::string s;
std::getline(is, s);
++line;
if(s.empty() || s[0] == '#')
continue;
s = clean_ws(s.substr(0, s.find('#')));
if(s.empty())
continue;
auto eq = s.find("=");
if(eq == std::string::npos || eq == 0 || eq == s.size() - 1)
throw Decoding_Error("Bad read_cfg input '" + s + "' on line " + std::to_string(line));
const std::string key = clean_ws(s.substr(0, eq));
const std::string val = clean_ws(s.substr(eq + 1, std::string::npos));
kv[key] = val;
}
return kv;
}
}
|