327 lines
6.0 KiB
C++
327 lines
6.0 KiB
C++
|
/*=========================================================================
|
|||
|
|
|||
|
GFNAME.HPP
|
|||
|
|
|||
|
Author: Gary Liddon @ Watford
|
|||
|
Created: 2nd March 1991
|
|||
|
Purpose: Filename manipulation class
|
|||
|
|
|||
|
Copyright (c) 1991-1997 Gary Lidon
|
|||
|
|
|||
|
===========================================================================*/
|
|||
|
|
|||
|
/*----------------------------------------------------------------------
|
|||
|
Includes
|
|||
|
-------- */
|
|||
|
|
|||
|
/* Std Lib
|
|||
|
------- */
|
|||
|
#include <fstream>
|
|||
|
|
|||
|
/* Glib
|
|||
|
---- */
|
|||
|
|
|||
|
|
|||
|
/* Local
|
|||
|
----- */
|
|||
|
#include "gfname.hpp"
|
|||
|
#include "gstring.hpp"
|
|||
|
|
|||
|
using namespace std;
|
|||
|
|
|||
|
/*----------------------------------------------------------------------
|
|||
|
Function: Destructor
|
|||
|
---------------------------------------------------------------------- */
|
|||
|
GFName::~GFName(void)
|
|||
|
{
|
|||
|
}
|
|||
|
|
|||
|
/*----------------------------------------------------------------------
|
|||
|
Function: Constructor
|
|||
|
---------------------------------------------------------------------- */
|
|||
|
GFName::GFName(void)
|
|||
|
{
|
|||
|
TDrive[0]=0;
|
|||
|
TPath[0]=0;
|
|||
|
TDir[0]=0;
|
|||
|
TFile[0]=0;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/*----------------------------------------------------------------------
|
|||
|
Function: Constructor witn
|
|||
|
---------------------------------------------------------------------- */
|
|||
|
GFName::GFName(const char *zfname)
|
|||
|
{
|
|||
|
FullName(zfname);
|
|||
|
}
|
|||
|
|
|||
|
void GFName::FullName(const char *zfname)
|
|||
|
{
|
|||
|
if (zfname)
|
|||
|
{
|
|||
|
_splitpath(zfname,TDrive,TDir,TFile,TExt);
|
|||
|
|
|||
|
if (strlen(TDir) > 1)
|
|||
|
{
|
|||
|
if (TDir[strlen(TDir)-1]=='\\')
|
|||
|
TDir[strlen(TDir)-1]=0;
|
|||
|
}
|
|||
|
|
|||
|
Ext(TExt);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
TDrive[0]=0;
|
|||
|
TPath[0]=0;
|
|||
|
TDir[0]=0;
|
|||
|
TFile[0]=0;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/*----------------------------------------------------------------------
|
|||
|
Function: Make a full name
|
|||
|
---------------------------------------------------------------------- */
|
|||
|
char const *GFName::FullName(void)
|
|||
|
{
|
|||
|
_makepath(TPath,TDrive,TDir,TFile,TExt);
|
|||
|
return RetStr(TPath);
|
|||
|
}
|
|||
|
|
|||
|
const char * GFName::RetStr(const char * Val)
|
|||
|
{
|
|||
|
if (Val[0]=='\0')
|
|||
|
return(NULL);
|
|||
|
else
|
|||
|
return(Val);
|
|||
|
}
|
|||
|
|
|||
|
void GFName::SetStr(char * Dest,char const * Source)
|
|||
|
{
|
|||
|
if (Source)
|
|||
|
{
|
|||
|
char Temp[1000];
|
|||
|
strcpy(Temp,Source);
|
|||
|
strcpy(Dest,Temp);
|
|||
|
}
|
|||
|
else
|
|||
|
Dest[0]=0;
|
|||
|
}
|
|||
|
|
|||
|
/*----------------------------------------------------------------------
|
|||
|
Function: Make a full name
|
|||
|
---------------------------------------------------------------------- */
|
|||
|
void GFName::AddDir(char const *add)
|
|||
|
{
|
|||
|
GString CurrDir;
|
|||
|
CurrDir=Dir();
|
|||
|
|
|||
|
CurrDir+="\\";
|
|||
|
CurrDir+=add;
|
|||
|
Dir(CurrDir);
|
|||
|
}
|
|||
|
|
|||
|
#define FF_PATHNAMEMAX _MAX_PATH+1
|
|||
|
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
// Convert relative to absolute paths
|
|||
|
// <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
char *GFName::makeabsolute(char const *basepath,char const *offset, char * outstr)
|
|||
|
{
|
|||
|
int i, j, len;
|
|||
|
char basefilename[FF_PATHNAMEMAX];
|
|||
|
|
|||
|
if (offset[1] == ':') // Drive letter makes it absolute
|
|||
|
strcpy(outstr, offset);
|
|||
|
else
|
|||
|
{
|
|||
|
// Find path of the file
|
|||
|
strcpy(outstr, basepath);
|
|||
|
j = 0;
|
|||
|
len = strlen(outstr);
|
|||
|
for (i = len - 1; i >= 0; i--)
|
|||
|
if (outstr[i] == '\\')
|
|||
|
break;
|
|||
|
else
|
|||
|
outstr[i] = 0;
|
|||
|
|
|||
|
// Find the filename
|
|||
|
if (i > 0)
|
|||
|
strcpy(basefilename, &basepath[i+1]);
|
|||
|
else
|
|||
|
basefilename[0] = 0;
|
|||
|
len = strlen(basefilename);
|
|||
|
for (i = len - 1; i >= 0; i--)
|
|||
|
{
|
|||
|
if (basefilename[i] == '.')
|
|||
|
{
|
|||
|
basefilename[i] = 0;
|
|||
|
break;
|
|||
|
}
|
|||
|
else
|
|||
|
basefilename[i] = 0;
|
|||
|
}
|
|||
|
|
|||
|
// Is it from the root directory?
|
|||
|
if (offset[0] == '\\')
|
|||
|
{
|
|||
|
outstr[2] = 0; // Leave only the drive letter
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
// Parse the ../ paths
|
|||
|
while ((offset[j] == '.') && (offset[j+1] == '.') &&
|
|||
|
(offset[j+2] == '\\'))
|
|||
|
{
|
|||
|
len = strlen(outstr);
|
|||
|
if (len > 1)
|
|||
|
outstr[len-1] = 0;
|
|||
|
for (i = len - 2; i >= 0; i--)
|
|||
|
if (outstr[i] == '\\')
|
|||
|
break;
|
|||
|
else
|
|||
|
outstr[i] = 0;
|
|||
|
j += 3;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// Add the remaining offset to the name
|
|||
|
|
|||
|
len = strlen(outstr);
|
|||
|
|
|||
|
|
|||
|
while (offset[j])
|
|||
|
{
|
|||
|
/* if (offset[j] == '#') // Same filename
|
|||
|
{
|
|||
|
strcat(outstr, basefilename);
|
|||
|
len = strlen(outstr);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
outstr[len++] = offset[j];
|
|||
|
outstr[len] = 0;
|
|||
|
}
|
|||
|
*/
|
|||
|
outstr[len++] = offset[j];
|
|||
|
outstr[len] = 0;
|
|||
|
j++;
|
|||
|
}
|
|||
|
}
|
|||
|
return outstr;
|
|||
|
}
|
|||
|
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
// Convert absolute to relative paths
|
|||
|
// <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
char *GFName::makerelative(char const *basepath,char const *newpath, char *outstr)
|
|||
|
{
|
|||
|
char temp1[FF_PATHNAMEMAX];
|
|||
|
char temp2[FF_PATHNAMEMAX];
|
|||
|
int i, j, match;
|
|||
|
|
|||
|
// Are the filenames the same?
|
|||
|
match = 0;
|
|||
|
for (j = 0; j < FF_PATHNAMEMAX; j++)
|
|||
|
{
|
|||
|
if (basepath[j] != newpath[j])
|
|||
|
{
|
|||
|
match = 0;
|
|||
|
break;
|
|||
|
}
|
|||
|
else if (basepath[j] == '.') // Matching
|
|||
|
{
|
|||
|
match = 1;
|
|||
|
break;
|
|||
|
}
|
|||
|
else if (basepath[j] == 0) // Identical
|
|||
|
{
|
|||
|
match = 0;
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
if (match) // Matching paths and filenames
|
|||
|
{
|
|||
|
strcpy(outstr, "#");
|
|||
|
strcat(outstr, &newpath[j]);
|
|||
|
}
|
|||
|
else if (basepath[0] != newpath[0]) // Drive letters are different
|
|||
|
strcpy(outstr, newpath);
|
|||
|
else
|
|||
|
{
|
|||
|
// Find the paths
|
|||
|
strcpy(temp1, basepath);
|
|||
|
for (i = strlen(temp1) - 1; i >= 0; i--)
|
|||
|
if (temp1[i] == '\\')
|
|||
|
break;
|
|||
|
else
|
|||
|
temp1[i] = 0;
|
|||
|
|
|||
|
strcpy(temp2, newpath);
|
|||
|
for (i = strlen(temp2) - 1; i >= 0; i--)
|
|||
|
if (temp2[i] == '\\')
|
|||
|
break;
|
|||
|
else
|
|||
|
temp2[i] = 0;
|
|||
|
|
|||
|
// Are the paths the same?
|
|||
|
strcpy(outstr, "");
|
|||
|
if (strcmp(temp1, temp2) == 0) // Paths are the same
|
|||
|
{
|
|||
|
j = strlen(temp1);
|
|||
|
}
|
|||
|
else // Paths are different
|
|||
|
{
|
|||
|
j = 2; // Drives are the same
|
|||
|
// Find different bits
|
|||
|
for (i = 0; i < (int) strlen(temp1); i++)
|
|||
|
{
|
|||
|
if ((temp1[i] == '\\') && (temp2[i] == '\\'))
|
|||
|
j = i + 1;
|
|||
|
else
|
|||
|
if (temp1[i] != temp2[i])
|
|||
|
break;
|
|||
|
}
|
|||
|
if (j > 3)
|
|||
|
{
|
|||
|
for (i = j; i < (int) strlen(temp1); i++)
|
|||
|
if (temp1[i] == '\\')
|
|||
|
strcat(outstr,"..\\");
|
|||
|
}
|
|||
|
else
|
|||
|
j = 2;
|
|||
|
}
|
|||
|
strcat(outstr, &newpath[j]);
|
|||
|
}
|
|||
|
return outstr;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
ostream & operator<<(ostream & str,GFName & Name)
|
|||
|
{
|
|||
|
str<<"!";
|
|||
|
|
|||
|
if (Name.FullName())
|
|||
|
str<<Name.FullName();
|
|||
|
|
|||
|
if (Name.Dir())
|
|||
|
str<<"!"<<Name.Dir();
|
|||
|
|
|||
|
if (Name.File())
|
|||
|
str<<"!"<<Name.File();
|
|||
|
|
|||
|
if (Name.Ext())
|
|||
|
str<<"!"<<Name.Ext();
|
|||
|
|
|||
|
str<<"!";
|
|||
|
|
|||
|
return(str);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/*===========================================================================
|
|||
|
end */
|