}
ImageNameMap::ImageNameMap()
- : m_name("((?:[^/\\\\]|\\\\.)*)/((?:[^/\\\\]|\\\\.)*)"),
- m_escaped_slash("\\\\/"),
+ : m_name("((?:[^@\\\\]|\\\\.)*)@((?:[^@\\\\]|\\\\.)*)"),
+ m_escaped_at("\\\\@"),
m_escaped_backslash("\\\\\\\\"),
- m_slash("/"),
+ m_at("@"),
m_backslash("\\\\"),
m_bad_mapping_fallback(bad_mapping_abort) {
}
m_map.add_mapping(mapping);
}
-string ImageNameMap::unescape_slash(string s) const {
- s = boost::regex_replace(s, m_escaped_slash, "/");
+string ImageNameMap::unescape_at(string s) const {
+ s = boost::regex_replace(s, m_escaped_at, "@");
return boost::regex_replace(s, m_escaped_backslash, "\\\\");
}
-string ImageNameMap::escape_slash(string s) const {
+string ImageNameMap::escape_at(string s) const {
string result = boost::regex_replace(s, m_backslash, "\\\\");
- return boost::regex_replace(result, m_slash, "\\\\/");
+ return boost::regex_replace(result, m_at, "\\\\@");
}
bool ImageNameMap::parse_name(string name_string, Name *name) const {
boost::smatch what;
if (boost::regex_match(name_string, what, m_name)) {
- string image(unescape_slash(what[1]));
- string snap(unescape_slash(what[2]));
+ string image(unescape_at(what[1]));
+ string snap(unescape_at(what[2]));
*name = Name(image, snap);
return true;
} else {
}
string ImageNameMap::format_name(ImageNameMap::Name name) const {
- return escape_slash(name.first) + "/" + escape_slash(name.second);
+ return escape_at(name.first) + "@" + escape_at(name.second);
}
ImageNameMap::Name ImageNameMap::map(ImageNameMap::Name name) const {
void set_bad_mapping_fallback(BadMappingFallback bad_mapping_fallback);
private:
- std::string escape_slash(std::string s) const;
+ std::string escape_at(std::string s) const;
- std::string unescape_slash(std::string s) const;
+ std::string unescape_at(std::string s) const;
NameMap m_map;
- // Split "a/b" into "a" and "b", allowing for escaped slashes
+ // Split "a@b" into "a" and "b", allowing for escaped at sign
boost::regex m_name;
- // We don't have to worry about an even number of backslahes followed by a slash,
- // because that slash would have already been matched and removed.
- boost::regex m_escaped_slash;
+ // We don't have to worry about an even number of backslahes followed by an at sign,
+ // because that at sign would have already been matched and removed.
+ boost::regex m_escaped_at;
boost::regex m_escaped_backslash;
- boost::regex m_slash;
+ boost::regex m_at;
boost::regex m_backslash;
cout << " image names in the replay cluster." << std::endl;
cout << std::endl;
cout << "Image mapping rules:" << std::endl;
- cout << "A rule of image1/snap1=image2/snap2 would map snap1 of image1 to snap2 of" << std::endl;
- cout << "image2. Regular expressions are used, so image/snap_(.*)=image_$1/ would map" << std::endl;
- cout << "image/snap_1 to image_1/. (Note that an un-snapshotted image has the empty" << std::endl;
+ cout << "A rule of image1@snap1=image2@snap2 would map snap1 of image1 to snap2 of" << std::endl;
+ cout << "image2. Regular expressions are used, so image@snap_(.*)=image_$1@ would map" << std::endl;
+ cout << "image@snap_1 to image_1@. (Note that an un-snapshotted image has the empty" << std::endl;
cout << "string for the snapshot name.)" << std::endl;
}
typedef ImageNameMap::Name Name;
ImageNameMap m;
m.set_bad_mapping_fallback(bad_mapping);
- add_mapping(&m, "x/y=y/x");
- add_mapping(&m, "a\\=b/c=h/i");
- add_mapping(&m, "a/b\\=c=j/k");
- add_mapping(&m, "a\\\\/b/c=d/e");
- add_mapping(&m, "a/b\\\\/c=f/g");
- add_mapping(&m, "image/snap_(.*)=image_$1/");
- add_mapping(&m, "bad/=///");
+ add_mapping(&m, "x@y=y@x");
+ add_mapping(&m, "a\\=b@c=h@i");
+ add_mapping(&m, "a@b\\=c=j@k");
+ add_mapping(&m, "a\\\\@b@c=d@e");
+ add_mapping(&m, "a@b\\\\@c=f@g");
+ add_mapping(&m, "image@snap_(.*)=image_$1@");
+ add_mapping(&m, "bad@=@@@");
EXPECT_EQ(Name("y", "x"), m.map(Name("x", "y")));
EXPECT_EQ(Name("h", "i"), m.map(Name("a=b", "c")));
EXPECT_EQ(Name("j", "k"), m.map(Name("a", "b=c")));
- EXPECT_EQ(Name("d", "e"), m.map(Name("a/b", "c")));
- EXPECT_EQ(Name("f", "g"), m.map(Name("a", "b/c")));
+ EXPECT_EQ(Name("d", "e"), m.map(Name("a@b", "c")));
+ EXPECT_EQ(Name("f", "g"), m.map(Name("a", "b@c")));
EXPECT_EQ(Name("image_1", ""), m.map(Name("image", "snap_1")));
EXPECT_EQ(Name("xxx", "xxx"), m.map(Name("bad", "")));
}