5 #include <boost/regex.hpp>
16 const char escape_char ) {
17 std::stringstream str;
18 switch ( escape_char ) {
27 str <<
'\\' << escape_char;
37 const std::set<char>& character_set ) {
38 std::stringstream str;
40 for ( std::set<char>::const_iterator iter = character_set.begin(); iter != character_set.end(); ++iter ) {
53 return boost::regex( str.str() );
57 const std::string& character_set ) {
59 for ( std::string::const_iterator iter = character_set.begin(); iter != character_set.end(); iter++ ) {
66 const std::vector<std::string>& strs,
67 const boost::regex& special_character_set_regex,
68 const char escape_char ) {
69 std::vector<std::string> escaped_strs;
71 if ( !boost::regex_match( std::string( 1, escape_char ), special_character_set_regex ) ) {
72 THROW(
SYS_BAD_INPUT,
"Regular expression passed to escape_string must match against the escape character." );
74 for ( std::vector<std::string>::const_iterator iter = strs.begin(); iter != strs.end(); ++iter ) {
79 for ( std::vector<std::string>::const_iterator iter = strs.begin(); iter != strs.end(); ++iter ) {
80 escaped_strs.push_back( *iter );
87 const std::vector<std::string>& strs,
88 const std::set<char>& special_character_set,
89 const char escape_char ) {
94 const std::vector<std::string>& strs,
95 const std::string& special_character_set,
96 const char escape_char ) {
101 const std::vector<std::string>& strs,
102 const boost::regex& special_character_set_regex ) {
107 const std::vector<std::string>& strs,
108 const std::set<char>& special_character_set ) {
113 const std::vector<std::string>& strs,
114 const std::string& special_character_set ) {
119 const std::vector<std::string>& strs ) {
124 const std::string& str,
125 const boost::regex& special_character_set_regex,
126 const char escape_char ) {
127 std::vector<std::string> v;
129 return escape_strings( v, special_character_set_regex, escape_char )[0];
133 const std::string& str,
134 const std::set<char>& special_character_set,
135 const char escape_char ) {
140 const std::string& str,
141 const std::string& special_character_set,
142 const char escape_char ) {
147 const std::string& str,
148 const boost::regex& special_character_set_regex ) {
153 const std::string& str,
154 const std::set<char>& special_character_set ) {
159 const std::string& str,
160 const std::string& special_character_set ) {
165 const std::string& str ) {
169 std::string
join( std::vector<std::string>& strs,
const std::string& separator ) {
170 std::stringstream joined;
171 for ( std::vector<std::string>::const_iterator iter = strs.begin(); iter != strs.end(); ) {
174 if ( iter != strs.end() ) {
181 std::string
join( std::vector<std::string>& strs,
const char separator ) {
182 return join( strs, std::string( 1, separator ) );
186 const std::vector<std::string>&
list,
187 const boost::regex& special_character_set_regex,
188 const char delimiter_char,
189 const char escape_char ) {
190 if ( escape_char && !boost::regex_match( std::string( 1, delimiter_char ), special_character_set_regex ) ) {
191 THROW(
SYS_BAD_INPUT,
"Regular expression passed to serialize_list must match against the delimiter character." );
193 std::vector<std::string> escaped_strings =
escape_strings(
list, special_character_set_regex, escape_char );
194 return join( escaped_strings, delimiter_char );
198 const std::vector<std::string>&
list,
199 const std::set<char>& special_character_set,
200 const char delimiter_char,
201 const char escape_char ) {
206 const std::vector<std::string>&
list,
207 const std::string& special_character_set,
208 const char delimiter_char,
209 const char escape_char ) {
214 const std::vector<std::string>&
list,
215 const boost::regex& special_character_set_regex,
216 const char delimiter_char ) {
221 const std::vector<std::string>&
list,
222 const std::set<char>& special_character_set,
223 const char delimiter_char ) {
228 const std::vector<std::string>&
list,
229 const std::string& special_character_set,
230 const char delimiter_char ) {
235 const std::vector<std::string>&
list,
236 const boost::regex& special_character_set_regex ) {
241 const std::vector<std::string>&
list,
242 const std::set<char>& special_character_set ) {
247 const std::vector<std::string>&
list,
248 const std::string& special_character_set ) {
253 const std::vector<std::string>&
list ) {
258 const std::string&
list,
259 const std::string& delimiters,
260 const char escape_char ) {
261 std::vector<std::string> deserialized_list;
262 std::stringstream current_string;
263 const char delimiter_char = delimiters[0];
264 const std::string remaining_delimiters = delimiters.size() ? delimiters.substr( 1 ) :
"" ;
265 for ( std::string::const_iterator iter =
list.begin(); iter !=
list.end(); ++iter ) {
266 if ( *iter == escape_char ) {
268 if ( iter ==
list.end() ) {
271 if ( remaining_delimiters.size() && ( *iter == escape_char || remaining_delimiters.find( *iter ) != std::string::npos ) ) {
272 current_string << escape_char;
275 else if ( *iter == delimiter_char ) {
276 deserialized_list.push_back( current_string.str() );
277 current_string.str(
"" );
280 current_string << *iter;
282 if ( !current_string.str().empty() ) {
283 deserialized_list.push_back( current_string.str() );
286 return deserialized_list;
290 const std::string&
list,
291 const char delimiter_char,
292 const char escape_char ) {
297 const std::string&
list,
298 const std::string& delimiters ) {
303 const std::string&
list,
304 const char delimiter_char ) {
309 const std::string&
list ) {
314 std::vector<std::string> deserialized_metadata =
deserialize_list( metadata );
315 if ( deserialized_metadata.size() % 3 == 2 ) {
316 deserialized_metadata.push_back(
"" );
318 else if ( deserialized_metadata.size() % 3 != 0 ) {
319 THROW(
SYS_BAD_INPUT,
"Metadata strings must consist of triplets of semicolon-separated tokens" );
322 return deserialized_metadata;
326 if ( metadata.size() % 3 != 0 ) {
333 std::vector<std::string> shallow_deserialized_acl =
deserialize_list( acl,
"; ",
'\\' );
334 std::vector<std::vector<std::string> > deserialized_acl;
335 for ( std::vector<std::string>::const_iterator iter = shallow_deserialized_acl.begin(); iter != shallow_deserialized_acl.end(); ++iter ) {
336 std::vector<std::string> current_acl =
deserialize_list( *iter,
" ",
'\\' );
337 if ( current_acl.size() != 2 ) {
338 THROW(
SYS_BAD_INPUT,
"ACLs must be a space-separated tuple of \"user permission\"" );
340 deserialized_acl.push_back( current_acl );
343 return deserialized_acl;
346 std::string
serialize_acl(
const std::vector<std::vector<std::string> >& acl ) {
347 std::vector<std::string> shallow_serialized_acl;
348 for ( std::vector<std::vector<std::string> >::const_iterator iter = acl.begin(); iter != acl.end(); ++iter ) {
349 if ( iter->size() != 2 ) {
352 shallow_serialized_acl.push_back(
serialize_list( *iter, boost::regex(
"[\\\\ ;]" ),
' ',
'\\' ) );
354 return join( shallow_serialized_acl,
';' );
360 std::vector<std::string> list_strings;
361 for (
size_t i = 0; i < list_len; i++ ) {
362 list_strings.push_back(
list[i] );
368 std::vector<std::string> metadata_strings;
369 for (
size_t i = 0; i < metadata_len; i++ ) {
370 metadata_strings.push_back( metadata[i] );
381 std::vector<std::vector<std::string> > acl_strings;
382 for (
size_t i = 0; i < acl_len; i++ ) {
384 std::vector<std::string> v;
385 v.push_back( acl[i] );
386 acl_strings.push_back( v );
389 acl_strings.back().push_back( acl[i] );