8 #include <botan/parsing.h>
9 #include <botan/exceptn.h>
10 #include <botan/charset.h>
11 #include <botan/get_byte.h>
22 for(std::string::const_iterator i = number.begin(); i != number.end(); ++i)
24 const u32bit OVERFLOW_MARK = 0xFFFFFFFF / 10;
31 if((n > OVERFLOW_MARK) || (n == OVERFLOW_MARK && digit > 5))
56 while(lenstr.size() < min_len)
57 lenstr =
"0" + lenstr;
70 const char suffix = timespec[timespec.size()-1];
71 std::string value = timespec.substr(0, timespec.size()-1);
77 else if(suffix ==
's')
79 else if(suffix ==
'm')
81 else if(suffix ==
'h')
83 else if(suffix ==
'd')
85 else if(suffix ==
'y')
86 scale = 365 * 24 * 60 * 60;
98 if(namex.find(
'(') == std::string::npos &&
99 namex.find(
')') == std::string::npos)
100 return std::vector<std::string>(1, namex);
102 std::string name = namex, substring;
103 std::vector<std::string> elems;
106 elems.push_back(name.substr(0, name.find(
'(')));
107 name = name.substr(name.find(
'('));
109 for(std::string::const_iterator i = name.begin(); i != name.end(); ++i)
117 if(level == 1 && i == name.end() - 1)
119 if(elems.size() == 1)
120 elems.push_back(substring.substr(1));
122 elems.push_back(substring);
126 if(level == 0 || (level == 1 && i != name.end() - 1))
131 if(c ==
',' && level == 1)
133 if(elems.size() == 1)
134 elems.push_back(substring.substr(1));
136 elems.push_back(substring);
152 std::vector<std::string>
split_on(
const std::string& str,
char delim)
154 std::vector<std::string> elems;
155 if(str ==
"")
return elems;
158 for(std::string::const_iterator i = str.begin(); i != str.end(); ++i)
163 elems.push_back(substr);
172 elems.push_back(substr);
182 std::string substring;
183 std::vector<u32bit> oid_elems;
185 for(std::string::const_iterator i = oid.begin(); i != oid.end(); ++i)
193 oid_elems.push_back(
to_u32bit(substring));
202 oid_elems.push_back(
to_u32bit(substring));
204 if(oid_elems.size() < 2)
215 std::string::const_iterator p1 = name1.begin();
216 std::string::const_iterator p2 = name2.begin();
221 while(p1 != name1.end() && p2 != name2.end())
231 if(p1 == name1.end() && p2 == name2.end())
244 if((p1 != name1.end()) || (p2 != name2.end()))
254 std::vector<std::string> parts =
split_on(str,
'.');
256 if(parts.size() != 4)
261 for(
size_t i = 0; i != parts.size(); ++i)
268 ip = (ip << 8) | (octet & 0xFF);
281 for(
size_t i = 0; i !=
sizeof(ip); ++i)
std::vector< std::string > parse_algorithm_name(const std::string &namex)
bool x500_name_cmp(const std::string &name1, const std::string &name2)
bool caseless_cmp(char a, char b)
std::string ipv4_to_string(u32bit ip)
std::vector< std::string > split_on(const std::string &str, char delim)
std::invalid_argument Invalid_Argument
byte get_byte(size_t byte_num, T input)
unsigned long long u64bit
u32bit timespec_to_u32bit(const std::string ×pec)
std::string to_string(u64bit n, size_t min_len)
u32bit to_u32bit(const std::string &number)
std::vector< u32bit > parse_asn1_oid(const std::string &oid)
u32bit string_to_ipv4(const std::string &str)