8 #include <botan/scan_name.h>
9 #include <botan/parsing.h>
10 #include <botan/libstate.h>
11 #include <botan/exceptn.h>
19 const std::vector<std::pair<size_t, std::string> >& name,
size_t start)
21 std::string output = name[start].second;
22 size_t level = name[start].first;
24 size_t paren_depth = 0;
26 for(
size_t i = start + 1; i != name.size(); ++i)
28 if(name[i].first <= name[start].first)
31 if(name[i].first > level)
33 output +=
'(' + name[i].second;
36 else if(name[i].first < level)
38 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)
57 std::pair<size_t, std::string>
58 deref_aliases(
const std::pair<size_t, std::string>& in)
60 return std::make_pair(in.first,
68 orig_algo_spec = algo_spec;
70 std::vector<std::pair<size_t, std::string> > name;
72 std::pair<size_t, std::string> accum = std::make_pair(level,
"");
74 std::string decoding_error =
"Bad SCAN name '" + algo_spec +
"': ";
78 for(
size_t i = 0; i != algo_spec.size(); ++i)
80 char c = algo_spec[i];
82 if(c ==
'/' || c ==
',' || c ==
'(' || c ==
')')
93 if(c ==
'/' && level > 0)
94 accum.second.push_back(c);
97 if(accum.second !=
"")
98 name.push_back(deref_aliases(accum));
99 accum = std::make_pair(level,
"");
103 accum.second.push_back(c);
106 if(accum.second !=
"")
107 name.push_back(deref_aliases(accum));
115 alg_name = name[0].second;
117 bool in_modes =
false;
119 for(
size_t i = 1; i != name.size(); ++i)
121 if(name[i].first == 0)
123 mode_info.push_back(make_arg(name, i));
126 else if(name[i].first == 1 && !in_modes)
127 args.push_back(make_arg(name, i));
156 throw std::range_error(
"SCAN_Name::argument - i out of range");
std::string arg(size_t i) const
std::string algo_name() const
Library_State & global_state()
std::string deref_alias(const std::string &alias) const
size_t arg_as_integer(size_t i, size_t def_value) const
SCAN_Name(std::string algo_spec)
u32bit to_u32bit(const std::string &number)
std::string algo_name_and_args() const