8 #include <botan/scan_name.h>
9 #include <botan/parsing.h>
10 #include <botan/exceptn.h>
17 const std::vector<std::pair<size_t, std::string> >& name,
size_t start)
19 std::string output = name[start].second;
20 size_t level = name[start].first;
22 size_t paren_depth = 0;
24 for(
size_t i = start + 1; i != name.size(); ++i)
26 if(name[i].first <= name[start].first)
29 if(name[i].first > level)
31 output +=
"(" + name[i].second;
34 else if(name[i].first < level)
36 output +=
")," + name[i].second;
41 if(output[output.size() - 1] !=
'(')
43 output += name[i].second;
46 level = name[i].first;
49 for(
size_t i = 0; i != paren_depth; ++i)
61 SCAN_Name::SCAN_Name(std::string algo_spec) : m_orig_algo_spec(algo_spec), m_alg_name(), m_args(), m_mode_info()
63 std::vector<std::pair<size_t, std::string> > name;
65 std::pair<size_t, std::string> accum = std::make_pair(level,
"");
67 const std::string decoding_error =
"Bad SCAN name '" + algo_spec +
"': ";
69 for(
size_t i = 0; i != algo_spec.size(); ++i)
71 char c = algo_spec[i];
73 if(c ==
'/' || c ==
',' || c ==
'(' || c ==
')')
84 if(c ==
'/' && level > 0)
85 accum.second.push_back(c);
88 if(accum.second !=
"")
89 name.push_back(accum);
90 accum = std::make_pair(level,
"");
94 accum.second.push_back(c);
97 if(accum.second !=
"")
98 name.push_back(accum);
106 m_alg_name = name[0].second;
108 bool in_modes =
false;
110 for(
size_t i = 1; i != name.size(); ++i)
112 if(name[i].first == 0)
114 m_mode_info.push_back(make_arg(name, i));
117 else if(name[i].first == 1 && !in_modes)
118 m_args.push_back(make_arg(name, i));
126 " out of range for '" +
as_string() +
"'");
uint32_t to_u32bit(const std::string &str)
std::string arg(size_t i) const
std::string to_string(const BER_Object &obj)
const std::string & as_string() const
size_t arg_as_integer(size_t i, size_t def_value) const
SCAN_Name(const char *algo_spec)