/*
 * Simple config/test file reader
 * (C) 2013,2014,2015 Jack Lloyd
 *
 * Botan is released under the Simplified BSD License (see license.txt)
 */

#include <botan/exceptn.h>
#include <botan/internal/parsing.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;
}

} // namespace Botan
