const string &GetInputFileDirectory() {
static string oldInputFileName;
static string fileDirectory;
string dir;
VivaConfiguration &cfg = VivaConfiguration::Instance();
string inputFileName;
cfg.GetInputFileName(inputFileName);
if (oldInputFileName == inputFileName)
return fileDirectory;
oldInputFileName = inputFileName;
filesystem::path inputFileNamePath(inputFileName, filesystem::native);
fileDirectory = inputFileNamePath.branch_path().string();
if (fileDirectory.empty()) {
TCHAR curDir[MAX_PATH];
if (GetCurrentDirectory(MAX_PATH, curDir) != 0) {
fileDirectory = curDir;
} else {
assert(false);
}
}
algorithm::replace_all(fileDirectory, "/", "\\");
to_lower(fileDirectory);
return fileDirectory;
}
typedef map<string, string> StrStrMap;
typedef StrStrMap::iterator StrStrMapIt;
void FixFileName(string &fileName) {
static StrStrMap FileNamesMap;
StrStrMapIt it = FileNamesMap.find(fileName);
if (it != FileNamesMap.end()) {
fileName = it->second;
return;
}
string oldFileName = fileName;
algorithm::replace_all(fileName, "/", "\\");
algorithm::replace_all(fileName, "\\\\", "\\");
filesystem::path tmpPath(fileName, filesystem::native);
fileName = tmpPath.string();
algorithm::replace_all(fileName, "/", "\\");
to_lower(fileName);
if (fileName.length() < 2) {
assert(false);
FileNamesMap.insert(make_pair(oldFileName, fileName));
return;
}
if (fileName[0] == '.' && fileName[1] != '.') {
const string &dir = GetInputFileDirectory();
if (!dir.empty())
fileName.replace(0, 1, dir);
FileNamesMap.insert(make_pair(oldFileName, fileName));
return;
}
if (isalpha(fileName[0]) && fileName[1] == ':' ) {
FileNamesMap.insert(make_pair(oldFileName, fileName));
return;
}
const string &dir = GetInputFileDirectory();
if (dir.empty())
fileName.insert(0, ".\\");
else {
fileName.insert(0, "\\");
fileName.insert(0, dir);
}
FileNamesMap.insert(make_pair(oldFileName, fileName));
}
|