mirror of
https://github.com/copyrighttxt/watrbx-game-engine.git
synced 2026-09-05 05:07:48 +00:00
GEEKING
This commit is contained in:
@@ -0,0 +1,216 @@
|
||||
/**
|
||||
@file fileutils.cpp
|
||||
|
||||
@author Morgan McGuire, graphics3d.com
|
||||
|
||||
@author 2002-06-06
|
||||
@edited 2010-02-05
|
||||
*/
|
||||
|
||||
#include <cstring>
|
||||
#include <cstdio>
|
||||
#include "G3D/platform.h"
|
||||
#include "G3D/fileutils.h"
|
||||
|
||||
#include "G3D/stringutils.h"
|
||||
|
||||
namespace G3D {
|
||||
|
||||
std::string pathConcat(const std::string& dirname, const std::string& file) {
|
||||
// Ensure that the directory ends in a slash
|
||||
if ((dirname.size() != 0) &&
|
||||
(dirname[dirname.size() - 1] != '/') &&
|
||||
(dirname[dirname.size() - 1] != '\\') &&
|
||||
(dirname[dirname.size() - 1] != ':')) {
|
||||
return dirname + '/' + file;
|
||||
} else {
|
||||
return dirname + file;
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void parseFilename(
|
||||
const std::string& filename,
|
||||
std::string& root,
|
||||
Array<std::string>& path,
|
||||
std::string& base,
|
||||
std::string& ext) {
|
||||
|
||||
std::string f = filename;
|
||||
|
||||
root = "";
|
||||
path.clear();
|
||||
base = "";
|
||||
ext = "";
|
||||
|
||||
if (f == "") {
|
||||
// Empty filename
|
||||
return;
|
||||
}
|
||||
|
||||
// See if there is a root/drive spec.
|
||||
if ((f.size() >= 2) && (f[1] == ':')) {
|
||||
|
||||
if ((f.size() > 2) && isSlash(f[2])) {
|
||||
|
||||
// e.g. c:\foo
|
||||
root = f.substr(0, 3);
|
||||
f = f.substr(3, f.size() - 3);
|
||||
|
||||
} else {
|
||||
|
||||
// e.g. c:foo
|
||||
root = f.substr(2);
|
||||
f = f.substr(2, f.size() - 2);
|
||||
|
||||
}
|
||||
|
||||
} else if ((f.size() >= 2) & isSlash(f[0]) && isSlash(f[1])) {
|
||||
|
||||
// e.g. //foo
|
||||
root = f.substr(0, 2);
|
||||
f = f.substr(2, f.size() - 2);
|
||||
|
||||
} else if (isSlash(f[0])) {
|
||||
|
||||
root = f.substr(0, 1);
|
||||
f = f.substr(1, f.size() - 1);
|
||||
|
||||
}
|
||||
|
||||
// Pull the extension off
|
||||
{
|
||||
// Find the period
|
||||
size_t i = f.rfind('.');
|
||||
|
||||
if (i != std::string::npos) {
|
||||
// Make sure it is after the last slash!
|
||||
size_t j = iMax(f.rfind('/'), f.rfind('\\'));
|
||||
if ((j == std::string::npos) || (i > j)) {
|
||||
ext = f.substr(i + 1, f.size() - i - 1);
|
||||
f = f.substr(0, i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Pull the basename off
|
||||
{
|
||||
// Find the last slash
|
||||
size_t i = iMax(f.rfind('/'), f.rfind('\\'));
|
||||
|
||||
if (i == std::string::npos) {
|
||||
|
||||
// There is no slash; the basename is the whole thing
|
||||
base = f;
|
||||
f = "";
|
||||
|
||||
} else if ((i != std::string::npos) && (i < f.size() - 1)) {
|
||||
|
||||
base = f.substr(i + 1, f.size() - i - 1);
|
||||
f = f.substr(0, i);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// Parse what remains into path.
|
||||
size_t prev, cur = 0;
|
||||
|
||||
while (cur < f.size()) {
|
||||
prev = cur;
|
||||
|
||||
// Allow either slash
|
||||
size_t i = f.find('/', prev + 1);
|
||||
size_t j = f.find('\\', prev + 1);
|
||||
if (i == std::string::npos) {
|
||||
i = f.size();
|
||||
}
|
||||
|
||||
if (j == std::string::npos) {
|
||||
j = f.size();
|
||||
}
|
||||
|
||||
cur = iMin(i, j);
|
||||
|
||||
if (cur == std::string::npos) {
|
||||
cur = f.size();
|
||||
}
|
||||
|
||||
path.append(f.substr(prev, cur - prev));
|
||||
++cur;
|
||||
}
|
||||
}
|
||||
|
||||
std::string filenameBaseExt(const std::string& filename) {
|
||||
int i = filename.rfind("/");
|
||||
int j = filename.rfind("\\");
|
||||
|
||||
if ((j > i) && (j >= 0)) {
|
||||
i = j;
|
||||
}
|
||||
|
||||
# ifdef G3D_WIN32
|
||||
j = filename.rfind(":");
|
||||
if ((i == -1) && (j >= 0)) {
|
||||
i = j;
|
||||
}
|
||||
# endif
|
||||
|
||||
if (i == -1) {
|
||||
return filename;
|
||||
} else {
|
||||
return filename.substr(i + 1, filename.length() - i);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
std::string filenameBase(const std::string& s) {
|
||||
std::string drive;
|
||||
std::string base;
|
||||
std::string ext;
|
||||
Array<std::string> path;
|
||||
|
||||
parseFilename(s, drive, path, base, ext);
|
||||
return base;
|
||||
}
|
||||
|
||||
|
||||
std::string filenameExt(const std::string& filename) {
|
||||
int i = filename.rfind(".");
|
||||
if (i >= 0) {
|
||||
return filename.substr(i + 1, filename.length() - i);
|
||||
} else {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
std::string filenamePath(const std::string& filename) {
|
||||
int i = filename.rfind("/");
|
||||
int j = filename.rfind("\\");
|
||||
|
||||
if ((j > i) && (j >= 0)) {
|
||||
i = j;
|
||||
}
|
||||
|
||||
# ifdef G3D_WIN32
|
||||
j = filename.rfind(":");
|
||||
if ((i == -1) && (j >= 0)) {
|
||||
i = j;
|
||||
}
|
||||
# endif
|
||||
|
||||
if (i == -1) {
|
||||
return "";
|
||||
} else {
|
||||
return filename.substr(0, i+1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
bool filenameContainsWildcards(const std::string& filename) {
|
||||
return (filename.find('*') != std::string::npos) || (filename.find('?') != std::string::npos);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user