mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-04-04 18:06:22 +03:00
Build tools are updated to support building with Visual Studion 2019 toolset ClangCL (LLVM clang-cl): - In CMake builds, use of unsupported option "-std=c++0x" is avoided - Tool genconf recognizes availability of ClangCL toolset and proposes it in the list - Tool genproj recognizes new compiler specification VCVER=vclang and generates VS 2019 projects for it Note that vclang configuration puts binaries to folder "vc14" as it is compatible with vc14 CRT. Code is updated to build with Clang for Windows without errors and warnings: - In BVH classes, pure virtual destructors are replaced by empty ones, to avoid bogus compiler warning - In .lex files, pragmas are added to disable warnings in parser code - In OSD, signature of function _osd_wnt_set_error() is corrected to avoid warning on incorrect use of va_args (undefined behavior) - In OSD_Host, OSD_Parallel_TBB, warnings on usage of deprecated function are disabled - In Quantity_ColorRGBA and ViewerTest_CmdParser, incorrect use of predefined macro __FUNCTION__ assuming it was a string literal is avoided - In Standard_Macro.hxx, code is reordered to handle Clang for Windows appropriately - In AdvApp2Var_SysBase.hxx, inclusion of obsolete (MSVC-specific) header file is replaced by Standard_TypeDef.hxx - In Standard_ErrorHandler.hxx, empty statements added to avoid warning on unused class fields - In IVtkDraw and ViewerTest, interface is corrected to use actual type avoiding unnecessary type casts Off-topic: corrections of some errors (uninitialized class fields) reported by VS Code Analysis in TKernel
1678 lines
39 KiB
C++
1678 lines
39 KiB
C++
// Copyright (c) 1998-1999 Matra Datavision
|
|
// Copyright (c) 1999-2014 OPEN CASCADE SAS
|
|
//
|
|
// This file is part of Open CASCADE Technology software library.
|
|
//
|
|
// This library is free software; you can redistribute it and/or modify it under
|
|
// the terms of the GNU Lesser General Public License version 2.1 as published
|
|
// by the Free Software Foundation, with special exception defined in the file
|
|
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
|
|
// distribution for complete text of the license and disclaimer of any warranty.
|
|
//
|
|
// Alternatively, this file may be used under the terms of Open CASCADE
|
|
// commercial license or contractual agreement.
|
|
|
|
|
|
#include <OSD_OSDError.hxx>
|
|
#include <OSD_Path.hxx>
|
|
#include <Standard_ConstructionError.hxx>
|
|
#include <Standard_NullObject.hxx>
|
|
#include <Standard_NumericError.hxx>
|
|
#include <Standard_ProgramError.hxx>
|
|
#include <TCollection_AsciiString.hxx>
|
|
|
|
static OSD_SysType whereAmI()
|
|
{
|
|
#if defined(__digital__) || defined(__FreeBSD__) || defined(SUNOS) || defined(__APPLE__) || defined(__QNX__) || defined(__FreeBSD_kernel__)
|
|
return OSD_UnixBSD;
|
|
#elif defined(sgi) || defined(IRIX) || defined(__sun) || defined(SOLARIS) || defined(__sco__) || defined(__hpux) || defined(HPUX)
|
|
return OSD_UnixSystemV;
|
|
#elif defined(__osf__) || defined(DECOSF1)
|
|
return OSD_OSF;
|
|
#elif defined(OS2)
|
|
return OSD_WindowsNT;
|
|
#elif defined(_WIN32) || defined(__WIN32__)
|
|
return OSD_WindowsNT;
|
|
#elif defined(__CYGWIN32_) || defined(__MINGW32__)
|
|
return OSD_WindowsNT;
|
|
#elif defined(vax) || defined(__vms)
|
|
return OSD_VMS;
|
|
#elif defined(__linux__) || defined(__linux)
|
|
return OSD_LinuxREDHAT;
|
|
#elif defined(__EMSCRIPTEN__)
|
|
return OSD_LinuxREDHAT;
|
|
#elif defined(_AIX) || defined(AIX)
|
|
return OSD_Aix;
|
|
#else
|
|
struct utsname info;
|
|
uname(&info);
|
|
std::cout << info.sysname << std::endl;
|
|
std::cout << info.nodename << std::endl;
|
|
std::cout << info.release << std::endl;
|
|
std::cout << info.version << std::endl;
|
|
std::cout << info.machine << std::endl;
|
|
return OSD_Default;
|
|
#endif
|
|
}
|
|
|
|
#if !(defined(_WIN32) || defined(__WIN32__))
|
|
|
|
#include <Standard_NumericError.hxx>
|
|
#include <Standard_NullObject.hxx>
|
|
#include <Standard_ProgramError.hxx>
|
|
#include <Standard_ConstructionError.hxx>
|
|
#include <OSD_WhoAmI.hxx>
|
|
|
|
OSD_Path::OSD_Path(){
|
|
mySysDep = whereAmI();
|
|
}
|
|
|
|
static void VmsExtract(const TCollection_AsciiString& what,
|
|
TCollection_AsciiString& node,
|
|
TCollection_AsciiString& username,
|
|
TCollection_AsciiString& password,
|
|
TCollection_AsciiString& disk,
|
|
TCollection_AsciiString& trek,
|
|
TCollection_AsciiString& name,
|
|
TCollection_AsciiString& ext){
|
|
|
|
TCollection_AsciiString buffer;
|
|
Standard_Integer pos;
|
|
|
|
buffer = what;
|
|
|
|
if (buffer.Search("\"") != -1){ // a username to extract
|
|
|
|
if (buffer.Value(1) != '"') { // Begins with Node
|
|
node = buffer.Token("\"");
|
|
buffer.Remove(1,node.Length());
|
|
}
|
|
else node = "";
|
|
|
|
username = buffer.Token("\" ");
|
|
buffer.Remove(1,username.Length()+2); // Removes <<"username ' ' or '"' >>
|
|
|
|
if (buffer.Search("\"") != -1){ // a password to extract
|
|
password = buffer.Token("\"");
|
|
buffer.Remove(1,password.Length()+1); // removes <<password">>
|
|
}
|
|
|
|
// If we found a node then we must find "::"
|
|
if (buffer.Search("::") != -1)
|
|
buffer.Remove(1,2); // Removes <<::>>
|
|
}
|
|
else // No name or password
|
|
if (buffer.Search("::") != -1){ // a node to extract
|
|
node = buffer.Token(":");
|
|
buffer.Remove(1,node.Length()+2); // Removes <<node::>
|
|
}
|
|
|
|
if (buffer.Search(":") != -1){ // a disk to extract
|
|
disk = buffer.Token(":");
|
|
buffer.Remove(1,disk.Length()+1); // Removes <<disk:>>
|
|
}
|
|
else disk = "";
|
|
|
|
// Analyse trek
|
|
|
|
if (buffer.Search("[") != -1){ // There is atrek to extract
|
|
trek = buffer.Token("[]");
|
|
|
|
if (trek.Value(1) == '.') trek.Remove(1,1); // Removes first '.'
|
|
else trek.Insert(1,'|'); // Add root
|
|
|
|
trek.ChangeAll('.','|'); // Translates to portable syntax
|
|
trek.ChangeAll('-','^');
|
|
|
|
pos = trek.Search("000000");
|
|
if (pos != -1) {
|
|
trek.Remove(pos,6); // on VMS [000000] is the root
|
|
if (trek.Search("||") != -1) trek.Remove(1,1); // When [000000.xxx] -> ||xxx
|
|
}
|
|
|
|
name = buffer.Token("]",2);
|
|
}
|
|
else name = buffer;
|
|
|
|
if (name.Search(".") != -1){
|
|
ext = name.Token(".",2);
|
|
ext.Insert(1,'.');
|
|
name.Remove(name.Search("."),ext.Length());
|
|
}
|
|
else ext = "";
|
|
|
|
}
|
|
|
|
|
|
//=======================================================================
|
|
//function : UnixExtract
|
|
//purpose :
|
|
//=======================================================================
|
|
static void UnixExtract(const TCollection_AsciiString& what,
|
|
TCollection_AsciiString& node,
|
|
TCollection_AsciiString& username,
|
|
TCollection_AsciiString& password,
|
|
TCollection_AsciiString& trek,
|
|
TCollection_AsciiString& name,
|
|
TCollection_AsciiString& ext){
|
|
|
|
Standard_Integer pos;
|
|
TCollection_AsciiString buffer; // To manipulate 'what' without modifying it
|
|
|
|
Standard_PCharacter p;
|
|
buffer = what;
|
|
|
|
#ifdef TOTO // Username, password and node are no longer given in the string (LD)
|
|
|
|
if (buffer.Search("@") != -1){ // There is a name to extract
|
|
username = buffer.Token("\"@");
|
|
buffer.Remove(1,username.Length()+1); // Removes << user@ >>
|
|
|
|
if (buffer.Search("\"") != -1){ // There is a password to extract
|
|
password = buffer.Token("\"");
|
|
buffer.Remove(1,password.Length()+2); // Removes << "password" >>
|
|
}
|
|
|
|
}
|
|
else {
|
|
username = "";
|
|
password = "";
|
|
}
|
|
|
|
#endif // node must be given (for DBT, DM) (ADN 29/8/96)
|
|
|
|
if (buffer.Search(":/") != -1){ // There is a node to extract
|
|
node = buffer.Token(":/");
|
|
buffer.Remove(1,node.Length()+1); // Removes << node: >>
|
|
}
|
|
else node = "";
|
|
|
|
username = "";
|
|
password = "";
|
|
// node = "";
|
|
|
|
trek = buffer;
|
|
|
|
trek.ChangeAll('/','|'); // Translates to portable syntax
|
|
|
|
pos = trek.SearchFromEnd("|"); // Extract name
|
|
if (pos != -1) {
|
|
p = (Standard_PCharacter)trek.ToCString();
|
|
name = &p[pos];
|
|
if(name.Length()) trek.Remove(pos+1,name.Length());
|
|
}
|
|
else { // No '|' means no trek but a name
|
|
name = buffer;
|
|
trek = "";
|
|
}
|
|
|
|
pos = trek.Search("..");
|
|
while (pos != -1){ // Changes every ".." by '^'
|
|
trek.SetValue(pos,'^');
|
|
trek.Remove(pos+1,1);
|
|
pos = trek.Search("..");
|
|
}
|
|
|
|
pos = name.SearchFromEnd(".") ; // LD : debug
|
|
if (pos != -1) // There is an extension to extract
|
|
ext = name.Split(pos - 1) ;
|
|
|
|
|
|
// if (name.Search(".") != -1){ // There is an extension to extract
|
|
// if ( name.Value(1) == '.' ) {
|
|
// ext = name;
|
|
// name.Clear();
|
|
// }
|
|
// else {
|
|
// ext = name.Token(".",2);
|
|
// ext.Insert(1,'.'); // Prepends 'dot'
|
|
// pos = name.Search("."); // Removes extension from buffer
|
|
// if (pos != -1)
|
|
// name.Remove(pos,ext.Length());
|
|
// }
|
|
// }
|
|
|
|
}
|
|
|
|
|
|
//=======================================================================
|
|
//function : DosExtract
|
|
//purpose :
|
|
//=======================================================================
|
|
static void DosExtract(const TCollection_AsciiString& what,
|
|
TCollection_AsciiString& disk,
|
|
TCollection_AsciiString& trek,
|
|
TCollection_AsciiString& name,
|
|
TCollection_AsciiString& ext){
|
|
|
|
TCollection_AsciiString buffer;
|
|
Standard_Integer pos;
|
|
Standard_PCharacter p;
|
|
|
|
buffer = what;
|
|
|
|
if (buffer.Search(":") != -1){ // There is a disk to extract
|
|
disk = buffer.Token(":");
|
|
disk += ":";
|
|
buffer.Remove(1,disk.Length()); // Removes <<disk:>>
|
|
}
|
|
|
|
trek = buffer;
|
|
|
|
trek.ChangeAll('\\','|');
|
|
|
|
pos = trek.Search("..");
|
|
while (pos != -1){ // Changes every ".." by '^'
|
|
trek.SetValue(pos,'^');
|
|
trek.Remove(pos+1,1);
|
|
pos = trek.Search("..");
|
|
}
|
|
|
|
pos = trek.SearchFromEnd ("|"); // Extract name
|
|
if (pos != -1) {
|
|
p = (Standard_PCharacter)trek.ToCString ();
|
|
name = &p[pos];
|
|
if (name.Length ()) trek.Remove (pos + 1, name.Length ());
|
|
}
|
|
else { // No '|' means no trek but a name
|
|
name = buffer;
|
|
trek = "";
|
|
}
|
|
|
|
pos = name.SearchFromEnd (".");
|
|
if (pos != -1) // There is an extension to extract
|
|
ext = name.Split (pos - 1);
|
|
}
|
|
|
|
|
|
//=======================================================================
|
|
//function : MacExtract
|
|
//purpose :
|
|
//=======================================================================
|
|
static void MacExtract(const TCollection_AsciiString& what,
|
|
TCollection_AsciiString& ,
|
|
TCollection_AsciiString& trek,
|
|
TCollection_AsciiString& name,
|
|
TCollection_AsciiString& ){
|
|
|
|
Standard_Integer pos;
|
|
Standard_PCharacter p;
|
|
|
|
// I don't know how to distingish a disk from a trek !
|
|
|
|
trek = what;
|
|
|
|
pos = trek.Search("::");
|
|
while (pos != -1){ // Changes every "::" by '^'
|
|
trek.SetValue(pos,'^');
|
|
trek.Remove(pos+1,1);
|
|
pos = trek.Search("::");
|
|
}
|
|
|
|
trek.ChangeAll(':','|'); // Translates to portable syntax
|
|
|
|
pos = trek.SearchFromEnd("|"); // Extract name
|
|
if (pos != -1) {
|
|
p = (Standard_PCharacter)trek.ToCString();
|
|
name = &p[pos+1];
|
|
trek.Remove(trek.Search(name),name.Length());
|
|
}
|
|
else { // No '|' means no trek but a name
|
|
name = what;
|
|
trek = "";
|
|
}
|
|
}
|
|
|
|
|
|
OSD_Path::OSD_Path(const TCollection_AsciiString& aDependentName,
|
|
const OSD_SysType aSysType){
|
|
|
|
mySysDep = whereAmI();
|
|
|
|
OSD_SysType todo;
|
|
// Standard_Integer i,l;
|
|
|
|
if (aSysType == OSD_Default) {
|
|
todo = mySysDep;
|
|
} else {
|
|
todo = aSysType;
|
|
}
|
|
|
|
switch (todo){
|
|
case OSD_VMS:
|
|
VmsExtract(aDependentName,myNode,myUserName,myPassword,myDisk,myTrek,myName,myExtension);
|
|
break;
|
|
case OSD_LinuxREDHAT:
|
|
case OSD_UnixBSD:
|
|
case OSD_UnixSystemV:
|
|
case OSD_Aix:
|
|
case OSD_OSF:
|
|
UnixExtract(aDependentName,myNode,myUserName,myPassword,myTrek,myName,myExtension);
|
|
break;
|
|
case OSD_OS2:
|
|
case OSD_WindowsNT:
|
|
DosExtract(aDependentName,myDisk,myTrek,myName,myExtension);
|
|
break;
|
|
case OSD_MacOs:
|
|
MacExtract(aDependentName,myDisk,myTrek,myName,myExtension);
|
|
break;
|
|
default:
|
|
#ifdef OCCT_DEBUG
|
|
std::cout << " WARNING WARNING : OSD Path for an Unknown SYSTEM : " << (Standard_Integer)todo << std::endl;
|
|
#endif
|
|
break ;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
OSD_Path::OSD_Path(const TCollection_AsciiString& Nod,
|
|
const TCollection_AsciiString& UsrNm,
|
|
const TCollection_AsciiString& Passwd,
|
|
const TCollection_AsciiString& Dsk,
|
|
const TCollection_AsciiString& Trk,
|
|
const TCollection_AsciiString& Nam,
|
|
const TCollection_AsciiString& ext){
|
|
|
|
mySysDep = whereAmI();
|
|
|
|
SetValues ( Nod, UsrNm, Passwd, Dsk, Trk, Nam, ext);
|
|
|
|
|
|
}
|
|
|
|
|
|
void OSD_Path::Values(TCollection_AsciiString& Nod,
|
|
TCollection_AsciiString& UsrNm,
|
|
TCollection_AsciiString& Passwd,
|
|
TCollection_AsciiString& Dsk,
|
|
TCollection_AsciiString& Trk,
|
|
TCollection_AsciiString& Nam,
|
|
TCollection_AsciiString& ext)const{
|
|
|
|
Nod = myNode;
|
|
UsrNm = myUserName;
|
|
Passwd = myPassword;
|
|
Dsk = myDisk;
|
|
Trk = myTrek;
|
|
Nam = myName;
|
|
ext = myExtension;
|
|
}
|
|
|
|
|
|
void OSD_Path::SetValues(const TCollection_AsciiString& Nod,
|
|
const TCollection_AsciiString& UsrNm,
|
|
const TCollection_AsciiString& Passwd,
|
|
const TCollection_AsciiString& Dsk,
|
|
const TCollection_AsciiString& Trk,
|
|
const TCollection_AsciiString& Nam,
|
|
const TCollection_AsciiString& ext)
|
|
{
|
|
myNode = Nod;
|
|
myUserName = UsrNm;
|
|
myPassword = Passwd;
|
|
myDisk = Dsk;
|
|
myTrek = Trk;
|
|
myName = Nam;
|
|
myExtension = ext;
|
|
}
|
|
|
|
void OSD_Path::UpTrek(){
|
|
Standard_Integer length=TrekLength();
|
|
|
|
if (length == 0) return;
|
|
|
|
Standard_Integer awhere,aHowmany;
|
|
TCollection_AsciiString tok;
|
|
|
|
tok = myTrek.Token("|",length);
|
|
awhere = myTrek.SearchFromEnd(tok);
|
|
aHowmany = tok.Length();
|
|
myTrek.Remove(awhere,aHowmany);
|
|
|
|
awhere = myTrek.Search("||"); // Searches leaving "||"
|
|
if (awhere != -1)
|
|
myTrek.Remove(awhere);
|
|
}
|
|
|
|
|
|
void OSD_Path::DownTrek(const TCollection_AsciiString& aName){
|
|
myTrek += aName;
|
|
// Pb signale par GG : pour ne pas avoir "||" ;
|
|
if ( aName.ToCString()[ aName.Length() - 1 ] != '|' )
|
|
myTrek += "|";
|
|
}
|
|
|
|
|
|
Standard_Integer OSD_Path::TrekLength()const{
|
|
Standard_Integer cpt=0;
|
|
|
|
while (myTrek.Token("|",cpt+1) != "") // Counts token separated by '|'
|
|
cpt++;
|
|
|
|
return(cpt);
|
|
}
|
|
|
|
|
|
void OSD_Path::RemoveATrek(const Standard_Integer thewhere){
|
|
Standard_Integer length=TrekLength();
|
|
|
|
if (length <= 0 || thewhere > length)
|
|
throw Standard_NumericError("OSD_Path::RemoveATrek : where has an invalid value");
|
|
|
|
Standard_Integer posit,aHowmany;
|
|
TCollection_AsciiString tok;
|
|
|
|
tok = myTrek.Token("|",thewhere);
|
|
posit = myTrek.Search(tok);
|
|
aHowmany = tok.Length();
|
|
myTrek.Remove(posit,aHowmany);
|
|
|
|
posit = myTrek.Search("||"); // Searches leaving "||"
|
|
if (posit != -1)
|
|
myTrek.Remove(posit);
|
|
}
|
|
|
|
|
|
void OSD_Path::RemoveATrek(const TCollection_AsciiString& aName){
|
|
Standard_Integer length=TrekLength();
|
|
|
|
if (length == 0) return;
|
|
|
|
Standard_Integer awhere;
|
|
|
|
awhere = myTrek.Search(aName);
|
|
if (awhere != -1){
|
|
myTrek.Remove(awhere,aName.Length());
|
|
|
|
awhere = myTrek.Search("||"); // Searches leaving "||"
|
|
if (awhere != -1)
|
|
myTrek.Remove(awhere);
|
|
}
|
|
}
|
|
|
|
|
|
TCollection_AsciiString OSD_Path::TrekValue(const Standard_Integer thewhere)const{
|
|
TCollection_AsciiString result=myTrek.Token("|",thewhere);
|
|
|
|
if (result == "")
|
|
throw Standard_NumericError("OSD_Path::TrekValue : where is invalid");
|
|
|
|
return(result);
|
|
}
|
|
|
|
void OSD_Path::InsertATrek(const TCollection_AsciiString& aName,
|
|
const Standard_Integer thewhere){
|
|
Standard_Integer length=TrekLength();
|
|
|
|
if (thewhere <= 0 || thewhere > length)
|
|
throw Standard_NumericError("OSD_Path::InsertATrek : where has an invalid value");
|
|
|
|
TCollection_AsciiString tok=myTrek.Token("|",thewhere);
|
|
Standard_Integer wwhere = myTrek.Search(tok);
|
|
TCollection_AsciiString what = aName;
|
|
what += "|";
|
|
|
|
myTrek.Insert(wwhere,what);
|
|
}
|
|
|
|
|
|
// The 4 following methods will be PUBLIC in the future
|
|
|
|
// Converts a VMS disk to other system syntax
|
|
|
|
static void VMSDisk2Other(TCollection_AsciiString & Disk){
|
|
Disk.RemoveAll('$');
|
|
}
|
|
|
|
|
|
// Convert a Trek to VMS syntax
|
|
|
|
static void P2VMS (TCollection_AsciiString & Way){
|
|
Standard_Integer length = Way.Length();
|
|
|
|
if (length == 0) return;
|
|
|
|
if (Way.Value(1) == '|') // If begin with '|' remove '|'
|
|
if (Way.Value(1) != '\0')
|
|
Way.Remove(1,1);
|
|
else Way = "000000"; // Si uniquement la racine -> [000000]
|
|
else
|
|
if (Way.Length()!=0)
|
|
Way.Insert(1,'|'); // Else insert '|' at beginning if not empty;
|
|
|
|
Way.ChangeAll('|','.');
|
|
Way.ChangeAll('^','-');
|
|
|
|
}
|
|
|
|
// Convert a Trek to MAC syntax
|
|
|
|
static void P2MAC (TCollection_AsciiString & Way){
|
|
int i,l;
|
|
Way.ChangeAll('|',':');
|
|
|
|
l = (int)Way.Length();
|
|
for (i=1; i <= l; i++) // Replace '^' by "::"
|
|
if (Way.Value(i) == '^'){
|
|
Way.SetValue(i,':');
|
|
Way.Insert(i,':');
|
|
i++; l++;
|
|
}
|
|
}
|
|
|
|
|
|
// Convert a Trek to UNIX syntax
|
|
|
|
static void P2UNIX (TCollection_AsciiString & Way){
|
|
int i,l;
|
|
Standard_Integer length = Way.Length();
|
|
|
|
if (length == 0) return;
|
|
|
|
// if (Way.Value(length) == '|') // If Finishes with "|" removes it
|
|
// Way.Trunc(length-1);
|
|
|
|
Way.ChangeAll('|','/');
|
|
|
|
l = (int)Way.Length();
|
|
for (i=1; i <= l; i++) // Replace '^' by "../"
|
|
if (Way.Value(i) == '^'){
|
|
Way.SetValue(i,'.');
|
|
Way.Insert(i+1,'.');
|
|
//Way.Insert(i+2,'/');
|
|
i +=1; l +=1;
|
|
}
|
|
}
|
|
|
|
|
|
// Convert a Trek to DOS like syntax
|
|
|
|
static void P2DOS (TCollection_AsciiString & Way){
|
|
int i,l;
|
|
Standard_Integer len = Way.Length();
|
|
|
|
if (len == 0) return;
|
|
|
|
if (Way.Value(len) == '|') // If Finishes with "|" removes it
|
|
Way.Trunc(len-1);
|
|
|
|
Way.ChangeAll('|','\\');
|
|
|
|
l = (int)Way.Length();
|
|
for (i=1; i <= l; i++) // Replace '^' by ".."
|
|
if (Way.Value(i) == '^'){
|
|
Way.SetValue(i,'.');
|
|
Way.Insert(i,'.');
|
|
i++; l++;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Convert a path to system dependant syntax
|
|
|
|
void OSD_Path::SystemName (TCollection_AsciiString& FullName,
|
|
const OSD_SysType aType)const{
|
|
TCollection_AsciiString Way;
|
|
TCollection_AsciiString pNode;
|
|
TCollection_AsciiString pDisk;
|
|
OSD_SysType pType;
|
|
|
|
if (aType == OSD_Default) {
|
|
pType = mySysDep;
|
|
} else {
|
|
pType = aType;
|
|
}
|
|
|
|
Way = myTrek;
|
|
FullName.Clear();
|
|
|
|
switch (pType){
|
|
case OSD_VMS :
|
|
pNode = myNode;
|
|
|
|
P2VMS (Way); // Convert path
|
|
|
|
if (myNode.Length()!=0) FullName += myNode; // Append Node
|
|
|
|
if (myUserName.Length()!=0){ // Append User name
|
|
|
|
if (pNode.Length()==0) { // If a user name but no node, catenate "0"
|
|
pNode = "0";
|
|
FullName += pNode;
|
|
}
|
|
|
|
|
|
FullName += "\"";
|
|
FullName += myUserName;
|
|
|
|
if (myPassword.Length()!=0){ // Append password
|
|
FullName += " ";
|
|
FullName += myPassword;
|
|
}
|
|
|
|
FullName += "\"";
|
|
}
|
|
|
|
if (pNode.Length()!=0) FullName += "::";
|
|
|
|
if (myDisk.Length()!=0){ // Append Disk
|
|
FullName += myDisk;
|
|
FullName += ":";
|
|
}
|
|
|
|
|
|
if (Way.Length()!=0) // Append VMS path
|
|
FullName = FullName + "[" + Way + "]" + myName + myExtension;
|
|
|
|
// FullName.UpperCase();
|
|
break;
|
|
|
|
|
|
case OSD_OS2 :
|
|
case OSD_WindowsNT : // MSDOS-like syntax
|
|
{
|
|
int length = (int)myDisk.Length();
|
|
|
|
P2DOS (Way);
|
|
if (length != 1)
|
|
|
|
if (myDisk.Length()!=0){
|
|
|
|
if (
|
|
(length == 1 && IsAlphabetic(myDisk.Value(1))) || // 'A/a' to 'Z/z'
|
|
(length == 2 &&
|
|
IsAlphabetic(myDisk.Value(1)) &&
|
|
myDisk.Value(2) == ':') // 'A:' to 'Z:'
|
|
) // This is a MSDOS disk syntax
|
|
{
|
|
FullName += myDisk;
|
|
if (myDisk.Value(length) != ':') FullName += ":";
|
|
}
|
|
else // This is an assigned Disk
|
|
{
|
|
FullName += "\\";
|
|
pDisk = myDisk;
|
|
VMSDisk2Other(pDisk);
|
|
FullName += pDisk;
|
|
if (Way.Value(1) != '\\') FullName += "\\";
|
|
}
|
|
}
|
|
|
|
if (Way.Length()!=0)
|
|
FullName = FullName + Way + "\\";
|
|
|
|
FullName += myName;
|
|
FullName += myExtension;
|
|
// FullName.UpperCase();
|
|
break;
|
|
}
|
|
|
|
case OSD_MacOs : // Mackintosh-like syntax
|
|
if (myDisk.Length()!=0){
|
|
FullName += myDisk ;
|
|
FullName += ":";
|
|
}
|
|
P2MAC(Way);
|
|
FullName += myName;
|
|
FullName += myExtension;
|
|
break;
|
|
|
|
|
|
|
|
default : // UNIX-like syntax
|
|
|
|
// Syntax :
|
|
// user"password"@host:/disk/xxx/xxx/filename
|
|
P2UNIX (Way);
|
|
|
|
if (myUserName.Length()!=0 && myNode.Length()!=0){ // If USER name
|
|
FullName += myUserName; // appends user name
|
|
|
|
if (myPassword.Length()!=0)
|
|
FullName = FullName + "\"" + myPassword + "\""; // a password if not empty
|
|
|
|
FullName += "@"; // and character '@'
|
|
}
|
|
|
|
if (myNode.Length()!=0){ // Appends HOST name
|
|
FullName += myNode;
|
|
FullName += ":";
|
|
}
|
|
|
|
if (myDisk.Length()!=0) { // Appends Disk name as path
|
|
FullName += "/";
|
|
pDisk = myDisk;
|
|
VMSDisk2Other(pDisk);
|
|
FullName += pDisk;
|
|
}
|
|
|
|
// if (FullName.Length()) { // Adds a "/" if necessary
|
|
// FullName += "/";
|
|
// }
|
|
|
|
if (Way.Length()!=0) { // Appends a path if not empty
|
|
FullName += Way ;
|
|
}
|
|
|
|
if (FullName.Length()){
|
|
if (FullName.Value(FullName.Length()) != '/') {
|
|
FullName += "/"; // Adds a / if necessary
|
|
}
|
|
}
|
|
|
|
if (myName.Length()){ // Adds the file name
|
|
FullName += myName;
|
|
}
|
|
|
|
if (myExtension.Length()) { // Adds the extension
|
|
FullName += myExtension;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
#ifdef TOTO // A reactiver...
|
|
|
|
void OSD_Path::SetSystemName(const TCollection_AsciiString& aDependentName,
|
|
const OSD_SysType aSysType){
|
|
UnixExtract(aDependentName,myNode,myUserName,myPassword,myTrek,myName,myExtension);
|
|
}
|
|
#endif
|
|
|
|
TCollection_AsciiString OSD_Path::Node()const{
|
|
return(myNode);
|
|
}
|
|
|
|
|
|
TCollection_AsciiString OSD_Path::UserName()const{
|
|
return(myUserName);
|
|
}
|
|
|
|
|
|
TCollection_AsciiString OSD_Path::Password()const{
|
|
return(myPassword);
|
|
}
|
|
|
|
|
|
TCollection_AsciiString OSD_Path::Disk()const{
|
|
return(myDisk);
|
|
}
|
|
|
|
|
|
TCollection_AsciiString OSD_Path::Trek()const{
|
|
return(myTrek);
|
|
}
|
|
|
|
|
|
// Return extension (suffix) of file/directory name
|
|
|
|
TCollection_AsciiString OSD_Path::Extension()const{
|
|
return(myExtension);
|
|
}
|
|
|
|
|
|
TCollection_AsciiString OSD_Path::Name()const{
|
|
return(myName);
|
|
}
|
|
|
|
|
|
void OSD_Path::SetNode(const TCollection_AsciiString& aName){
|
|
myNode = aName;
|
|
}
|
|
|
|
|
|
|
|
|
|
void OSD_Path::SetUserName(const TCollection_AsciiString& aName){
|
|
myUserName = aName;
|
|
}
|
|
|
|
|
|
|
|
|
|
void OSD_Path::SetPassword(const TCollection_AsciiString& aName){
|
|
myPassword = aName;
|
|
}
|
|
|
|
|
|
|
|
|
|
void OSD_Path::SetDisk(const TCollection_AsciiString& aName){
|
|
myDisk = aName;
|
|
}
|
|
|
|
|
|
|
|
|
|
void OSD_Path::SetTrek(const TCollection_AsciiString& aName){
|
|
myTrek = aName;
|
|
}
|
|
|
|
|
|
|
|
|
|
void OSD_Path::SetName(const TCollection_AsciiString& aName){
|
|
myName = aName;
|
|
}
|
|
|
|
|
|
|
|
|
|
void OSD_Path::SetExtension(const TCollection_AsciiString& aName){
|
|
myExtension = aName;
|
|
}
|
|
|
|
#else
|
|
|
|
//------------------------------------------------------------------------
|
|
//------------------- Windows sources for OSD_Path -------------------
|
|
//------------------------------------------------------------------------
|
|
|
|
#include <Standard_ProgramError.hxx>
|
|
|
|
#include <windows.h>
|
|
#include <stdlib.h>
|
|
|
|
#define TEST_RAISE( type, arg ) _test_raise ( ( type ), ( arg ) )
|
|
|
|
static void __fastcall _test_raise ( OSD_SysType, Standard_CString );
|
|
static void __fastcall _remove_dup ( TCollection_AsciiString& );
|
|
|
|
OSD_Path :: OSD_Path ()
|
|
: myUNCFlag(Standard_False), mySysDep(OSD_WindowsNT)
|
|
{
|
|
} // end constructor ( 1 )
|
|
|
|
OSD_Path :: OSD_Path (
|
|
const TCollection_AsciiString& aDependentName,
|
|
const OSD_SysType aSysType
|
|
) :
|
|
myUNCFlag(Standard_False),
|
|
mySysDep(OSD_WindowsNT)
|
|
{
|
|
|
|
Standard_Integer i, j, len;
|
|
char __drive [ _MAX_DRIVE ];
|
|
char __dir [ _MAX_DIR ];
|
|
char __trek [ _MAX_DIR ];
|
|
char __fname [ _MAX_FNAME ];
|
|
char __ext [ _MAX_EXT ];
|
|
|
|
memset(__drive, 0,_MAX_DRIVE);
|
|
memset(__dir, 0,_MAX_DIR);
|
|
memset(__trek, 0,_MAX_DIR);
|
|
memset(__fname, 0,_MAX_FNAME);
|
|
memset(__ext, 0,_MAX_EXT);
|
|
Standard_Character chr;
|
|
|
|
TEST_RAISE( aSysType, "OSD_Path" );
|
|
|
|
_splitpath ( aDependentName.ToCString (), __drive, __dir, __fname, __ext );
|
|
|
|
|
|
|
|
myDisk = __drive;
|
|
myName = __fname;
|
|
myExtension = __ext;
|
|
|
|
{
|
|
TCollection_AsciiString dir = __dir;
|
|
len = dir.Length ();
|
|
}
|
|
|
|
for ( i = j = 0; i < len; ++i, ++j ) {
|
|
|
|
chr = __dir[i];
|
|
|
|
if ( chr == '\\' || chr == '/' )
|
|
|
|
__trek[j] = '|';
|
|
|
|
else if ( chr == '.'&& (i+1) < len && __dir[i+1] == '.' ) {
|
|
|
|
__trek[j] = '^';
|
|
++i;
|
|
|
|
} else
|
|
|
|
__trek[j] = chr;
|
|
|
|
} // end for
|
|
__trek[j] = '\0';
|
|
TCollection_AsciiString trek = __trek;
|
|
_remove_dup ( trek );
|
|
myTrek = trek;
|
|
|
|
} // end constructor ( 2 )
|
|
|
|
OSD_Path :: OSD_Path (
|
|
const TCollection_AsciiString& aNode,
|
|
const TCollection_AsciiString& aUsername,
|
|
const TCollection_AsciiString& aPassword,
|
|
const TCollection_AsciiString& aDisk,
|
|
const TCollection_AsciiString& aTrek,
|
|
const TCollection_AsciiString& aName,
|
|
const TCollection_AsciiString& anExtension
|
|
) :
|
|
myUNCFlag(Standard_False),
|
|
mySysDep(OSD_WindowsNT)
|
|
{
|
|
|
|
SetValues ( aNode, aUsername, aPassword, aDisk, aTrek, aName, anExtension );
|
|
|
|
} // end constructor ( 3 )
|
|
|
|
void OSD_Path :: Values (
|
|
TCollection_AsciiString& aNode,
|
|
TCollection_AsciiString& aUsername,
|
|
TCollection_AsciiString& aPassword,
|
|
TCollection_AsciiString& aDisk,
|
|
TCollection_AsciiString& aTrek,
|
|
TCollection_AsciiString& aName,
|
|
TCollection_AsciiString& anExtension
|
|
) const {
|
|
|
|
aNode = myNode;
|
|
aUsername = myUserName;
|
|
aPassword = myPassword;
|
|
aDisk = myDisk;
|
|
aTrek = myTrek;
|
|
if (!aTrek.IsEmpty() && aTrek.Value(aTrek.Length()) != '|')
|
|
aTrek += "|" ; // (LD)
|
|
aName = myName;
|
|
anExtension = myExtension;
|
|
|
|
} // end OSD_Path :: Values
|
|
|
|
void OSD_Path :: SetValues (
|
|
const TCollection_AsciiString& aNode,
|
|
const TCollection_AsciiString& aUsername,
|
|
const TCollection_AsciiString& aPassword,
|
|
const TCollection_AsciiString& aDisk,
|
|
const TCollection_AsciiString& aTrek,
|
|
const TCollection_AsciiString& aName,
|
|
const TCollection_AsciiString& anExtension
|
|
) {
|
|
|
|
myNode = aNode;
|
|
myUserName = aUsername;
|
|
myPassword = aPassword;
|
|
myDisk = aDisk;
|
|
myTrek = aTrek;
|
|
myName = aName;
|
|
myExtension = anExtension;
|
|
|
|
if ( myExtension.Length () && myExtension.Value ( 1 ) != '.' )
|
|
|
|
myExtension.Insert ( 1, '.' );
|
|
|
|
_remove_dup ( myTrek );
|
|
|
|
} // end OSD_Path :: SetValues
|
|
|
|
void OSD_Path :: SystemName (
|
|
TCollection_AsciiString& FullName,
|
|
const OSD_SysType aType
|
|
) const {
|
|
|
|
Standard_Integer i, j;
|
|
TCollection_AsciiString fullPath;
|
|
Standard_Character trek [ _MAX_PATH ];
|
|
Standard_Character chr;
|
|
|
|
memset(trek,0,_MAX_PATH);
|
|
|
|
TEST_RAISE( aType, "SystemName" );
|
|
|
|
for ( i = j = 1; i <= myTrek.Length () && j <= _MAX_PATH; ++i, ++j ) {
|
|
|
|
chr = myTrek.Value ( i );
|
|
|
|
if ( chr == '|' ) {
|
|
|
|
trek[j-1] = '/';
|
|
|
|
} else if ( chr == '^' && j <= _MAX_PATH - 1 ) {
|
|
|
|
strcpy(&(trek[(j++) - 1]),"..");
|
|
|
|
} else
|
|
|
|
trek[j-1] = chr ;
|
|
|
|
} //end for
|
|
|
|
fullPath = myDisk + TCollection_AsciiString(trek);
|
|
|
|
if ( trek[0] ) fullPath += "/";
|
|
|
|
fullPath += ( myName + myExtension );
|
|
|
|
if ( fullPath.Length () > 0 )
|
|
|
|
FullName = fullPath;
|
|
|
|
else
|
|
|
|
FullName.Clear ();
|
|
|
|
} // end OSD_Path :: SystemName
|
|
|
|
void OSD_Path :: UpTrek () {
|
|
|
|
Standard_Integer pos = myTrek.SearchFromEnd ( "|" );
|
|
|
|
if ( pos == -1 )
|
|
|
|
pos = 0;
|
|
|
|
else if ( pos > 1 ) {
|
|
|
|
while ( myTrek.Value ( pos ) == '|' && pos != 1 ) --pos;
|
|
|
|
} // end if
|
|
|
|
myTrek.Trunc ( pos );
|
|
|
|
} // end OSD_Path :: UpTrek
|
|
|
|
void OSD_Path :: DownTrek ( const TCollection_AsciiString& aName ) {
|
|
|
|
Standard_Integer pos = myTrek.Length ();
|
|
|
|
if ( !aName.IsEmpty() && aName.Value ( 1 ) != '|' &&
|
|
pos &&
|
|
myTrek.Value ( pos ) != '|'
|
|
)
|
|
|
|
myTrek += "|";
|
|
|
|
myTrek += aName;
|
|
|
|
_remove_dup ( myTrek );
|
|
|
|
} // end OSD_Path :: DownTrek
|
|
|
|
Standard_Integer OSD_Path :: TrekLength () const {
|
|
|
|
Standard_Integer i = 1;
|
|
Standard_Integer retVal = 0;
|
|
|
|
if ( myTrek.IsEmpty () || (myTrek.Length () == 1 && myTrek.Value ( 1 ) == '|') )
|
|
|
|
return retVal;
|
|
|
|
for (;;) {
|
|
|
|
if ( myTrek.Token ( "|", i++ ).IsEmpty () )
|
|
|
|
break;
|
|
|
|
++retVal;
|
|
|
|
} //end while
|
|
|
|
return retVal;
|
|
|
|
} // end TrekLength
|
|
|
|
void OSD_Path :: RemoveATrek ( const Standard_Integer thewhere ) {
|
|
|
|
Standard_Integer i, j;
|
|
Standard_Boolean flag = Standard_False;
|
|
|
|
if ( TrekLength () < thewhere )
|
|
|
|
return;
|
|
|
|
if ( myTrek.Value ( 1 ) != '|' ) {
|
|
|
|
flag = Standard_True;
|
|
myTrek.Insert ( 1, '|' );
|
|
|
|
} // end if
|
|
|
|
i = myTrek.Location (
|
|
thewhere, '|',
|
|
1, myTrek.Length ()
|
|
);
|
|
|
|
if ( i ) {
|
|
|
|
j = myTrek.Location (
|
|
thewhere + 1, '|',
|
|
1, myTrek.Length ()
|
|
);
|
|
|
|
if ( j == 0 )
|
|
|
|
j = myTrek.Length () + 1;
|
|
|
|
myTrek.Remove ( i, j - i );
|
|
|
|
} // end if
|
|
|
|
if ( flag )
|
|
|
|
myTrek.Remove ( 1 );
|
|
|
|
} // end OSD_Path :: RemoveATrek ( 1 )
|
|
|
|
void OSD_Path :: RemoveATrek ( const TCollection_AsciiString& aName ) {
|
|
|
|
Standard_Integer i;
|
|
Standard_Boolean flag = Standard_False;
|
|
TCollection_AsciiString tmp;
|
|
|
|
if ( myTrek.Value ( 1 ) != '|' ) {
|
|
|
|
flag = Standard_True;
|
|
myTrek.Insert ( 1, '|' );
|
|
|
|
} // end if
|
|
|
|
myTrek += '|';
|
|
|
|
tmp = aName;
|
|
|
|
if ( tmp.Value ( 1 ) != '|' )
|
|
|
|
tmp.Insert ( 1, '|' );
|
|
|
|
if ( tmp.Value ( tmp.Length () ) != '|' )
|
|
|
|
tmp += '|';
|
|
|
|
i = myTrek.Search ( tmp );
|
|
|
|
if ( i != -1 )
|
|
|
|
myTrek.Remove ( i + 1, tmp.Length () - 1 );
|
|
|
|
if ( flag )
|
|
|
|
myTrek.Remove ( 1 );
|
|
|
|
if ( myTrek.Value ( myTrek.Length () ) == '|' )
|
|
|
|
myTrek.Trunc ( myTrek.Length () - 1 );
|
|
|
|
} // end OSD_Path :: RemoveATrek ( 2 )
|
|
|
|
TCollection_AsciiString OSD_Path :: TrekValue (
|
|
const Standard_Integer thewhere
|
|
) const {
|
|
|
|
TCollection_AsciiString retVal;
|
|
TCollection_AsciiString trek = myTrek;
|
|
|
|
if ( trek.Value ( 1 ) != '|' )
|
|
|
|
trek.Insert ( 1, '|' );
|
|
|
|
retVal = trek.Token ( "|", thewhere );
|
|
|
|
return retVal;
|
|
|
|
} // end OSD_Path :: TrekValue
|
|
|
|
void OSD_Path :: InsertATrek (
|
|
const TCollection_AsciiString& aName,
|
|
const Standard_Integer thewhere
|
|
) {
|
|
|
|
Standard_Integer pos;
|
|
TCollection_AsciiString tmp = aName;
|
|
Standard_Boolean flag = Standard_False;
|
|
|
|
if ( myTrek.Value ( 1 ) != '|' ) {
|
|
|
|
flag = Standard_True;
|
|
myTrek.Insert ( 1, '|' );
|
|
|
|
} // end if
|
|
|
|
myTrek += '|';
|
|
|
|
pos = myTrek.Location (
|
|
thewhere, '|',
|
|
1, myTrek.Length ()
|
|
);
|
|
|
|
if ( pos ) {
|
|
|
|
if ( tmp.Value ( tmp.Length () ) != '|' )
|
|
|
|
tmp += '|';
|
|
|
|
myTrek.Insert ( pos + 1, tmp );
|
|
|
|
} // end if
|
|
|
|
if ( flag )
|
|
|
|
myTrek.Remove ( 1 );
|
|
|
|
if ( myTrek.Value ( myTrek.Length () ) == '|' )
|
|
|
|
myTrek.Trunc ( myTrek.Length () - 1 );
|
|
|
|
_remove_dup ( myTrek );
|
|
|
|
} // end OSD_Path :: InsertATrek
|
|
|
|
TCollection_AsciiString OSD_Path :: Node () const {
|
|
|
|
return myNode;
|
|
|
|
} // end OSD_Path :: Node
|
|
|
|
TCollection_AsciiString OSD_Path :: UserName () const {
|
|
|
|
return myUserName;
|
|
|
|
} // end OSD_Path :: UserName
|
|
|
|
TCollection_AsciiString OSD_Path :: Password () const {
|
|
|
|
return myPassword;
|
|
|
|
} // end OSD_Path :: Password
|
|
|
|
TCollection_AsciiString OSD_Path :: Disk () const {
|
|
|
|
return myDisk;
|
|
|
|
} // end OSD_Path :: Disk
|
|
|
|
TCollection_AsciiString OSD_Path :: Trek () const {
|
|
|
|
TCollection_AsciiString retVal ;
|
|
retVal = myTrek ;
|
|
if (!retVal.IsEmpty() && retVal.Value(retVal.Length()) != '|')
|
|
retVal += "|" ; // (LD)
|
|
return retVal;
|
|
|
|
} // end OSD_Path :: Trek
|
|
|
|
TCollection_AsciiString OSD_Path :: Name () const {
|
|
|
|
return myName;
|
|
|
|
} // end OSD_Path :: Name
|
|
|
|
TCollection_AsciiString OSD_Path :: Extension () const {
|
|
|
|
return myExtension;
|
|
|
|
} // end OSD_Path :: Extension
|
|
|
|
void OSD_Path :: SetNode ( const TCollection_AsciiString& aName ) {
|
|
|
|
myNode = aName;
|
|
|
|
} // end OSD_Path :: SetNode
|
|
|
|
void OSD_Path :: SetUserName (const TCollection_AsciiString& aName ) {
|
|
|
|
myUserName = aName;
|
|
|
|
} // end OSD_Path :: SetUserName
|
|
|
|
void OSD_Path :: SetPassword ( const TCollection_AsciiString& aName ) {
|
|
|
|
myPassword = aName;
|
|
|
|
} // end OSD_Path :: SetPassword
|
|
|
|
void OSD_Path :: SetDisk ( const TCollection_AsciiString& aName ) {
|
|
|
|
myDisk = aName;
|
|
|
|
} // end OSD_Path :: SetDisk
|
|
|
|
void OSD_Path :: SetTrek (const TCollection_AsciiString& aName ) {
|
|
|
|
myTrek = aName;
|
|
|
|
_remove_dup ( myTrek );
|
|
|
|
} // end OSD_Path :: SetTrek
|
|
|
|
void OSD_Path :: SetName ( const TCollection_AsciiString& aName ) {
|
|
|
|
myName = aName;
|
|
|
|
} // end OSD_Path :: SetName
|
|
|
|
void OSD_Path :: SetExtension ( const TCollection_AsciiString& aName ) {
|
|
|
|
myExtension = aName;
|
|
|
|
} // end OSD_Path :: SetExtension
|
|
|
|
static void __fastcall _test_raise ( OSD_SysType type, Standard_CString str ) {
|
|
|
|
Standard_Character buff[ 64 ];
|
|
|
|
if ( type != OSD_Default && type != OSD_WindowsNT ) {
|
|
|
|
strcpy ( buff, "OSD_Path :: " );
|
|
strcat ( buff, str );
|
|
strcat ( buff, " (): unknown system type" );
|
|
|
|
throw Standard_ProgramError ( buff );
|
|
|
|
} // end if
|
|
|
|
} // end _test_raise
|
|
|
|
static void __fastcall _remove_dup ( TCollection_AsciiString& str ) {
|
|
|
|
Standard_Integer pos = 1, orgLen, len = str.Length ();
|
|
|
|
orgLen = len;
|
|
|
|
while ( pos <= len ) {
|
|
|
|
if ( str.Value ( pos ) == '|' && pos != len &&
|
|
str.Value ( pos + 1 ) == '|' && pos != 1
|
|
) {
|
|
|
|
++pos;
|
|
|
|
while ( pos <= len && str.Value ( pos ) == '|' ) str.Remove ( pos ), --len;
|
|
|
|
} else
|
|
|
|
++pos;
|
|
|
|
} // end while
|
|
|
|
if ( orgLen > 1 && len > 0 && str.Value ( len ) == '|' ) str.Remove ( len );
|
|
|
|
pos = 1;
|
|
orgLen = len = str.Length ();
|
|
|
|
while ( pos <= len ) {
|
|
|
|
if ( str.Value ( pos ) == '^' && pos != len && str.Value ( pos + 1 ) == '^' ) {
|
|
|
|
++pos;
|
|
|
|
while ( pos <= len && str.Value ( pos ) == '^' ) str.Remove ( pos ), --len;
|
|
|
|
} else
|
|
|
|
++pos;
|
|
|
|
} // end while
|
|
|
|
// if ( orgLen > 1 && len > 0 && str.Value ( len ) == '^' ) str.Remove ( len );
|
|
|
|
} // end _remove_dup
|
|
|
|
#endif // Windows sources for OSD_Path
|
|
|
|
// =======================================================================
|
|
// function : Analyse_VMS
|
|
// purpose :
|
|
// =======================================================================
|
|
static Standard_Boolean Analyse_VMS (const TCollection_AsciiString& theName)
|
|
{
|
|
if (theName.Search ("/") != -1
|
|
|| theName.Search ("@") != -1
|
|
|| theName.Search ("\\") != -1)
|
|
{
|
|
return Standard_False;
|
|
}
|
|
|
|
return Standard_True;
|
|
}
|
|
|
|
// =======================================================================
|
|
// function : Analyse_DOS
|
|
// purpose :
|
|
// =======================================================================
|
|
static Standard_Boolean Analyse_DOS(const TCollection_AsciiString& theName)
|
|
{
|
|
if (theName.Search ("/") != -1
|
|
|| theName.Search (":") != -1
|
|
|| theName.Search ("*") != -1
|
|
|| theName.Search ("?") != -1
|
|
|| theName.Search ("\"") != -1
|
|
|| theName.Search ("<") != -1
|
|
|| theName.Search (">") != -1
|
|
|| theName.Search ("|") != -1)
|
|
{
|
|
return Standard_False;
|
|
}
|
|
|
|
return Standard_True;
|
|
}
|
|
|
|
// =======================================================================
|
|
// function : Analyse_MACOS
|
|
// purpose :
|
|
// =======================================================================
|
|
static Standard_Boolean Analyse_MACOS (const TCollection_AsciiString& theName)
|
|
{
|
|
return theName.Search(":") == -1 ? theName.Length() <= 31 : Standard_True;
|
|
}
|
|
|
|
// =======================================================================
|
|
// function : IsValid
|
|
// purpose :
|
|
// =======================================================================
|
|
Standard_Boolean OSD_Path::IsValid (const TCollection_AsciiString& theDependentName,
|
|
const OSD_SysType theSysType)
|
|
{
|
|
if (theDependentName.Length() == 0)
|
|
{
|
|
return Standard_True;
|
|
}
|
|
|
|
switch (theSysType == OSD_Default ? whereAmI() : theSysType)
|
|
{
|
|
case OSD_VMS:
|
|
return Analyse_VMS (theDependentName);
|
|
case OSD_OS2:
|
|
case OSD_WindowsNT:
|
|
return Analyse_DOS (theDependentName);
|
|
case OSD_MacOs:
|
|
return Analyse_MACOS (theDependentName);
|
|
default:
|
|
return Standard_True;
|
|
}
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
// Elimine les separateurs inutiles
|
|
|
|
|
|
static Standard_Integer RemoveExtraSeparator(TCollection_AsciiString& aString) {
|
|
|
|
Standard_Integer i, j, len,start = 1 ;
|
|
|
|
len = aString.Length() ;
|
|
#ifdef _WIN32
|
|
if (len > 1 && aString.Value(1) == '/' && aString.Value(2) == '/')
|
|
start = 2;
|
|
#endif
|
|
for (i = j = start ; j <= len ; i++,j++) {
|
|
Standard_Character c = aString.Value(j) ;
|
|
aString.SetValue(i,c) ;
|
|
if (c == '/')
|
|
while(j < len && aString.Value(j+1) == '/') j++ ;
|
|
}
|
|
len = i-1 ;
|
|
if (aString.Value(len) == '/') len-- ;
|
|
aString.Trunc(len) ;
|
|
return len ;
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
TCollection_AsciiString OSD_Path::RelativePath(
|
|
const TCollection_AsciiString& aDirPath,
|
|
const TCollection_AsciiString& aAbsFilePath)
|
|
{
|
|
TCollection_AsciiString EmptyString = "" ;
|
|
TCollection_AsciiString FilePath ;
|
|
Standard_Integer len ;
|
|
Standard_Integer i, n ;
|
|
Standard_Boolean Wnt = 0 ;
|
|
|
|
FilePath = aAbsFilePath ;
|
|
|
|
if (aDirPath.Search(":") == 2) { // Cas WNT
|
|
Wnt = 1 ;
|
|
if (FilePath.Search(":") != 2 ||
|
|
UpperCase(aDirPath.Value(1)) != UpperCase(FilePath.Value(1))
|
|
)
|
|
return EmptyString ;
|
|
|
|
FilePath.ChangeAll('\\','/') ;
|
|
if (FilePath.Search("/") != 3 )
|
|
return EmptyString ;
|
|
}
|
|
else { // Cas Unix
|
|
if (aDirPath.Value(1) != '/' || FilePath.Value(1) != '/')
|
|
return EmptyString ;
|
|
}
|
|
|
|
// Eliminer les separateurs redondants
|
|
|
|
len = RemoveExtraSeparator(FilePath) ;
|
|
|
|
if (!Wnt) {
|
|
if (len < 2)
|
|
return EmptyString ;
|
|
FilePath = FilePath.SubString(2,len) ;
|
|
}
|
|
TCollection_AsciiString DirToken, FileToken ;
|
|
Standard_Boolean Sibling = 0 ;
|
|
|
|
for (i = n = 1 ;; n++) {
|
|
DirToken = aDirPath.Token("/\\",n) ;
|
|
if (DirToken.IsEmpty())
|
|
return FilePath ;
|
|
|
|
if (!Sibling) {
|
|
len = FilePath.Length() ;
|
|
i = FilePath.Search("/") ;
|
|
if (i > 0) {
|
|
if (i == len)
|
|
return EmptyString ;
|
|
|
|
FileToken = FilePath.SubString(1,i-1) ;
|
|
if (Wnt) {
|
|
DirToken.UpperCase() ;
|
|
FileToken.UpperCase() ;
|
|
}
|
|
if (DirToken == FileToken) {
|
|
FilePath = FilePath.SubString(i+1,len) ;
|
|
continue ;
|
|
}
|
|
}
|
|
else if (DirToken == FilePath)
|
|
return EmptyString ;
|
|
|
|
else
|
|
Sibling = 1 ;
|
|
}
|
|
FilePath.Insert(1,"../") ;
|
|
}
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
TCollection_AsciiString OSD_Path::AbsolutePath(
|
|
const TCollection_AsciiString& aDirPath,
|
|
const TCollection_AsciiString& aRelFilePath)
|
|
{
|
|
TCollection_AsciiString EmptyString = "" ;
|
|
if (aRelFilePath.Search("/") == 1 || aRelFilePath.Search(":") == 2)
|
|
return aRelFilePath ;
|
|
TCollection_AsciiString DirPath = aDirPath, RelFilePath = aRelFilePath ;
|
|
Standard_Integer i,len ;
|
|
|
|
if (DirPath.Search("/") != 1 && DirPath.Search(":") != 2)
|
|
return EmptyString ;
|
|
|
|
if ( DirPath.Search(":") == 2)
|
|
DirPath.ChangeAll('\\','/') ;
|
|
RelFilePath.ChangeAll('\\','/') ;
|
|
RemoveExtraSeparator(DirPath) ;
|
|
len = RemoveExtraSeparator(RelFilePath) ;
|
|
|
|
while (RelFilePath.Search("../") == 1) {
|
|
if (len == 3)
|
|
return EmptyString ;
|
|
RelFilePath = RelFilePath.SubString(4,len) ;
|
|
len -= 3 ;
|
|
if (DirPath.IsEmpty())
|
|
return EmptyString ;
|
|
i = DirPath.SearchFromEnd("/") ;
|
|
if (i < 0)
|
|
return EmptyString ;
|
|
DirPath.Trunc(i-1) ;
|
|
}
|
|
DirPath += '/' ;
|
|
DirPath += RelFilePath ;
|
|
return DirPath ;
|
|
}
|
|
|
|
//void OSD_Path::ExpandedName(TCollection_AsciiString& aName)
|
|
void OSD_Path::ExpandedName(TCollection_AsciiString& )
|
|
{
|
|
}
|
|
|
|
//Standard_Boolean LocateExecFile(OSD_Path& aPath)
|
|
Standard_Boolean LocateExecFile(OSD_Path& )
|
|
{
|
|
return Standard_False ;
|
|
}
|
|
|
|
// =======================================================================
|
|
// function : FolderAndFileFromPath
|
|
// purpose :
|
|
// =======================================================================
|
|
void OSD_Path::FolderAndFileFromPath (const TCollection_AsciiString& theFilePath,
|
|
TCollection_AsciiString& theFolder,
|
|
TCollection_AsciiString& theFileName)
|
|
{
|
|
Standard_Integer aLastSplit = -1;
|
|
Standard_CString aString = theFilePath.ToCString();
|
|
for (Standard_Integer anIter = 0; anIter < theFilePath.Length(); ++anIter)
|
|
{
|
|
if (aString[anIter] == '/'
|
|
|| aString[anIter] == '\\')
|
|
{
|
|
aLastSplit = anIter;
|
|
}
|
|
}
|
|
|
|
if (aLastSplit == -1)
|
|
{
|
|
theFolder.Clear();
|
|
theFileName = theFilePath;
|
|
return;
|
|
}
|
|
|
|
theFolder = theFilePath.SubString (1, aLastSplit + 1);
|
|
if (aLastSplit + 2 <= theFilePath.Length())
|
|
{
|
|
theFileName = theFilePath.SubString (aLastSplit + 2, theFilePath.Length());
|
|
}
|
|
else
|
|
{
|
|
theFileName.Clear();
|
|
}
|
|
}
|