|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#include "tfilepath.h"
|
|
Toshihiro Shimizu |
890ddd |
#include <math.h></math.h>
|
|
Toshihiro Shimizu |
890ddd |
#include <ctype.h></ctype.h>
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#ifdef WIN32
|
|
Toshihiro Shimizu |
890ddd |
const char slash = '\\';
|
|
Toshihiro Shimizu |
890ddd |
const char auxslash = '/';
|
|
Toshihiro Shimizu |
890ddd |
#else
|
|
Toshihiro Shimizu |
890ddd |
const char slash = '/';
|
|
Toshihiro Shimizu |
890ddd |
const char auxslash = '\\';
|
|
Toshihiro Shimizu |
890ddd |
#endif
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//=============================================================================
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//TFrameId::operator string() const
|
|
Toshihiro Shimizu |
890ddd |
string TFrameId::expand(FrameFormat format) const
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
if (m_frame == EMPTY_FRAME)
|
|
Toshihiro Shimizu |
890ddd |
return "";
|
|
Toshihiro Shimizu |
890ddd |
else if (m_frame == NO_FRAME)
|
|
Toshihiro Shimizu |
890ddd |
return "-";
|
|
Toshihiro Shimizu |
890ddd |
char buffer[80];
|
|
Toshihiro Shimizu |
890ddd |
ostrstream o_buff(buffer, sizeof(buffer));
|
|
Toshihiro Shimizu |
890ddd |
if (format == FOUR_ZEROS) {
|
|
Toshihiro Shimizu |
890ddd |
o_buff.fill('0');
|
|
Toshihiro Shimizu |
890ddd |
o_buff.width(4);
|
|
Toshihiro Shimizu |
890ddd |
o_buff << m_frame;
|
|
Toshihiro Shimizu |
890ddd |
o_buff.width(0);
|
|
Toshihiro Shimizu |
890ddd |
} else {
|
|
Toshihiro Shimizu |
890ddd |
o_buff << m_frame;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
if (m_letter != '\0')
|
|
Toshihiro Shimizu |
890ddd |
o_buff << m_letter;
|
|
Toshihiro Shimizu |
890ddd |
int len = o_buff.pcount();
|
|
Toshihiro Shimizu |
890ddd |
return string(buffer, len);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
const TFrameId &TFrameId::operator++()
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
++m_frame;
|
|
Toshihiro Shimizu |
890ddd |
m_letter = 0;
|
|
Toshihiro Shimizu |
890ddd |
return *this;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
const TFrameId &TFrameId::operator--()
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
if (m_letter > 0)
|
|
Toshihiro Shimizu |
890ddd |
m_letter = 0;
|
|
Toshihiro Shimizu |
890ddd |
else
|
|
Toshihiro Shimizu |
890ddd |
--m_frame;
|
|
Toshihiro Shimizu |
890ddd |
return *this;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//=============================================================================
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
inline bool isSlash(char c)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
return c == slash || c == auxslash;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
// cerca l'ultimo '/' o '\'. Se non c'e' ritorna -1
|
|
Toshihiro Shimizu |
890ddd |
// di modo che la sottostringa che parte da getLastSlash() + 1 e' nome.frame.tipo
|
|
Toshihiro Shimizu |
890ddd |
inline int getLastSlash(const string &path)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
int i;
|
|
Toshihiro Shimizu |
890ddd |
for (i = path.length() - 1; i >= 0 && !isSlash(path[i]); i--) {
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
return i;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void TFilePath::setPath(string path)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
bool isUncName = false;
|
|
Toshihiro Shimizu |
890ddd |
// elimino i '//', './' e '/' finali; raddrizzo gli slash 'storti'.
|
|
Toshihiro Shimizu |
890ddd |
// se il path comincia con "<alpha>:" aggiungo uno slash</alpha>
|
|
Toshihiro Shimizu |
890ddd |
int length = path.length();
|
|
Toshihiro Shimizu |
890ddd |
int pos = 0;
|
|
Toshihiro Shimizu |
890ddd |
if (path.length() >= 2 && isalpha(path[0]) && path[1] == ':') {
|
|
Toshihiro Shimizu |
890ddd |
m_path.append(path, 0, 2);
|
|
Toshihiro Shimizu |
890ddd |
pos = 2;
|
|
Toshihiro Shimizu |
890ddd |
if (path.length() == 2 || !isSlash(path[pos]))
|
|
Toshihiro Shimizu |
890ddd |
m_path.append(1, slash);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
#ifdef WIN32
|
|
Toshihiro Shimizu |
890ddd |
else //se si tratta di un path in formato UNC e' del tipo "\\\\MachineName"
|
|
Toshihiro Shimizu |
890ddd |
if (path.length() >= 3 && path[0] == '\\' && path[1] == '\\' && isalpha(path[2])) {
|
|
Toshihiro Shimizu |
890ddd |
isUncName = true;
|
|
Toshihiro Shimizu |
890ddd |
m_path.append(path, 0, 3);
|
|
Toshihiro Shimizu |
890ddd |
pos = 3;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
#endif
|
|
Toshihiro Shimizu |
890ddd |
for (; pos < length; pos++)
|
|
Toshihiro Shimizu |
890ddd |
if (path[pos] == '.') {
|
|
Toshihiro Shimizu |
890ddd |
pos++;
|
|
Toshihiro Shimizu |
890ddd |
if (pos >= length) {
|
|
Toshihiro Shimizu |
890ddd |
if (pos > 1)
|
|
Toshihiro Shimizu |
890ddd |
m_path.append(1, '.');
|
|
Toshihiro Shimizu |
890ddd |
} else if (!isSlash(path[pos]))
|
|
Toshihiro Shimizu |
890ddd |
m_path.append(path, pos - 1, 2);
|
|
Toshihiro Shimizu |
890ddd |
else {
|
|
Toshihiro Shimizu |
890ddd |
while (pos + 1 < length && isSlash(path[pos + 1]))
|
|
Toshihiro Shimizu |
890ddd |
pos++;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
} else if (isSlash(path[pos])) {
|
|
Toshihiro Shimizu |
890ddd |
do
|
|
Toshihiro Shimizu |
890ddd |
pos++;
|
|
Toshihiro Shimizu |
890ddd |
while (pos < length && isSlash(path[pos]));
|
|
Toshihiro Shimizu |
890ddd |
pos--;
|
|
Toshihiro Shimizu |
890ddd |
m_path.append(1, slash);
|
|
Toshihiro Shimizu |
890ddd |
} else {
|
|
Toshihiro Shimizu |
890ddd |
m_path.append(1, path[pos]);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
// rimuovo l'eventuale '/' finale (a meno che m_path == "/" o m_path == "<letter>:\"</letter>
|
|
Toshihiro Shimizu |
890ddd |
// oppure sia UNC (Windows only) )
|
|
Toshihiro Shimizu |
890ddd |
if (!(m_path.length() == 1 && m_path[0] == slash ||
|
|
Toshihiro Shimizu |
890ddd |
m_path.length() == 3 && isalpha(m_path[0]) && m_path[1] == ':' && m_path[2] == slash) &&
|
|
Toshihiro Shimizu |
890ddd |
m_path.length() > 1 && m_path[m_path.length() - 1] == slash)
|
|
Toshihiro Shimizu |
890ddd |
m_path.erase(m_path.length() - 1, 1);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
if (isUncName && m_path.find_last_of('\\') == 1) // e' indicato solo il nome della macchina...
|
|
Toshihiro Shimizu |
890ddd |
m_path.append(1, slash);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TFilePath::TFilePath(string path)
|
|
Toshihiro Shimizu |
890ddd |
: m_path("")
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
setPath(path);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TFilePath::TFilePath(const char *path)
|
|
Toshihiro Shimizu |
890ddd |
: m_path("")
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
setPath(string(path));
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
bool TFilePath::operator==(const TFilePath &fp) const
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
#ifdef WIN32
|
|
Toshihiro Shimizu |
890ddd |
return stricmp(m_path.c_str(), fp.m_path.c_str()) == 0;
|
|
Toshihiro Shimizu |
890ddd |
#else
|
|
Toshihiro Shimizu |
890ddd |
return m_path == fp.m_path;
|
|
Toshihiro Shimizu |
890ddd |
#endif
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
bool TFilePath::operator<(const TFilePath &fp) const
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
string iName = m_path;
|
|
Toshihiro Shimizu |
890ddd |
string jName = fp.m_path;
|
|
Toshihiro Shimizu |
890ddd |
int i1 = 0, j1 = 0;
|
|
Toshihiro Shimizu |
890ddd |
int i2 = m_path.find("\\");
|
|
Toshihiro Shimizu |
890ddd |
int j2 = fp.m_path.find("\\");
|
|
Toshihiro Shimizu |
890ddd |
if (i2 == j2 && j2 == -1)
|
|
Toshihiro Shimizu |
890ddd |
#ifdef WIN32
|
|
Toshihiro Shimizu |
890ddd |
return stricmp(m_path.c_str(), fp.m_path.c_str()) < 0;
|
|
Toshihiro Shimizu |
890ddd |
#else
|
|
Toshihiro Shimizu |
890ddd |
return m_path < fp.m_path;
|
|
Toshihiro Shimizu |
890ddd |
#endif
|
|
Toshihiro Shimizu |
890ddd |
if (!i2) {
|
|
Toshihiro Shimizu |
890ddd |
++i1;
|
|
Toshihiro Shimizu |
890ddd |
i2 = m_path.find("\\", i1);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
if (!j2) {
|
|
Toshihiro Shimizu |
890ddd |
++j1;
|
|
Toshihiro Shimizu |
890ddd |
j2 = fp.m_path.find("\\", j1);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
while (i2 != -1 || j2 != -1) {
|
|
Toshihiro Shimizu |
890ddd |
iName = m_path.substr(i1, i2 - i1);
|
|
Toshihiro Shimizu |
890ddd |
jName = fp.m_path.substr(j1, j2 - j1);
|
|
Toshihiro Shimizu |
890ddd |
//se le due parti di path, conpresi tra slash sono uguali
|
|
Toshihiro Shimizu |
890ddd |
//itero il processo di confronto altrimenti ritorno
|
|
Toshihiro Shimizu |
890ddd |
#ifdef WIN32
|
|
Toshihiro Shimizu |
890ddd |
char differ;
|
|
Toshihiro Shimizu |
890ddd |
differ = stricmp(iName.c_str(), jName.c_str());
|
|
Toshihiro Shimizu |
890ddd |
if (differ != 0)
|
|
Toshihiro Shimizu |
890ddd |
return differ < 0 ? true : false;
|
|
Toshihiro Shimizu |
890ddd |
#else
|
|
Toshihiro Shimizu |
890ddd |
if (TFilePath(iName) != TFilePath(jName))
|
|
Toshihiro Shimizu |
890ddd |
return TFilePath(iName) < TFilePath(jName);
|
|
Toshihiro Shimizu |
890ddd |
#endif
|
|
Toshihiro Shimizu |
890ddd |
i1 = i2 + 1;
|
|
Toshihiro Shimizu |
890ddd |
j1 = j2 + 1;
|
|
Toshihiro Shimizu |
890ddd |
i2 = m_path.find("\\", i1);
|
|
Toshihiro Shimizu |
890ddd |
j2 = fp.m_path.find("\\", j1);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
iName = m_path.substr(i1, m_path.size() - i1);
|
|
Toshihiro Shimizu |
890ddd |
jName = fp.m_path.substr(j1, fp.m_path.size() - j1);
|
|
Toshihiro Shimizu |
890ddd |
#ifdef WIN32
|
|
Toshihiro Shimizu |
890ddd |
return stricmp(iName.c_str(), jName.c_str()) < 0;
|
|
Toshihiro Shimizu |
890ddd |
#else
|
|
Toshihiro Shimizu |
890ddd |
return TFilePath(iName) < TFilePath(jName);
|
|
Toshihiro Shimizu |
890ddd |
#endif
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TFilePath &TFilePath::operator+=(const TFilePath &fp)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
assert(!fp.isAbsolute());
|
|
Toshihiro Shimizu |
890ddd |
if (fp.isEmpty())
|
|
Toshihiro Shimizu |
890ddd |
return *this;
|
|
Toshihiro Shimizu |
890ddd |
else if (isEmpty()) {
|
|
Toshihiro Shimizu |
890ddd |
*this = fp;
|
|
Toshihiro Shimizu |
890ddd |
return *this;
|
|
Toshihiro Shimizu |
890ddd |
} else if (m_path.length() != 1 || m_path[0] != slash) {
|
|
Toshihiro Shimizu |
890ddd |
*this = TFilePath(m_path + slash + fp.m_path);
|
|
Toshihiro Shimizu |
890ddd |
return *this;
|
|
Toshihiro Shimizu |
890ddd |
} else {
|
|
Toshihiro Shimizu |
890ddd |
*this = TFilePath(m_path + fp.m_path);
|
|
Toshihiro Shimizu |
890ddd |
return *this;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
TFilePath TFilePath::operator+(const TFilePath &fp) const
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
TFilePath ret(*this);
|
|
Toshihiro Shimizu |
890ddd |
ret += fp;
|
|
Toshihiro Shimizu |
890ddd |
return ret;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
/*
|
|
Toshihiro Shimizu |
890ddd |
TFilePath TFilePath::operator+ (const TFilePath &fp) const
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
assert(!fp.isAbsolute());
|
|
Toshihiro Shimizu |
890ddd |
if(fp.isEmpty()) return *this;
|
|
Toshihiro Shimizu |
890ddd |
else if(isEmpty()) return fp;
|
|
Toshihiro Shimizu |
890ddd |
else if(m_path.length()!=1 || m_path[0] != slash)
|
|
Toshihiro Shimizu |
890ddd |
return TFilePath(m_path + slash + fp.m_path);
|
|
Toshihiro Shimizu |
890ddd |
else
|
|
Toshihiro Shimizu |
890ddd |
return TFilePath(m_path + fp.m_path);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
*/
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
bool TFilePath::isAbsolute() const
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
return m_path.length() >= 1 && m_path[0] == slash ||
|
|
Toshihiro Shimizu |
890ddd |
m_path.length() >= 2 && isalpha(m_path[0]) && m_path[1] == ':';
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
bool TFilePath::isRoot() const
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
return m_path.length() == 1 && m_path[0] == slash ||
|
|
Toshihiro Shimizu |
890ddd |
m_path.length() == 3 && isalpha(m_path[0]) && m_path[1] == ':' && m_path[2] == slash;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
// ritorna ""(niente tipo, niente punto), "." (file con tipo) o ".." (file con tipo e frame)
|
|
Toshihiro Shimizu |
890ddd |
string TFilePath::getDots() const
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
int i = getLastSlash(m_path);
|
|
Toshihiro Shimizu |
890ddd |
string str = m_path.substr(i + 1);
|
|
Toshihiro Shimizu |
890ddd |
// potrei anche avere a.b.c.d dove d e' l'estensione
|
|
Toshihiro Shimizu |
890ddd |
i = str.rfind(".");
|
|
Toshihiro Shimizu |
890ddd |
if (i == string::npos || str == "..")
|
|
Toshihiro Shimizu |
890ddd |
return "";
|
|
Toshihiro Shimizu |
890ddd |
return str.substr(0, i).rfind(".") == string::npos ? "." : "..";
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
string TFilePath::getDottedType() const // ritorna l'estensione con PUNTO (se c'e')
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
int i = getLastSlash(m_path);
|
|
Toshihiro Shimizu |
890ddd |
string str = m_path.substr(i + 1);
|
|
Toshihiro Shimizu |
890ddd |
i = str.rfind(".");
|
|
Toshihiro Shimizu |
890ddd |
if (i == string::npos)
|
|
Toshihiro Shimizu |
890ddd |
return "";
|
|
Toshihiro Shimizu |
890ddd |
#ifdef WIN32
|
|
Toshihiro Shimizu |
890ddd |
return toLower(str.substr(i));
|
|
Toshihiro Shimizu |
890ddd |
#else
|
|
Toshihiro Shimizu |
890ddd |
return str.substr(i);
|
|
Toshihiro Shimizu |
890ddd |
#endif
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
string TFilePath::getUndottedType() const // ritorna l'estensione senza PUNTO
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
size_t i = getLastSlash(m_path);
|
|
Toshihiro Shimizu |
890ddd |
string str = m_path.substr(i + 1);
|
|
Toshihiro Shimizu |
890ddd |
i = str.rfind(".");
|
|
Toshihiro Shimizu |
890ddd |
if (i == string::npos || i == str.length() - 1)
|
|
Toshihiro Shimizu |
890ddd |
return "";
|
|
Toshihiro Shimizu |
890ddd |
#ifdef WIN32
|
|
Toshihiro Shimizu |
890ddd |
return toLower(str.substr(i + 1));
|
|
Toshihiro Shimizu |
890ddd |
#else
|
|
Toshihiro Shimizu |
890ddd |
return str.substr(i + 1);
|
|
Toshihiro Shimizu |
890ddd |
#endif
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
string TFilePath::getName() const // noDot! noSlash!
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
int i = getLastSlash(m_path); //cerco l'ultimo slash
|
|
Toshihiro Shimizu |
890ddd |
string str = m_path.substr(i + 1);
|
|
Toshihiro Shimizu |
890ddd |
i = str.rfind(".");
|
|
Toshihiro Shimizu |
890ddd |
if (i == string::npos)
|
|
Toshihiro Shimizu |
890ddd |
return str;
|
|
Toshihiro Shimizu |
890ddd |
int j = str.substr(0, i).rfind(".");
|
|
Toshihiro Shimizu |
890ddd |
if (j != string::npos)
|
|
Toshihiro Shimizu |
890ddd |
i = j;
|
|
Toshihiro Shimizu |
890ddd |
return str.substr(0, i);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
// es. TFilePath("/pippo/pluto.0001.gif").getLevelName() == "pluto..gif"
|
|
Toshihiro Shimizu |
890ddd |
string TFilePath::getLevelName() const
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
int i = getLastSlash(m_path); //cerco l'ultimo slash
|
|
Toshihiro Shimizu |
890ddd |
string str = m_path.substr(i + 1); // str e' m_path senza directory
|
|
Toshihiro Shimizu |
890ddd |
i = str.find("."); // posizione del primo punto di str
|
|
Toshihiro Shimizu |
890ddd |
if (i == string::npos)
|
|
Toshihiro Shimizu |
890ddd |
return str; // no frame; no type
|
|
Toshihiro Shimizu |
890ddd |
int j = str.rfind("."); // str[j..] = ".type"
|
|
Toshihiro Shimizu |
890ddd |
if (j == i || j - i == 1) //prova.tif o prova..tif
|
|
Toshihiro Shimizu |
890ddd |
return str;
|
|
Toshihiro Shimizu |
890ddd |
else //prova.0001.tif
|
|
Toshihiro Shimizu |
890ddd |
return str.erase(i + 1, j - i - 1);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TFilePath TFilePath::getParentDir() const // noSlash!
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
int i = getLastSlash(m_path); //cerco l'ultimo slash
|
|
Toshihiro Shimizu |
890ddd |
if (i < 0) {
|
|
Toshihiro Shimizu |
890ddd |
if (m_path.length() >= 2 && ('a' <= m_path[0] && m_path[0] <= 'z' || 'A' <= m_path[0] && m_path[0] <= 'Z') && m_path[1] == ':')
|
|
Toshihiro Shimizu |
890ddd |
return TFilePath(m_path.substr(0, 2));
|
|
Toshihiro Shimizu |
890ddd |
else
|
|
Toshihiro Shimizu |
890ddd |
return TFilePath("");
|
|
Toshihiro Shimizu |
890ddd |
} else if (i == 0)
|
|
Toshihiro Shimizu |
890ddd |
return TFilePath("/");
|
|
Toshihiro Shimizu |
890ddd |
else
|
|
Toshihiro Shimizu |
890ddd |
return TFilePath(m_path.substr(0, i));
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TFrameId TFilePath::getFrame() const
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
int i = getLastSlash(m_path); //cerco l'ultimo slash
|
|
Toshihiro Shimizu |
890ddd |
string str = m_path.substr(i + 1); // str e' il path senza parentdir
|
|
Toshihiro Shimizu |
890ddd |
i = str.rfind('.');
|
|
Toshihiro Shimizu |
890ddd |
if (i == string::npos || str == "." || str == "..")
|
|
Toshihiro Shimizu |
890ddd |
return TFrameId(TFrameId::NO_FRAME);
|
|
Toshihiro Shimizu |
890ddd |
int j = str.substr(0, i).rfind('.');
|
|
Toshihiro Shimizu |
890ddd |
if (j == string::npos)
|
|
Toshihiro Shimizu |
890ddd |
return TFrameId(TFrameId::NO_FRAME);
|
|
Toshihiro Shimizu |
890ddd |
if (i == j + 1)
|
|
Toshihiro Shimizu |
890ddd |
return TFrameId(TFrameId::EMPTY_FRAME);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
int k, number = 0;
|
|
Toshihiro Shimizu |
890ddd |
for (k = j + 1; k < i && isdigit(str[k]); k++)
|
|
Toshihiro Shimizu |
890ddd |
number = number * 10 + str[k] - '0';
|
|
Toshihiro Shimizu |
890ddd |
char letter = '\0';
|
|
Toshihiro Shimizu |
890ddd |
if (isalpha(str[k]))
|
|
Toshihiro Shimizu |
890ddd |
letter = str[k++];
|
|
Toshihiro Shimizu |
890ddd |
if (number == 0 || k < i)
|
|
Toshihiro Shimizu |
890ddd |
throw TMalformedFrameException();
|
|
Toshihiro Shimizu |
890ddd |
return TFrameId(number, letter);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TFilePath TFilePath::withType(const string &type) const
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
const string dotDot = "..";
|
|
Toshihiro Shimizu |
890ddd |
assert(type.length() < 2 || type.substr(0, 2) != dotDot);
|
|
Toshihiro Shimizu |
890ddd |
int i = getLastSlash(m_path); //cerco l'ultimo slash
|
|
Toshihiro Shimizu |
890ddd |
string str = m_path.substr(i + 1); // str e' il path senza parentdir
|
|
Toshihiro Shimizu |
890ddd |
int j = str.rfind('.');
|
|
Toshihiro Shimizu |
890ddd |
if (j == string::npos || str == dotDot)
|
|
Toshihiro Shimizu |
890ddd |
// il path originale non ha tipo
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
if (type == "")
|
|
Toshihiro Shimizu |
890ddd |
return *this;
|
|
Toshihiro Shimizu |
890ddd |
else if (type[0] == '.')
|
|
Toshihiro Shimizu |
890ddd |
return TFilePath(m_path + type);
|
|
Toshihiro Shimizu |
890ddd |
else
|
|
Toshihiro Shimizu |
890ddd |
return TFilePath(m_path + "." + type);
|
|
Toshihiro Shimizu |
890ddd |
} else
|
|
Toshihiro Shimizu |
890ddd |
// il path originale ha gia' il tipo
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
if (type == "")
|
|
Toshihiro Shimizu |
890ddd |
return TFilePath(m_path.substr(0, i + j + 1));
|
|
Toshihiro Shimizu |
890ddd |
else if (type[0] == '.')
|
|
Toshihiro Shimizu |
890ddd |
return TFilePath(m_path.substr(0, i + j + 1) + type);
|
|
Toshihiro Shimizu |
890ddd |
else
|
|
Toshihiro Shimizu |
890ddd |
return TFilePath(m_path.substr(0, i + j + 2) + type);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TFilePath TFilePath::withName(const string &name) const
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
int i = getLastSlash(m_path); //cerco l'ultimo slash
|
|
Toshihiro Shimizu |
890ddd |
string str = m_path.substr(i + 1); // str e' il path senza parentdir
|
|
Toshihiro Shimizu |
890ddd |
int j = str.rfind('.');
|
|
Toshihiro Shimizu |
890ddd |
if (j == string::npos)
|
|
Toshihiro Shimizu |
890ddd |
return TFilePath(m_path.substr(0, i + 1) + name);
|
|
Toshihiro Shimizu |
890ddd |
int k = str.substr(0, j).rfind(".");
|
|
Toshihiro Shimizu |
890ddd |
if (k == string::npos)
|
|
Toshihiro Shimizu |
890ddd |
k = j;
|
|
Toshihiro Shimizu |
890ddd |
return TFilePath(m_path.substr(0, i + 1) + name + str.substr(k));
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TFilePath TFilePath::withParentDir(const TFilePath &dir) const
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
int i = getLastSlash(m_path); //cerco l'ultimo slash
|
|
Toshihiro Shimizu |
890ddd |
return dir + TFilePath(m_path.substr(i + 1));
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TFilePath TFilePath::withFrame(const TFrameId &frame, TFrameId::FrameFormat format) const
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
const string dot = ".", dotDot = "..";
|
|
Toshihiro Shimizu |
890ddd |
int i = getLastSlash(m_path); //cerco l'ultimo slash
|
|
Toshihiro Shimizu |
890ddd |
string str = m_path.substr(i + 1); // str e' il path senza parentdir
|
|
Toshihiro Shimizu |
890ddd |
assert(str != dot && str != dotDot);
|
|
Toshihiro Shimizu |
890ddd |
int j = str.rfind('.');
|
|
Toshihiro Shimizu |
890ddd |
if (j == string::npos) {
|
|
Toshihiro Shimizu |
890ddd |
if (frame.isEmptyFrame() || frame.isNoFrame())
|
|
Toshihiro Shimizu |
890ddd |
return *this;
|
|
Toshihiro Shimizu |
890ddd |
else
|
|
Toshihiro Shimizu |
890ddd |
return TFilePath(m_path + "." + frame.expand(format));
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
string frameString;
|
|
Toshihiro Shimizu |
890ddd |
if (frame.isNoFrame())
|
|
Toshihiro Shimizu |
890ddd |
frameString = "";
|
|
Toshihiro Shimizu |
890ddd |
else
|
|
Toshihiro Shimizu |
890ddd |
frameString = "." + frame.expand(format);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
int k = str.substr(0, j).rfind('.');
|
|
Toshihiro Shimizu |
890ddd |
if (k == string::npos)
|
|
Toshihiro Shimizu |
890ddd |
return TFilePath(m_path.substr(0, j + i + 1) + frameString + str.substr(j));
|
|
Toshihiro Shimizu |
890ddd |
else
|
|
Toshihiro Shimizu |
890ddd |
return TFilePath(m_path.substr(0, k + i + 1) + frameString + str.substr(j));
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
bool TFilePath::isAncestorOf(const TFilePath &fp) const
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
size_t len = m_path.length();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
if (len == 0) {
|
|
Toshihiro Shimizu |
890ddd |
// il punto e' antenato di tutti i path non assoluti
|
|
Toshihiro Shimizu |
890ddd |
return !fp.isAbsolute();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
return len < fp.m_path.length() // l'antenato deve essere piu' corto
|
|
Toshihiro Shimizu |
890ddd |
&& (m_path[len - 1] == slash // deve finire con slash se e' "/" o "C:\"
|
|
Toshihiro Shimizu |
890ddd |
|| fp.m_path[len] == slash) // negli altri casi ci deve essere uno slash subito dopo
|
|
Toshihiro Shimizu |
890ddd |
&&
|
|
Toshihiro Shimizu |
890ddd |
#ifdef WIN32
|
|
Toshihiro Shimizu |
890ddd |
toLower(m_path) == toLower(fp.m_path.substr(0, len));
|
|
Toshihiro Shimizu |
890ddd |
#else
|
|
Toshihiro Shimizu |
890ddd |
m_path == fp.m_path.substr(0, len);
|
|
Toshihiro Shimizu |
890ddd |
#endif
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TFilePath TFilePath::operator-(const TFilePath &fp) const
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
#ifdef WIN32
|
|
Toshihiro Shimizu |
890ddd |
if (toLower(m_path) == toLower(fp.m_path))
|
|
Toshihiro Shimizu |
890ddd |
return TFilePath("");
|
|
Toshihiro Shimizu |
890ddd |
#else
|
|
Toshihiro Shimizu |
890ddd |
if (m_path == fp.m_path)
|
|
Toshihiro Shimizu |
890ddd |
return TFilePath("");
|
|
Toshihiro Shimizu |
890ddd |
#endif
|
|
Toshihiro Shimizu |
890ddd |
if (!fp.isAncestorOf(*this))
|
|
Toshihiro Shimizu |
890ddd |
return *this;
|
|
Toshihiro Shimizu |
890ddd |
int len = fp.m_path.length();
|
|
Toshihiro Shimizu |
890ddd |
if (len == 0 || fp.m_path[len - 1] != slash)
|
|
Toshihiro Shimizu |
890ddd |
len++;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
return TFilePath(m_path.substr(len));
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
bool TFilePath::match(const TFilePath &fp) const
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
return getParentDir() == fp.getParentDir() &&
|
|
Toshihiro Shimizu |
890ddd |
getName() == fp.getName() &&
|
|
Toshihiro Shimizu |
890ddd |
getFrame() == fp.getFrame() &&
|
|
Toshihiro Shimizu |
890ddd |
getType() == fp.getType();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TFilePath TFilePath::decode(const std::map<string, string=""> &dictionary) const</string,>
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
TFilePath parent = getParentDir();
|
|
Toshihiro Shimizu |
890ddd |
TFilePath filename = withParentDir("");
|
|
Toshihiro Shimizu |
890ddd |
std::map<string, string="">::const_iterator it = dictionary.find(filename.getFullPath());</string,>
|
|
Toshihiro Shimizu |
890ddd |
if (it != dictionary.end())
|
|
Toshihiro Shimizu |
890ddd |
filename = TFilePath(it->second);
|
|
Toshihiro Shimizu |
890ddd |
if (parent.isEmpty())
|
|
Toshihiro Shimizu |
890ddd |
return filename;
|
|
Toshihiro Shimizu |
890ddd |
else
|
|
Toshihiro Shimizu |
890ddd |
return parent.decode(dictionary) + filename;
|
|
Toshihiro Shimizu |
890ddd |
}
|