8#include <botan/internal/scan_name.h>
9#include <botan/internal/parsing.h>
10#include <botan/exceptn.h>
16std::string make_arg(
const std::vector<std::pair<size_t, std::string>>&
name,
size_t start)
18 std::string output =
name[start].second;
19 size_t level =
name[start].first;
21 size_t paren_depth = 0;
23 for(
size_t i = start + 1; i !=
name.size(); ++i)
25 if(
name[i].first <=
name[start].first)
28 if(
name[i].first > level)
30 output +=
"(" +
name[i].second;
33 else if(
name[i].first < level)
35 for (
size_t j =
name[i].first; j < level; j++) {
39 output +=
"," +
name[i].second;
43 if(output[output.size() - 1] !=
'(')
45 output +=
name[i].second;
48 level =
name[i].first;
51 for(
size_t i = 0; i != paren_depth; ++i)
64 m_orig_algo_spec(algo_spec),
72 std::vector<std::pair<size_t, std::string>>
name;
74 std::pair<size_t, std::string> accum = std::make_pair(level,
"");
76 const std::string decoding_error =
"Bad SCAN name '" + algo_spec +
"': ";
78 for(
char c : algo_spec)
80 if(c ==
'/' || c ==
',' || c ==
'(' || c ==
')')
91 if(c ==
'/' && level > 0)
92 accum.second.push_back(c);
95 if(!accum.second.empty())
96 name.push_back(accum);
97 accum = std::make_pair(level,
"");
101 accum.second.push_back(c);
104 if(!accum.second.empty())
105 name.push_back(accum);
113 m_alg_name =
name[0].second;
115 bool in_modes =
false;
117 for(
size_t i = 1; i !=
name.size(); ++i)
119 if(
name[i].first == 0)
121 m_mode_info.push_back(make_arg(
name, i));
124 else if(
name[i].first == 1 && !in_modes)
125 m_args.push_back(make_arg(
name, i));
133 " out of range for '" +
to_string() +
"'");
std::string arg(size_t i) const
const std::string & to_string() const
SCAN_Name(const char *algo_spec)
size_t arg_as_integer(size_t i, size_t def_value) const
std::string to_string(const BER_Object &obj)
uint32_t to_u32bit(const std::string &str)