27 Filename::split(
const string& full_name,
string& directory,
28 string& name,
string& extension)
const
30 directory = name = extension =
"";
31 if (!full_name.empty()) {
33 bool dir_present =
false;
35 size_t last_slash = full_name.find_last_of(
'/');
36 if (last_slash != string::npos) {
40 directory = full_name.substr(0, last_slash + 1);
41 if (last_slash == full_name.size()) {
53 size_t last_dot = full_name.find_last_of(
'.');
54 if ((last_dot == string::npos) ||
55 (dir_present && (last_dot < last_slash))) {
61 name = full_name.substr(last_slash + 1);
67 extension = full_name.substr(last_dot);
70 if ((last_dot - last_slash) > 1) {
71 name = full_name.substr(last_slash + 1, last_dot - last_slash - 1);
80 Filename::expandWithDefault(
const string& defname)
const {
82 string def_directory(
"");
84 string def_extension(
"");
93 split(copy_defname, def_directory, def_name, def_extension);
97 (directory_.empty() ? def_directory : directory_) +
99 (extension_.empty() ? def_extension : extension_);
106 Filename::useAsDefault(
const string& name)
const {
108 string name_directory(
"");
109 string name_name(
"");
110 string name_extension(
"");
119 split(copy_name, name_directory, name_name, name_extension);
123 (name_directory.empty() ? directory_ : name_directory) +
124 (name_name.empty() ?
name_ : name_name) +
125 (name_extension.empty() ? extension_ : name_extension);
130 Filename::setDirectory(
const std::string& new_directory) {
131 std::string directory(new_directory);
133 if (directory.length() > 0) {
135 size_t sep = directory.rfind(
'/');
136 if (sep == std::string::npos || sep < directory.size() - 1) {
141 std::string full_name = directory +
name_ + extension_;
143 directory_.swap(directory);
144 full_name_.swap(full_name);