0022325: Patch to fix a build failure on GNU/kFreeBSD
[occt.git] / src / OSD / OSD_Path.cxx
1 // Copyright (c) 1998-1999 Matra Datavision
2 // Copyright (c) 1999-2014 OPEN CASCADE SAS
3 //
4 // This file is part of Open CASCADE Technology software library.
5 //
6 // This library is free software; you can redistribute it and/or modify it under
7 // the terms of the GNU Lesser General Public License version 2.1 as published
8 // by the Free Software Foundation, with special exception defined in the file
9 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
10 // distribution for complete text of the license and disclaimer of any warranty.
11 //
12 // Alternatively, this file may be used under the terms of Open CASCADE
13 // commercial license or contractual agreement.
14
15
16 #include <OSD_OSDError.hxx>
17 #include <OSD_Path.hxx>
18 #include <Standard_ConstructionError.hxx>
19 #include <Standard_NullObject.hxx>
20 #include <Standard_NumericError.hxx>
21 #include <Standard_ProgramError.hxx>
22 #include <TCollection_AsciiString.hxx>
23
24 static OSD_SysType whereAmI()
25 {
26 #if defined(__digital__) || defined(__FreeBSD__) || defined(SUNOS) || defined(__APPLE__) || defined(__QNX__) || defined(__FreeBSD_kernel__)
27   return OSD_UnixBSD;
28 #elif defined(sgi)  || defined(IRIX) || defined(__sun)  || defined(SOLARIS) ||  defined(__sco__) || defined(__hpux) || defined(HPUX)
29   return OSD_UnixSystemV;
30 #elif defined(__osf__) || defined(DECOSF1)
31   return OSD_OSF;
32 #elif defined(OS2)
33   return OSD_WindowsNT;
34 #elif defined(_WIN32) || defined(__WIN32__)
35   return OSD_WindowsNT;
36 #elif defined(__CYGWIN32_) || defined(__MINGW32__)
37   return OSD_WindowsNT;
38 #elif defined(vax) || defined(__vms)
39   return OSD_VMS;
40 #elif defined(__linux__) || defined(__linux)
41   return OSD_LinuxREDHAT;
42 #elif defined(_AIX) || defined(AIX)
43   return OSD_Aix;
44 #else
45   struct utsname info;
46   uname(&info);
47   cout << info.sysname << endl;
48   cout << info.nodename << endl;
49   cout << info.release << endl;
50   cout << info.version << endl;
51   cout << info.machine << endl;
52   return OSD_Default;
53 #endif
54 }
55
56 #if !(defined(_WIN32) || defined(__WIN32__))
57
58 #include <Standard_NumericError.hxx>
59 #include <Standard_NullObject.hxx>
60 #include <Standard_ProgramError.hxx>
61 #include <Standard_ConstructionError.hxx>
62 #include <OSD_WhoAmI.hxx>
63
64 OSD_Path::OSD_Path(){
65  mySysDep = whereAmI();
66 }
67
68 static void VmsExtract(const TCollection_AsciiString& what,
69                 TCollection_AsciiString& node,
70                 TCollection_AsciiString& username,
71                 TCollection_AsciiString& password,
72                 TCollection_AsciiString& disk,
73                 TCollection_AsciiString& trek,
74                 TCollection_AsciiString& name,
75                 TCollection_AsciiString& ext){
76
77  TCollection_AsciiString buffer;
78  Standard_Integer pos;
79
80  buffer = what;
81
82  if (buffer.Search("\"") != -1){  // a username to extract
83
84    if (buffer.Value(1) != '"') { // Begins with Node
85     node = buffer.Token("\"");
86     buffer.Remove(1,node.Length());
87    }
88    else node = "";
89
90    username = buffer.Token("\" ");
91    buffer.Remove(1,username.Length()+2); // Removes <<"username ' ' or '"' >>
92
93    if (buffer.Search("\"") != -1){ // a password to extract
94     password = buffer.Token("\"");
95     buffer.Remove(1,password.Length()+1);  // removes <<password">>
96    }
97
98    // If we found a node then we must find "::"
99    if (buffer.Search("::") != -1)
100     buffer.Remove(1,2);            // Removes <<::>>
101  }
102  else  // No name or password
103  if (buffer.Search("::") != -1){ // a node to extract
104   node = buffer.Token(":");
105   buffer.Remove(1,node.Length()+2); // Removes <<node::>
106  }
107
108  if (buffer.Search(":") != -1){ // a disk to extract
109    disk = buffer.Token(":");
110    buffer.Remove(1,disk.Length()+1);  // Removes <<disk:>>
111  }
112  else disk = "";
113
114  // Analyse trek
115
116  if (buffer.Search("[") != -1){  // There is atrek to extract
117   trek = buffer.Token("[]");
118
119   if (trek.Value(1) == '.') trek.Remove(1,1);  // Removes first '.'
120     else trek.Insert(1,'|');                   // Add root
121
122   trek.ChangeAll('.','|');   // Translates to portable syntax
123   trek.ChangeAll('-','^');  
124
125   pos = trek.Search("000000");
126   if (pos != -1) {
127    trek.Remove(pos,6); // on VMS [000000] is the root
128    if (trek.Search("||") != -1) trek.Remove(1,1); // When [000000.xxx] -> ||xxx
129   }
130
131   name = buffer.Token("]",2);
132  }
133  else name = buffer;
134
135  if (name.Search(".") != -1){
136   ext = name.Token(".",2);
137   ext.Insert(1,'.');
138   name.Remove(name.Search("."),ext.Length());
139  }
140  else ext = "";
141   
142 }
143
144
145 //=======================================================================
146 //function : UnixExtract
147 //purpose  : 
148 //=======================================================================
149 static void UnixExtract(const TCollection_AsciiString& what,
150                         TCollection_AsciiString& node,
151                         TCollection_AsciiString& username,
152                         TCollection_AsciiString& password,
153                         TCollection_AsciiString& trek,
154                         TCollection_AsciiString& name,
155                         TCollection_AsciiString& ext){
156
157  Standard_Integer pos;
158  TCollection_AsciiString buffer;   // To manipulate 'what' without modifying it
159
160  Standard_PCharacter p;
161  buffer = what;
162
163 #ifdef TOTO  // Username, password and node are no longer given in the string (LD)
164
165  if (buffer.Search("@") != -1){  // There is a name to extract
166   username = buffer.Token("\"@");
167   buffer.Remove(1,username.Length()+1);   // Removes << user@ >>
168
169   if (buffer.Search("\"") != -1){       // There is a password to extract
170    password = buffer.Token("\"");
171    buffer.Remove(1,password.Length()+2);  // Removes << "password" >>
172   }
173
174  }
175  else {
176   username = "";
177   password = "";
178  }
179
180 #endif  // node must be given (for DBT, DM) (ADN 29/8/96)
181
182  if (buffer.Search(":/") != -1){      // There is a node to extract
183   node = buffer.Token(":/");
184   buffer.Remove(1,node.Length()+1);  // Removes << node: >>
185  }
186  else node = ""; 
187
188   username = "";
189   password = "";
190 //  node = ""; 
191  
192  trek = buffer;
193
194  trek.ChangeAll('/','|');  // Translates to portable syntax
195
196  pos = trek.SearchFromEnd("|");  // Extract name
197  if (pos != -1) {
198   p = (Standard_PCharacter)trek.ToCString();
199   name = &p[pos];
200   if(name.Length()) trek.Remove(pos+1,name.Length());
201  }
202  else {   // No '|' means no trek but a name
203   name = buffer;
204   trek = "";
205  }
206
207  pos = trek.Search("..");
208  while (pos != -1){        // Changes every ".." by '^'
209   trek.SetValue(pos,'^');
210   trek.Remove(pos+1,1);
211   pos = trek.Search("..");
212  }
213
214   pos = name.SearchFromEnd(".") ;   // LD : debug
215   if (pos != -1)      // There is an extension to extract
216     ext = name.Split(pos - 1) ;  
217
218
219 // if (name.Search(".") != -1){ // There is an extension to extract
220 //   if ( name.Value(1) == '.' ) {
221 //     ext = name;
222 //     name.Clear();
223 //   }
224 //   else {
225 //     ext = name.Token(".",2); 
226 //     ext.Insert(1,'.');            // Prepends 'dot'
227 //     pos = name.Search(".");     // Removes extension from buffer
228 //     if (pos != -1)
229 //       name.Remove(pos,ext.Length());
230 //   }
231 // }
232
233 }
234
235
236 //=======================================================================
237 //function : DosExtract
238 //purpose  : 
239 //=======================================================================
240 static void DosExtract(const TCollection_AsciiString& what,
241                 TCollection_AsciiString& disk,
242                 TCollection_AsciiString& trek,
243                 TCollection_AsciiString& name,
244                 TCollection_AsciiString& ext){
245
246  TCollection_AsciiString buffer;
247  Standard_Integer pos;
248  Standard_PCharacter p;
249
250  buffer = what;
251
252  if (buffer.Search(":") != -1){ // There is a disk to extract
253   disk = buffer.Token(":");
254   disk += ":";
255   buffer.Remove(1,disk.Length());  // Removes <<disk:>>
256  }
257
258  if (buffer.Search(".") != -1){ // There is an extension to extract
259   ext = buffer.Token(".",2); 
260   ext.Insert(1,'.');            // Prepends 'dot'
261   pos = buffer.Search(".");     // Removes extension from buffer
262   if (pos != -1)
263    buffer.Remove(pos,ext.Length());
264  }
265
266  trek = buffer;
267
268  trek.ChangeAll('\\','|');  
269
270  pos = trek.Search("..");
271  while (pos != -1){        // Changes every ".." by '^'
272   trek.SetValue(pos,'^');
273   trek.Remove(pos+1,1);
274   pos = trek.Search("..");
275  }
276
277  pos = trek.SearchFromEnd("|");  // Extract name
278  if (pos != -1) {
279   p = (Standard_PCharacter)trek.ToCString();
280   name = &p[pos];
281   trek.Remove(trek.Search(name),name.Length());
282  }
283  else {   // No '|' means no trek but a name
284   name = buffer;
285   trek = "";
286  }
287 }
288
289
290 //=======================================================================
291 //function : MacExtract
292 //purpose  : 
293 //=======================================================================
294 static void MacExtract(const TCollection_AsciiString& what,
295                 TCollection_AsciiString& ,
296                 TCollection_AsciiString& trek,
297                 TCollection_AsciiString& name,
298                 TCollection_AsciiString& ){
299
300   Standard_Integer pos;
301   Standard_PCharacter p;
302   
303   // I don't know how to distingish a disk from a trek !
304   
305   trek = what;
306   
307   pos = trek.Search("::");
308   while (pos != -1){        // Changes every "::" by '^'
309     trek.SetValue(pos,'^');
310     trek.Remove(pos+1,1);
311     pos = trek.Search("::");
312   }
313
314   trek.ChangeAll(':','|');  // Translates to portable syntax
315
316   pos = trek.SearchFromEnd("|");  // Extract name
317   if (pos != -1) {
318     p = (Standard_PCharacter)trek.ToCString();
319     name = &p[pos+1];
320     trek.Remove(trek.Search(name),name.Length());
321   }
322   else {   // No '|' means no trek but a name
323     name = what;
324     trek = "";
325   }
326 }
327
328
329 OSD_Path::OSD_Path(const TCollection_AsciiString& aDependentName,
330                    const OSD_SysType aSysType){
331
332  mySysDep = whereAmI();
333
334  OSD_SysType todo;
335 //  Standard_Integer i,l;
336
337   if (aSysType == OSD_Default) {
338     todo = mySysDep;
339   } else {
340     todo = aSysType;
341   }
342
343  switch (todo){
344   case OSD_VMS:
345      VmsExtract(aDependentName,myNode,myUserName,myPassword,myDisk,myTrek,myName,myExtension);
346      break;
347   case OSD_LinuxREDHAT:
348   case OSD_UnixBSD:
349   case OSD_UnixSystemV:
350   case OSD_Aix:
351   case OSD_OSF:
352      UnixExtract(aDependentName,myNode,myUserName,myPassword,myTrek,myName,myExtension);
353      break;
354   case OSD_OS2:
355   case OSD_WindowsNT:
356      DosExtract(aDependentName,myDisk,myTrek,myName,myExtension);
357      break;
358   case OSD_MacOs:
359      MacExtract(aDependentName,myDisk,myTrek,myName,myExtension);
360      break;
361   default:
362 #ifdef OCCT_DEBUG
363        cout << " WARNING WARNING : OSD Path for an Unknown SYSTEM : " << (Standard_Integer)todo << endl;
364 #endif 
365      break ;
366  } 
367 }
368
369
370
371 OSD_Path::OSD_Path(const TCollection_AsciiString& Nod,
372                    const TCollection_AsciiString& UsrNm,
373                    const TCollection_AsciiString& Passwd,
374                    const TCollection_AsciiString& Dsk,
375                    const TCollection_AsciiString& Trk,
376                    const TCollection_AsciiString& Nam,
377                    const TCollection_AsciiString& ext){
378
379  mySysDep = whereAmI();
380
381  SetValues ( Nod, UsrNm, Passwd, Dsk, Trk, Nam, ext);
382
383
384 }
385
386
387 void OSD_Path::Values(TCollection_AsciiString& Nod, 
388                       TCollection_AsciiString& UsrNm, 
389                       TCollection_AsciiString& Passwd, 
390                       TCollection_AsciiString& Dsk, 
391                       TCollection_AsciiString& Trk,
392                       TCollection_AsciiString& Nam,
393                       TCollection_AsciiString& ext)const{
394
395  Nod = myNode;
396  UsrNm = myUserName;
397  Passwd = myPassword;
398  Dsk = myDisk;
399  Trk = myTrek;
400  Nam = myName;
401  ext = myExtension;
402 }
403
404
405 void OSD_Path::SetValues(const TCollection_AsciiString& Nod, 
406                          const TCollection_AsciiString& UsrNm, 
407                          const TCollection_AsciiString& Passwd,
408                          const TCollection_AsciiString& Dsk,
409                          const TCollection_AsciiString& Trk,
410                          const TCollection_AsciiString& Nam,
411                          const TCollection_AsciiString& ext){
412
413  if (!Nod.IsAscii())
414   Standard_ConstructionError::Raise("OSD_Path::SetValues argument : Node");
415  if (!UsrNm.IsAscii())
416   Standard_ConstructionError::Raise("OSD_Path::SetValues argument : User Name");
417  if (!Dsk.IsAscii())
418   Standard_ConstructionError::Raise("OSD_Path::SetValues argument : Disk");
419  if (!Trk.IsAscii())
420   Standard_ConstructionError::Raise("OSD_Path::SetValues argument : Trek");
421  if (!Nam.IsAscii())
422   Standard_ConstructionError::Raise("OSD_Path::SetValues argument : Name");
423  if (!ext.IsAscii())
424   Standard_ConstructionError::Raise("OSD_Path::SetValues argument : Extension");
425
426  myNode = Nod;
427  myUserName = UsrNm;
428  myPassword = Passwd;
429  myDisk = Dsk;
430  myTrek = Trk;
431  myName = Nam;
432  myExtension = ext;
433 }
434
435 void OSD_Path::UpTrek(){
436  Standard_Integer length=TrekLength();
437
438  if (length == 0) return;
439
440  Standard_Integer awhere,aHowmany;
441  TCollection_AsciiString tok;
442
443  tok = myTrek.Token("|",length);
444  awhere = myTrek.SearchFromEnd(tok);
445  aHowmany = tok.Length();
446  myTrek.Remove(awhere,aHowmany);
447
448  awhere = myTrek.Search("||");   // Searches leaving "||"
449  if (awhere != -1)
450   myTrek.Remove(awhere);
451 }
452
453
454 void OSD_Path::DownTrek(const TCollection_AsciiString& aName){
455  myTrek += aName;
456 // Pb signale par GG : pour ne pas avoir "||" ;
457  if ( aName.ToCString()[ aName.Length() - 1 ] != '|' )
458    myTrek += "|";
459 }
460
461
462 Standard_Integer OSD_Path::TrekLength()const{
463  Standard_Integer cpt=0;
464
465  while (myTrek.Token("|",cpt+1) != "")  // Counts token separated by '|'
466   cpt++;
467
468  return(cpt);
469 }
470
471
472 void OSD_Path::RemoveATrek(const Standard_Integer thewhere){
473  Standard_Integer length=TrekLength();
474
475  if (length <= 0 || thewhere > length)
476   Standard_NumericError::Raise("OSD_Path::RemoveATrek : where has an invalid value");
477
478  Standard_Integer posit,aHowmany;
479  TCollection_AsciiString tok;
480
481  tok = myTrek.Token("|",thewhere);
482  posit = myTrek.Search(tok);
483  aHowmany = tok.Length();
484  myTrek.Remove(posit,aHowmany);
485
486  posit = myTrek.Search("||");   // Searches leaving "||"
487  if (posit != -1)
488   myTrek.Remove(posit);
489 }
490
491
492 void OSD_Path::RemoveATrek(const TCollection_AsciiString& aName){
493  Standard_Integer length=TrekLength();
494
495  if (length == 0) return;
496
497  Standard_Integer awhere;
498
499  awhere = myTrek.Search(aName);
500  if (awhere != -1){
501   myTrek.Remove(awhere,aName.Length());
502
503   awhere = myTrek.Search("||");   // Searches leaving "||"
504   if (awhere != -1)
505    myTrek.Remove(awhere); 
506  } 
507 }
508
509
510 TCollection_AsciiString OSD_Path::TrekValue(const Standard_Integer thewhere)const{
511  TCollection_AsciiString result=myTrek.Token("|",thewhere);
512
513  if (result == "")
514   Standard_NumericError::Raise("OSD_Path::TrekValue : where is invalid");
515
516  return(result);
517 }
518
519 void OSD_Path::InsertATrek(const TCollection_AsciiString& aName,
520                            const Standard_Integer thewhere){
521  Standard_Integer length=TrekLength();
522
523  if (thewhere <= 0 || thewhere > length)
524   Standard_NumericError::Raise("OSD_Path::InsertATrek : where has an invalid value");
525
526  TCollection_AsciiString tok=myTrek.Token("|",thewhere);
527  Standard_Integer wwhere = myTrek.Search(tok);
528  TCollection_AsciiString what = aName;
529  what += "|";
530
531  myTrek.Insert(wwhere,what);
532 }
533
534
535 // The 4 following methods will be PUBLIC in the future
536
537 // Converts a VMS disk to other system syntax
538
539 static void VMSDisk2Other(TCollection_AsciiString & Disk){
540  Disk.RemoveAll('$');
541 }
542
543
544 // Convert a Trek to VMS syntax
545
546 static void P2VMS (TCollection_AsciiString & Way){
547  Standard_Integer length = Way.Length();
548
549  if (length == 0) return;
550
551  if (Way.Value(1) == '|')             // If begin with '|' remove '|'
552   if (Way.Value(1) != '\0')
553    Way.Remove(1,1);
554   else Way = "000000";             // Si uniquement la racine -> [000000]
555  else
556   if (Way.Length()!=0)
557    Way.Insert(1,'|');          // Else insert '|' at beginning if not empty;
558
559  Way.ChangeAll('|','.');
560  Way.ChangeAll('^','-');
561
562 }
563
564 // Convert a Trek to MAC syntax
565
566 static void P2MAC (TCollection_AsciiString & Way){
567  int i,l;
568  Way.ChangeAll('|',':');
569
570  l = (int)Way.Length();
571  for (i=1; i <= l; i++)             // Replace '^' by "::"
572   if (Way.Value(i) == '^'){
573    Way.SetValue(i,':');
574    Way.Insert(i,':');
575    i++; l++;
576   } 
577 }
578
579
580 // Convert a Trek to UNIX syntax
581
582 static void P2UNIX (TCollection_AsciiString & Way){
583  int i,l;
584  Standard_Integer length = Way.Length();
585
586  if (length == 0) return;
587
588  // if (Way.Value(length) == '|') // If Finishes with "|" removes it
589  // Way.Trunc(length-1);
590
591  Way.ChangeAll('|','/');
592  
593  l = (int)Way.Length();
594  for (i=1; i <= l; i++)             // Replace '^' by "../"
595   if (Way.Value(i) == '^'){
596    Way.SetValue(i,'.');
597    Way.Insert(i+1,'.');
598    //Way.Insert(i+2,'/');
599    i +=1; l +=1;
600   } 
601 }
602
603
604 // Convert a Trek to DOS like syntax
605
606 static void P2DOS (TCollection_AsciiString & Way){
607  int i,l;
608  Standard_Integer len = Way.Length();
609
610  if (len == 0) return;
611
612  if (Way.Value(len) == '|')   // If Finishes with "|" removes it
613   Way.Trunc(len-1);
614
615  Way.ChangeAll('|','\\');
616  
617  l = (int)Way.Length();
618  for (i=1; i <= l; i++)             // Replace '^' by ".."
619   if (Way.Value(i) == '^'){
620    Way.SetValue(i,'.');
621    Way.Insert(i,'.');
622    i++; l++;
623   } 
624
625 }
626
627
628
629
630 // Convert a path to system dependant syntax
631
632 void OSD_Path::SystemName (TCollection_AsciiString& FullName,
633                            const OSD_SysType aType)const{
634 TCollection_AsciiString Way;
635 TCollection_AsciiString pNode;
636 TCollection_AsciiString pDisk;
637 OSD_SysType pType;
638
639  if (aType == OSD_Default) {
640    pType = mySysDep;
641  } else {
642    pType = aType;
643  }
644
645  Way = myTrek;
646  FullName.Clear();
647
648  switch (pType){
649   case OSD_VMS :
650    pNode = myNode;
651
652    P2VMS (Way);    // Convert path
653
654    if (myNode.Length()!=0) FullName += myNode;      // Append Node
655
656    if (myUserName.Length()!=0){   // Append User name
657
658     if (pNode.Length()==0) {    // If a user name but no node, catenate "0"
659      pNode = "0";
660      FullName += pNode;
661     }
662
663
664     FullName += "\"";
665     FullName += myUserName;
666
667     if (myPassword.Length()!=0){  // Append password
668      FullName += " ";
669      FullName += myPassword;
670     }
671
672     FullName += "\"";
673    }
674
675    if (pNode.Length()!=0) FullName += "::";
676
677    if (myDisk.Length()!=0){       // Append Disk
678     FullName += myDisk;
679     FullName += ":";
680    }
681     
682
683    if (Way.Length()!=0)         // Append VMS path
684     FullName = FullName + "[" + Way + "]" + myName + myExtension;
685
686 //   FullName.UpperCase();
687    break;
688
689
690    case OSD_OS2 :
691    case OSD_WindowsNT :            // MSDOS-like syntax
692     {
693     int length = (int)myDisk.Length();
694
695     P2DOS (Way);
696     if (length != 1)
697
698     if (myDisk.Length()!=0){
699
700      if (
701          (length == 1 && IsAlphabetic(myDisk.Value(1))) ||     // 'A/a' to 'Z/z'
702          (length == 2 &&
703           IsAlphabetic(myDisk.Value(1)) &&
704           myDisk.Value(2) == ':')                         // 'A:' to 'Z:'
705         )    // This is a MSDOS disk syntax
706      {
707       FullName += myDisk;
708       if (myDisk.Value(length) != ':') FullName += ":";
709      }
710      else   // This is an assigned Disk
711      {
712       FullName += "\\";
713       pDisk = myDisk;
714       VMSDisk2Other(pDisk);
715       FullName += pDisk;
716       if (Way.Value(1) != '\\') FullName += "\\";
717      }
718     }
719
720     if (Way.Length()!=0)
721      FullName = FullName + Way + "\\";
722     
723     FullName += myName; 
724     FullName += myExtension;
725 //    FullName.UpperCase();
726     break;
727    }
728
729    case OSD_MacOs :                // Mackintosh-like syntax
730     if (myDisk.Length()!=0){
731      FullName += myDisk ;
732      FullName += ":";
733     }
734     P2MAC(Way); 
735     FullName += myName;
736     FullName += myExtension;
737    break;
738
739
740
741    default :                      // UNIX-like syntax
742
743  // Syntax :
744  //             user"password"@host:/disk/xxx/xxx/filename
745     P2UNIX (Way);
746
747     if (myUserName.Length()!=0 && myNode.Length()!=0){  // If USER name
748      FullName += myUserName;                        // appends user name 
749
750      if (myPassword.Length()!=0)
751       FullName = FullName + "\"" + myPassword + "\""; // a password if not empty
752
753      FullName += "@";                            // and character '@'
754     }
755
756     if (myNode.Length()!=0){                     // Appends HOST name
757      FullName += myNode;
758      FullName += ":";
759     }
760
761     if (myDisk.Length()!=0) {                    // Appends Disk name as path
762      FullName += "/";
763      pDisk = myDisk;
764      VMSDisk2Other(pDisk);
765      FullName += pDisk;
766     }
767
768 //    if (FullName.Length()) {                     // Adds a "/" if necessary
769 //      FullName += "/";
770 //    }
771
772     if (Way.Length()!=0) {                       // Appends a path if not empty
773       FullName += Way ; 
774     }
775
776     if (FullName.Length()){
777         if (FullName.Value(FullName.Length()) != '/') {
778            FullName += "/";                      // Adds a / if necessary
779        }
780     }
781
782     if (myName.Length()){                        // Adds the file name
783       FullName += myName;
784     }
785
786     if (myExtension.Length()) {                  // Adds the extension
787       FullName += myExtension;
788     }
789     break;
790  }
791 }
792
793 #ifdef TOTO  // A reactiver...
794
795 void OSD_Path::SetSystemName(const TCollection_AsciiString& aDependentName,
796                    const OSD_SysType aSysType){
797   UnixExtract(aDependentName,myNode,myUserName,myPassword,myTrek,myName,myExtension);
798 }
799 #endif
800
801 TCollection_AsciiString OSD_Path::Node()const{
802  return(myNode);
803 }
804
805
806 TCollection_AsciiString OSD_Path::UserName()const{
807  return(myUserName);
808 }
809
810
811 TCollection_AsciiString OSD_Path::Password()const{
812  return(myPassword);
813 }
814
815
816 TCollection_AsciiString OSD_Path::Disk()const{
817  return(myDisk);
818 }
819
820
821 TCollection_AsciiString OSD_Path::Trek()const{
822  return(myTrek);
823 }
824
825
826 // Return extension (suffix) of file/directory name
827
828 TCollection_AsciiString OSD_Path::Extension()const{
829  return(myExtension);
830 }
831
832
833 TCollection_AsciiString OSD_Path::Name()const{
834  return(myName);
835 }
836
837
838 void OSD_Path::SetNode(const TCollection_AsciiString& aName){
839  if (!aName.IsAscii())
840   Standard_ConstructionError::Raise("OSD_Path::SetNode bad name");
841  myNode = aName;
842 }
843
844
845
846
847 void OSD_Path::SetUserName(const TCollection_AsciiString& aName){
848  if (!aName.IsAscii())
849   Standard_ConstructionError::Raise("OSD_Path::SetUserName bad name");
850  myUserName = aName;
851 }
852
853
854
855
856 void OSD_Path::SetPassword(const TCollection_AsciiString& aName){
857  if (!aName.IsAscii())
858   Standard_ConstructionError::Raise("OSD_Path::SetPassword bad name");
859   myPassword = aName;
860 }
861
862
863
864
865 void OSD_Path::SetDisk(const TCollection_AsciiString& aName){
866  if (!aName.IsAscii())
867   Standard_ConstructionError::Raise("OSD_Path::SetDisk bad name");
868   myDisk = aName;
869 }
870
871
872
873
874 void OSD_Path::SetTrek(const TCollection_AsciiString& aName){
875  if (!aName.IsAscii())
876   Standard_ConstructionError::Raise("OSD_Path::SetTrek bad name");
877   myTrek = aName;
878 }
879
880
881
882
883 void OSD_Path::SetName(const TCollection_AsciiString& aName){
884  if (!aName.IsAscii())
885   Standard_ConstructionError::Raise("OSD_Path::SetName bad name");
886   myName = aName;
887 }
888
889
890
891
892 void OSD_Path::SetExtension(const TCollection_AsciiString& aName){
893  if (!aName.IsAscii())
894   Standard_ConstructionError::Raise("OSD_Path::SetExtension bad name");
895   myExtension = aName;
896 }
897
898 #else
899
900 //------------------------------------------------------------------------
901 //-------------------  Windows sources for OSD_Path -------------------
902 //------------------------------------------------------------------------
903
904 #include <Standard_ProgramError.hxx>
905
906 #include <windows.h>
907 #include <stdlib.h>
908
909 #define TEST_RAISE( type, arg ) _test_raise (  ( type ), ( arg )  )
910
911 static void __fastcall _test_raise ( OSD_SysType, Standard_CString );
912 static void __fastcall _remove_dup ( TCollection_AsciiString& );
913
914 OSD_Path :: OSD_Path () {
915
916 }  // end constructor ( 1 )
917
918 OSD_Path ::  OSD_Path (
919               const TCollection_AsciiString& aDependentName,
920               const OSD_SysType aSysType
921                           ) :
922   myUNCFlag(Standard_False),
923   mySysDep(OSD_WindowsNT)
924 {
925
926  Standard_Integer        i, j, len;
927  static char __drive [ _MAX_DRIVE ];
928  static char __dir [ _MAX_DIR ];
929  static char __trek [ _MAX_DIR ];
930  static char __fname [ _MAX_FNAME ];
931  static char __ext [ _MAX_EXT ];
932
933  memset(__drive, 0,_MAX_DRIVE);
934  memset(__dir, 0,_MAX_DIR);
935  memset(__trek, 0,_MAX_DIR);
936  memset(__fname, 0,_MAX_FNAME);
937  memset(__ext, 0,_MAX_EXT);
938  Standard_Character      chr;
939
940  TEST_RAISE(  aSysType, "OSD_Path"  );
941
942  _splitpath (  aDependentName.ToCString (), __drive, __dir, __fname, __ext );
943  
944  
945
946  myDisk      = __drive;
947  myName      = __fname;
948  myExtension = __ext;
949
950  {
951    TCollection_AsciiString dir   = __dir;
952    len = dir.Length ();
953  }
954
955  for ( i = j = 0; i < len; ++i, ++j ) {
956
957   chr = __dir[i];
958  
959   if (  chr == '\\' || chr == '/'  )
960
961    __trek[j] = '|';
962
963   else if (  chr == '.'&& (i+1) < len && __dir[i+1] == '.'  ) {
964   
965    __trek[j] = '^';
966    ++i;
967   
968   } else
969
970    __trek[j] = chr;
971  
972  }  // end for
973  __trek[j] = '\0';
974  TCollection_AsciiString trek  = __trek;
975  _remove_dup ( trek );
976  myTrek = trek;
977
978 }  // end constructor ( 2 )
979
980 OSD_Path :: OSD_Path (
981              const TCollection_AsciiString& aNode,
982              const TCollection_AsciiString& aUsername,
983              const TCollection_AsciiString& aPassword,
984              const TCollection_AsciiString& aDisk,
985              const TCollection_AsciiString& aTrek,
986              const TCollection_AsciiString& aName,
987              const TCollection_AsciiString& anExtension
988                          ) :
989   myUNCFlag(Standard_False),
990   mySysDep(OSD_WindowsNT)
991 {
992
993  SetValues ( aNode, aUsername, aPassword, aDisk, aTrek, aName, anExtension );
994
995 }  // end constructor ( 3 )
996
997 void OSD_Path :: Values (
998                   TCollection_AsciiString& aNode,
999                   TCollection_AsciiString& aUsername,
1000                   TCollection_AsciiString& aPassword,
1001                   TCollection_AsciiString& aDisk,
1002                   TCollection_AsciiString& aTrek,
1003                   TCollection_AsciiString& aName,
1004                   TCollection_AsciiString& anExtension
1005                  ) const {
1006
1007  aNode       = myNode;
1008  aUsername   = myUserName;
1009  aPassword   = myPassword;
1010  aDisk       = myDisk;
1011  aTrek       = myTrek;
1012  if (!aTrek.IsEmpty() && aTrek.Value(aTrek.Length()) != '|')
1013    aTrek += "|" ; // (LD)
1014  aName       = myName;
1015  anExtension = myExtension;
1016
1017 }  // end OSD_Path :: Values
1018
1019 void OSD_Path :: SetValues (
1020                   const TCollection_AsciiString& aNode,
1021                   const TCollection_AsciiString& aUsername,
1022                   const TCollection_AsciiString& aPassword,
1023                   const TCollection_AsciiString& aDisk,
1024                   const TCollection_AsciiString& aTrek,
1025                   const TCollection_AsciiString& aName,
1026                   const TCollection_AsciiString& anExtension
1027                  ) {
1028
1029  myNode      = aNode;
1030  myUserName  = aUsername;
1031  myPassword  = aPassword;
1032  myDisk      = aDisk;
1033  myTrek      = aTrek;
1034  myName      = aName;
1035  myExtension = anExtension;
1036
1037  if (  myExtension.Length () && myExtension.Value ( 1 ) != '.'  )
1038
1039   myExtension.Insert (  1, '.'  );
1040
1041  _remove_dup ( myTrek );
1042
1043 }  // end OSD_Path :: SetValues
1044
1045 void OSD_Path :: SystemName (
1046                   TCollection_AsciiString& FullName,
1047                   const OSD_SysType aType
1048                  ) const {
1049
1050  Standard_Integer        i, j;
1051  TCollection_AsciiString fullPath;
1052  static Standard_Character trek [ _MAX_PATH ];
1053  Standard_Character      chr;
1054
1055  memset(trek,0,_MAX_PATH);
1056
1057  TEST_RAISE(  aType, "SystemName"  );
1058
1059  for ( i = j = 1; i <= myTrek.Length () && j <= _MAX_PATH; ++i, ++j ) {
1060
1061   chr = myTrek.Value ( i );   
1062
1063   if (  chr == '|'  ) {
1064   
1065    trek[j-1] = '/';
1066   
1067   } else if (  chr == '^' && j <= _MAX_PATH - 1  ) {
1068    
1069    strcpy(&(trek[(j++) - 1]),"..");
1070
1071   } else
1072
1073    trek[j-1] = chr ;
1074  
1075  }  //end for
1076
1077  fullPath = myDisk + TCollection_AsciiString(trek);
1078  
1079  if ( trek[0] ) fullPath += "/";
1080  
1081  fullPath += ( myName + myExtension );
1082
1083  if (  fullPath.Length () > 0  )
1084
1085   FullName = fullPath;
1086
1087  else
1088
1089   FullName.Clear ();
1090
1091 }  // end OSD_Path :: SystemName
1092
1093 void OSD_Path :: UpTrek () {
1094
1095  Standard_Integer pos = myTrek.SearchFromEnd (  "|"  );
1096
1097  if ( pos == -1 )
1098
1099   pos = 0;
1100
1101  else if ( pos > 1 ) {
1102
1103   while (  myTrek.Value ( pos ) == '|' && pos != 1  ) --pos;
1104
1105  }  // end if
1106
1107  myTrek.Trunc ( pos );
1108
1109 }  // end OSD_Path :: UpTrek
1110
1111 void OSD_Path :: DownTrek ( const TCollection_AsciiString& aName ) {
1112
1113  Standard_Integer pos = myTrek.Length ();
1114
1115  if (  aName.Value ( 1 ) != '|'    &&
1116        pos                                 &&
1117        myTrek.Value ( pos ) != '|'
1118  )
1119
1120   myTrek += "|";
1121
1122  myTrek += aName;
1123
1124  _remove_dup ( myTrek );
1125
1126 }  // end OSD_Path :: DownTrek
1127
1128 Standard_Integer OSD_Path :: TrekLength () const {
1129
1130  Standard_Integer i      = 1;
1131  Standard_Integer retVal = 0;
1132
1133  if (  myTrek.IsEmpty () || myTrek.Length () == 1 && myTrek.Value ( 1 ) == '|'  )
1134
1135   return retVal;
1136
1137  for (;;) {
1138  
1139   if (  myTrek.Token (  "|", i++  ).IsEmpty ()  )
1140
1141    break;
1142
1143   ++retVal;
1144  
1145  }  //end while
1146
1147  return retVal;
1148
1149 }  // end TrekLength
1150
1151 void OSD_Path :: RemoveATrek ( const Standard_Integer thewhere ) {
1152
1153  Standard_Integer i, j;
1154  Standard_Boolean flag = Standard_False;
1155
1156  if (  TrekLength () < thewhere  )
1157
1158   return;
1159
1160  if (  myTrek.Value ( 1 ) != '|'  ) {
1161  
1162   flag = Standard_True;
1163   myTrek.Insert (  1, '|'  );
1164  
1165  }  // end if
1166
1167  i = myTrek.Location (
1168              thewhere, '|',
1169              1, myTrek.Length ()
1170             );
1171
1172  if ( i ) {
1173
1174   j = myTrek.Location (
1175               thewhere + 1, '|',
1176               1, myTrek.Length ()
1177              );
1178
1179   if ( j == 0 )
1180
1181    j = myTrek.Length () + 1;
1182
1183   myTrek.Remove ( i, j - i );
1184
1185  }  // end if
1186
1187  if ( flag )
1188
1189   myTrek.Remove ( 1 );
1190
1191 }  // end OSD_Path :: RemoveATrek ( 1 )
1192
1193 void OSD_Path :: RemoveATrek ( const TCollection_AsciiString& aName ) {
1194
1195  Standard_Integer        i;
1196  Standard_Boolean        flag = Standard_False;
1197  TCollection_AsciiString tmp;
1198
1199  if (  myTrek.Value ( 1 ) != '|'  ) {
1200  
1201   flag = Standard_True;
1202   myTrek.Insert (  1, '|'  );
1203  
1204  }  // end if
1205
1206  myTrek += '|';
1207
1208  tmp = aName;
1209
1210  if (  tmp.Value ( 1 ) != '|'  )
1211
1212   tmp.Insert (  1, '|'  );
1213
1214  if (   tmp.Value (  tmp.Length ()  ) != '|'   )
1215
1216   tmp += '|';
1217
1218  i = myTrek.Search ( tmp );
1219
1220  if ( i != -1 )
1221  
1222   myTrek.Remove (  i + 1, tmp.Length () - 1  );
1223
1224  if ( flag )
1225
1226   myTrek.Remove ( 1 );
1227  
1228  if (   myTrek.Value (  myTrek.Length ()  ) == '|'  )
1229
1230   myTrek.Trunc (  myTrek.Length () - 1  );
1231
1232 }  // end OSD_Path :: RemoveATrek ( 2 )
1233
1234 TCollection_AsciiString OSD_Path :: TrekValue (
1235                                      const Standard_Integer thewhere
1236                                     ) const {
1237
1238  TCollection_AsciiString retVal;
1239  TCollection_AsciiString trek = myTrek;
1240
1241  if (  trek.Value ( 1 ) != '|'  )
1242  
1243   trek.Insert (  1, '|'  );
1244  
1245  retVal = trek.Token (  "|", thewhere  );
1246
1247  return retVal;
1248
1249 }  // end OSD_Path :: TrekValue
1250
1251 void OSD_Path :: InsertATrek (
1252                   const TCollection_AsciiString& aName,
1253                   const Standard_Integer thewhere
1254                  ) {
1255
1256  Standard_Integer        pos;
1257  TCollection_AsciiString tmp = aName;
1258  Standard_Boolean        flag = Standard_False;
1259
1260  if (  myTrek.Value ( 1 ) != '|'  ) {
1261  
1262   flag = Standard_True;
1263   myTrek.Insert (  1, '|'  );
1264  
1265  }  // end if
1266
1267  myTrek += '|';
1268
1269  pos = myTrek.Location (
1270                thewhere, '|',
1271                1, myTrek.Length ()
1272               );
1273
1274  if ( pos ) {
1275
1276   if (   tmp.Value (  tmp.Length ()  ) != '|'   )
1277
1278    tmp += '|';
1279
1280   myTrek.Insert ( pos + 1, tmp );
1281
1282  }  // end if
1283
1284  if ( flag )
1285
1286   myTrek.Remove ( 1 );
1287
1288  if (   myTrek.Value (  myTrek.Length ()  ) == '|'  )
1289
1290   myTrek.Trunc (  myTrek.Length () - 1  );
1291
1292  _remove_dup ( myTrek );
1293
1294 }  // end OSD_Path :: InsertATrek
1295
1296 TCollection_AsciiString OSD_Path :: Node () const {
1297
1298  return myNode;
1299
1300 }  // end OSD_Path :: Node
1301
1302 TCollection_AsciiString OSD_Path :: UserName () const {
1303
1304  return myUserName;
1305
1306 }  // end OSD_Path :: UserName
1307
1308 TCollection_AsciiString OSD_Path :: Password () const {
1309
1310  return myPassword;
1311
1312 }  // end OSD_Path :: Password
1313
1314 TCollection_AsciiString OSD_Path :: Disk () const {
1315
1316  return myDisk;
1317
1318 }  // end OSD_Path :: Disk
1319
1320 TCollection_AsciiString OSD_Path :: Trek () const {
1321
1322  TCollection_AsciiString retVal ;
1323  retVal = myTrek ;
1324  if (!retVal.IsEmpty() && retVal.Value(retVal.Length()) != '|')
1325    retVal += "|" ;          // (LD)
1326  return retVal;
1327
1328 }  // end OSD_Path :: Trek
1329
1330 TCollection_AsciiString OSD_Path :: Name () const {
1331
1332  return myName;
1333
1334 }  // end OSD_Path :: Name
1335
1336 TCollection_AsciiString OSD_Path :: Extension () const {
1337
1338  return myExtension;
1339
1340 }  // end OSD_Path :: Extension
1341
1342 void OSD_Path :: SetNode ( const TCollection_AsciiString& aName ) {
1343
1344  myNode = aName;
1345
1346 }  // end OSD_Path :: SetNode
1347
1348 void OSD_Path :: SetUserName (const TCollection_AsciiString& aName ) {
1349
1350  myUserName = aName;
1351
1352 }  // end OSD_Path :: SetUserName
1353
1354 void OSD_Path :: SetPassword ( const TCollection_AsciiString& aName ) {
1355
1356  myPassword = aName;
1357
1358 }  // end OSD_Path :: SetPassword
1359
1360 void OSD_Path :: SetDisk ( const TCollection_AsciiString& aName ) {
1361
1362  myDisk = aName;
1363
1364 }  // end OSD_Path :: SetDisk
1365
1366 void OSD_Path :: SetTrek (const TCollection_AsciiString& aName ) {
1367
1368  myTrek = aName;
1369
1370  _remove_dup ( myTrek );
1371
1372 }  // end OSD_Path :: SetTrek
1373
1374 void OSD_Path :: SetName ( const TCollection_AsciiString& aName ) {
1375
1376  myName = aName;
1377
1378 }  // end OSD_Path :: SetName
1379
1380 void OSD_Path :: SetExtension ( const TCollection_AsciiString& aName ) {
1381
1382  myExtension = aName;
1383
1384 }  // end OSD_Path :: SetExtension
1385
1386 static void __fastcall _test_raise ( OSD_SysType type, Standard_CString str ) {
1387
1388  Standard_Character buff[ 64 ];
1389
1390  if ( type != OSD_Default && type != OSD_WindowsNT ) {
1391  
1392   strcpy (  buff, "OSD_Path :: "  );
1393   strcat (  buff, str );
1394   strcat (  buff, " (): unknown system type"  );
1395
1396   Standard_ProgramError :: Raise ( buff );
1397  
1398  }  // end if
1399
1400 }  // end _test_raise
1401
1402 static void __fastcall _remove_dup ( TCollection_AsciiString& str ) {
1403
1404  Standard_Integer pos = 1, orgLen, len = str.Length ();
1405
1406  orgLen = len;
1407
1408  while ( pos <= len ) {
1409  
1410   if (  str.Value ( pos     ) == '|' && pos != len &&
1411         str.Value ( pos + 1 ) == '|' && pos != 1
1412   ) {
1413   
1414    ++pos;
1415
1416    while (  pos <= len && str.Value ( pos ) == '|'  ) str.Remove ( pos ), --len;
1417   
1418   } else
1419
1420    ++pos;
1421  
1422  }  // end while
1423
1424  if (  orgLen > 1 && len > 0 && str.Value ( len ) == '|'  ) str.Remove ( len );
1425
1426  pos = 1;
1427  orgLen = len = str.Length ();
1428
1429  while ( pos <= len ) {
1430  
1431   if (  str.Value ( pos ) == '^' && pos != len && str.Value ( pos + 1 ) == '^'  ) {
1432   
1433    ++pos;
1434
1435    while (  pos <= len && str.Value ( pos ) == '^'  ) str.Remove ( pos ), --len;
1436   
1437   } else
1438
1439    ++pos;
1440  
1441  }  // end while
1442
1443 // if (  orgLen > 1 && len > 0 && str.Value ( len ) == '^'  ) str.Remove ( len );
1444
1445 }  // end _remove_dup
1446
1447 #endif // Windows sources for OSD_Path
1448
1449 // =======================================================================
1450 // function : Analyse_VMS
1451 // purpose  :
1452 // =======================================================================
1453 static Standard_Boolean Analyse_VMS (const TCollection_AsciiString& theName)
1454 {
1455   if (theName.Search ("/")  != -1
1456    || theName.Search ("@")  != -1
1457    || theName.Search ("\\") != -1)
1458   {
1459     return Standard_False;
1460   }
1461
1462   return Standard_True;
1463 }
1464
1465 // =======================================================================
1466 // function : Analyse_DOS
1467 // purpose  :
1468 // =======================================================================
1469 static Standard_Boolean Analyse_DOS(const TCollection_AsciiString& theName)
1470 {
1471   if (theName.Search ("/")  != -1
1472    || theName.Search (":")  != -1
1473    || theName.Search ("*")  != -1
1474    || theName.Search ("?")  != -1
1475    || theName.Search ("\"") != -1
1476    || theName.Search ("<")  != -1
1477    || theName.Search (">")  != -1
1478    || theName.Search ("|")  != -1)
1479   {
1480     return Standard_False;
1481   }
1482
1483  return Standard_True;
1484 }
1485
1486 // =======================================================================
1487 // function : Analyse_MACOS
1488 // purpose  :
1489 // =======================================================================
1490 static Standard_Boolean Analyse_MACOS (const TCollection_AsciiString& theName)
1491 {
1492   return theName.Search(":") == -1 ? theName.Length() <= 31 : Standard_True;
1493 }
1494
1495 // =======================================================================
1496 // function : IsValid
1497 // purpose  :
1498 // =======================================================================
1499 Standard_Boolean OSD_Path::IsValid (const TCollection_AsciiString& theDependentName,
1500                                     const OSD_SysType theSysType)
1501 {
1502   if (theDependentName.Length() == 0)
1503   {
1504     return Standard_True;
1505   }
1506
1507   switch (theSysType == OSD_Default ? whereAmI() : theSysType)
1508   {
1509     case OSD_VMS:
1510       return Analyse_VMS (theDependentName);
1511     case OSD_OS2:
1512     case OSD_WindowsNT:
1513       return Analyse_DOS (theDependentName);
1514     case OSD_MacOs:
1515       return Analyse_MACOS (theDependentName);
1516     default:
1517       return Standard_True;
1518   }
1519 }
1520
1521 // ---------------------------------------------------------------------------
1522
1523 // Elimine les separateurs inutiles
1524
1525
1526 static Standard_Integer RemoveExtraSeparator(TCollection_AsciiString& aString) {
1527
1528   Standard_Integer i, j, len,start = 1 ;
1529
1530   len = aString.Length() ;
1531 #ifdef _WIN32
1532   if (len > 1 && aString.Value(1) == '/' && aString.Value(2) == '/')
1533     start = 2;
1534 #endif 
1535   for (i = j = start ; j <= len ; i++,j++) {
1536       Standard_Character c = aString.Value(j) ;
1537       aString.SetValue(i,c) ;
1538       if (c == '/')
1539           while(j < len && aString.Value(j+1) == '/') j++ ;
1540   }
1541   len = i-1 ;
1542   if (aString.Value(len) == '/') len-- ;  
1543   aString.Trunc(len) ;
1544   return len ;
1545 }
1546
1547 // ---------------------------------------------------------------------------
1548
1549 TCollection_AsciiString OSD_Path::RelativePath(
1550                             const TCollection_AsciiString& aDirPath,
1551                             const TCollection_AsciiString& aAbsFilePath)
1552 {
1553   TCollection_AsciiString EmptyString = "" ;
1554   TCollection_AsciiString FilePath ;
1555   Standard_Integer len ;
1556   Standard_Integer i, n ;
1557   Standard_Boolean Wnt = 0 ;
1558
1559   FilePath = aAbsFilePath ;
1560
1561   if (aDirPath.Search(":") == 2) {    // Cas WNT
1562       Wnt = 1 ;
1563       if (FilePath.Search(":") != 2 || 
1564           UpperCase(aDirPath.Value(1)) != UpperCase(FilePath.Value(1))
1565       )
1566           return  EmptyString ;
1567
1568       FilePath.ChangeAll('\\','/') ;
1569       if (FilePath.Search("/") != 3 )
1570           return  EmptyString ;
1571   }
1572   else {        // Cas Unix
1573       if (aDirPath.Value(1) != '/' || FilePath.Value(1) != '/')
1574           return  EmptyString ;
1575   }
1576
1577   // Eliminer les separateurs redondants
1578
1579   len = RemoveExtraSeparator(FilePath) ;
1580
1581   if (!Wnt) {
1582      if (len < 2)
1583          return  EmptyString ;
1584      FilePath = FilePath.SubString(2,len) ;
1585   }
1586   TCollection_AsciiString DirToken, FileToken ;
1587   Standard_Boolean Sibling = 0 ;
1588
1589   for (i = n = 1 ;; n++) {
1590       DirToken = aDirPath.Token("/\\",n) ;
1591       if (DirToken.IsEmpty())
1592           return FilePath ;
1593
1594       if (!Sibling) {
1595           len = FilePath.Length() ;
1596           i = FilePath.Search("/") ;
1597           if (i > 0) {
1598               if (i == len)
1599                   return EmptyString ;
1600
1601               FileToken = FilePath.SubString(1,i-1) ;
1602               if (Wnt) {
1603                   DirToken.UpperCase() ;
1604                   FileToken.UpperCase() ;
1605               }
1606               if (DirToken == FileToken) {
1607                   FilePath = FilePath.SubString(i+1,len) ;
1608                   continue ;
1609               }
1610           }
1611           else if (DirToken == FilePath)
1612               return EmptyString ;
1613  
1614           else
1615               Sibling = 1 ;
1616       }
1617       FilePath.Insert(1,"../") ;
1618   }
1619 }
1620       
1621 // ---------------------------------------------------------------------------
1622     
1623 TCollection_AsciiString OSD_Path::AbsolutePath(
1624                             const TCollection_AsciiString& aDirPath,
1625                             const TCollection_AsciiString& aRelFilePath)
1626 {
1627   TCollection_AsciiString EmptyString = "" ;
1628   if (aRelFilePath.Search("/") == 1 || aRelFilePath.Search(":") == 2)
1629       return aRelFilePath ;
1630   TCollection_AsciiString DirPath = aDirPath, RelFilePath = aRelFilePath  ;
1631   Standard_Integer i,len ;
1632
1633   if (DirPath.Search("/") != 1 && DirPath.Search(":") != 2)
1634       return EmptyString ;
1635
1636   if ( DirPath.Search(":") == 2)
1637       DirPath.ChangeAll('\\','/') ;
1638   RelFilePath.ChangeAll('\\','/') ;
1639   RemoveExtraSeparator(DirPath) ;
1640   len = RemoveExtraSeparator(RelFilePath) ;
1641   
1642   while (RelFilePath.Search("../") == 1) {
1643       if (len == 3)
1644           return EmptyString ;
1645       RelFilePath = RelFilePath.SubString(4,len) ;
1646       len -= 3 ;
1647       if (DirPath.IsEmpty())
1648           return EmptyString ;
1649       i = DirPath.SearchFromEnd("/") ;
1650       if (i < 0)
1651           return EmptyString ;
1652       DirPath.Trunc(i-1) ;
1653   }
1654   DirPath += '/' ;
1655   DirPath += RelFilePath ;
1656   return DirPath ;
1657 }
1658
1659 //void OSD_Path::ExpandedName(TCollection_AsciiString& aName)
1660 void OSD_Path::ExpandedName(TCollection_AsciiString& )
1661 {
1662 }
1663
1664 //Standard_Boolean LocateExecFile(OSD_Path& aPath)
1665 Standard_Boolean LocateExecFile(OSD_Path& )
1666 {
1667   return Standard_False ;
1668 }