/* Copyright (C) 2009-2011 DeSmuME team This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the this software. If not, see . */ #include "types.h" #include "path.h" #include //----------------------------------- //This is taken from mono Path.cs static const char InvalidPathChars[] = { '\x22', '\x3C', '\x3E', '\x7C', '\x00', '\x01', '\x02', '\x03', '\x04', '\x05', '\x06', '\x07', '\x08', '\x09', '\x0A', '\x0B', '\x0C', '\x0D', '\x0E', '\x0F', '\x10', '\x11', '\x12', '\x13', '\x14', '\x15', '\x16', '\x17', '\x18', '\x19', '\x1A', '\x1B', '\x1C', '\x1D', '\x1E', '\x1F' }; //but it is sort of windows-specific. Does it work in linux? Maybe we'll have to make it smarter static const char VolumeSeparatorChar = ':'; static const char AltDirectorySeparatorChar = '/'; static bool dirEqualsVolume = (DIRECTORY_DELIMITER_CHAR == VolumeSeparatorChar); bool Path::IsPathRooted (const std::string &pth) { if (pth.empty()) { return false; } if (pth.find_first_of(InvalidPathChars) != std::string::npos) { return false; } char c = pth[0]; return c == DIRECTORY_DELIMITER_CHAR || c == AltDirectorySeparatorChar || (!dirEqualsVolume && pth.size() > 1 && pth[1] == VolumeSeparatorChar); } std::string Path::GetFileDirectoryPath(std::string filePath) { if (filePath.empty()) { return ""; } size_t i = filePath.find_last_of(DIRECTORY_DELIMITER_CHAR); if (i == std::string::npos) { return filePath; } return filePath.substr(0, i); } std::string Path::GetFileNameFromPath(std::string filePath) { if (filePath.empty()) { return ""; } size_t i = filePath.find_last_of(DIRECTORY_DELIMITER_CHAR); if (i == std::string::npos) { return filePath; } return filePath.substr(i + 1); } std::string Path::GetFileNameWithoutExt(std::string fileName) { if (fileName.empty()) { return ""; } size_t i = fileName.find_last_of(FILE_EXT_DELIMITER_CHAR); if (i == std::string::npos) { return fileName; } return fileName.substr(0, i); } std::string Path::GetFileNameFromPathWithoutExt(std::string filePath) { if (filePath.empty()) { return ""; } std::string fileName = GetFileNameFromPath(filePath); return GetFileNameWithoutExt(fileName); } std::string Path::GetFileExt(std::string fileName) { if (fileName.empty()) { return ""; } size_t i = fileName.find_last_of(FILE_EXT_DELIMITER_CHAR); if (i == std::string::npos) { return fileName; } return fileName.substr(i + 1); } //----------------------------------- #ifdef _WINDOWS void FCEUD_MakePathDirs(const char *fname) { char Path[MAX_PATH]; const char* div = fname; do { const char* fptr = strchr(div, '\\'); if(!fptr) { fptr = strchr(div, '/'); } if(!fptr) { break; } int off = fptr - fname; strncpy(Path, fname, off); Path[off] = '\0'; mkdir(Path); div = fptr + 1; while(div[0] == '\\' || div[0] == '/') { div++; } } while(1); } #endif //------------------------------