1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-05-01 10:26:12 +03:00
occt/src/OSD/OSD_Path.cxx
kgv 7c65581dd3 0027197: Configuration - fix compilation issues when using mingw
AIS_ColorScale, AIS_Dimension - the protected method DrawText()
has been renamed to drawText() to avoid name collisions with macros.

_MSC_VER/_WIN32 misuse has been fixed in several places.
Header <malloc.h> is now included where alloca() is used.
Draw_Window - dllimport flag has been dropped from inline methods.

TKernel - mandatory dependencies Winspool.lib and Psapi.lib
are now linked explicitly (instead of msvc-specific pragma syntax).

CMake scripts - the option -std=c++0x has been replaced by -std=gnu++0x
for mingw to allow extensions (like _wfopen() and others).
The minimum Windows version has been set to _WIN32_WINNT=0x0501.
Invalid options "-z defs" and "-lm" have been dropped for mingw.
Flag --export-all-symbols has been added to CMAKE_SHARED_LINKER_FLAGS
to workaround missing vtable symbols when using mingw.
FreeType is now linked explicitly on Windows.

Draw::Load() - "lib" suffix is now prepended on mingw as well.

Drop redundant declaration of _TINT from OSD_WNT_1.hxx.
NCollection_UtfString::FromLocale() - platform-specific code has been moved to .cxx file.
Draw_BasicCommands - fixed incorrect mingw64 version macros.

genproj, cbp - added workaround for process argument list limits on Windows.
TKSTEP linkage is failing on this platform due to too long list of files.
The list of object files to link is now stored in dedicated file which is passed to gcc.

Option "-z defs" removed from CMake linker options to avoid problems when building with different configurations of VTK on Linux

Some MinGW-specific compiler warnings (potentially uninitialized vars, use of NULL, parentheses in conditional expressions) are fixed (speculatively)
2016-03-04 07:31:05 +03:00

1642 lines
38 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(_AIX) || defined(AIX)
return OSD_Aix;
#else
struct utsname info;
uname(&info);
cout << info.sysname << endl;
cout << info.nodename << endl;
cout << info.release << endl;
cout << info.version << endl;
cout << info.machine << 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:>>
}
if (buffer.Search(".") != -1){ // There is an extension to extract
ext = buffer.Token(".",2);
ext.Insert(1,'.'); // Prepends 'dot'
pos = buffer.Search("."); // Removes extension from buffer
if (pos != -1)
buffer.Remove(pos,ext.Length());
}
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];
trek.Remove(trek.Search(name),name.Length());
}
else { // No '|' means no trek but a name
name = buffer;
trek = "";
}
}
//=======================================================================
//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
cout << " WARNING WARNING : OSD Path for an Unknown SYSTEM : " << (Standard_Integer)todo << 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)
Standard_NumericError::Raise("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 == "")
Standard_NumericError::Raise("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)
Standard_NumericError::Raise("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 () {
} // 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;
static char __drive [ _MAX_DRIVE ];
static char __dir [ _MAX_DIR ];
static char __trek [ _MAX_DIR ];
static char __fname [ _MAX_FNAME ];
static 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;
static 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.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" );
Standard_ProgramError :: Raise ( 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 ;
}