home *** CD-ROM | disk | FTP | other *** search
/ ftptest.leeds.ac.uk / 2015.02.ftptest.leeds.ac.uk.tar / ftptest.leeds.ac.uk / bionet / CAE-GROUP / SCL-WIN3x / SCL.EXE / SFILE_IN.CPP < prev    next >
C/C++ Source or Header  |  1994-08-09  |  7KB  |  309 lines

  1.  
  2. /*
  3. * NIST STEP Core Class Library
  4. * cleditor/STEPfile.inline.cc
  5. * February, 1994
  6. * Peter Carr
  7. * K. C. Morris
  8. * David Sauder
  9.  
  10. * Development of this software was funded by the United States Government,
  11. * and is not subject to copyright.
  12. */
  13.  
  14. /* $Id: STEPfile.inline.cc,v 2.0.1.2 1994/05/10 21:09:16 kc Exp $ */ 
  15.  
  16. #include <Sfile.h>
  17.  
  18.  
  19. extern void HeaderSchemaInit (Registry & reg);
  20.  
  21. //To Be inline functions
  22.  
  23. //constructor & destructor
  24.  
  25. STEPfile::STEPfile(Registry& r, InstMgr& i, const char *filename)
  26.  
  27. #ifdef __O3DB__
  28. : _reg(&r), _instances(&i),
  29. #else
  30. : _reg(r), _instances(i), 
  31. #endif
  32.   _headerId(0), _maxErrorCount(5000), 
  33.   _fileName (0), _errorCount (0), _warningCount (0),
  34.   _fileIdIncr (0)
  35.  
  36.     SetFileType(VERSION_CURRENT);
  37.     SetFileIdIncrement(); 
  38.     //_currentDir = new DirObj("");
  39. //    _headerRegistry = new Registry(&s_HeaderSchemaInit);
  40.     _headerRegistry = new Registry(&HeaderSchemaInit);
  41.     _headerInstances = new InstMgr;
  42.     if (filename) ReadExchangeFile(filename);
  43. }
  44.  
  45. STEPfile::~STEPfile() 
  46. {
  47.     delete _currentDir;
  48.  
  49. //  remove everything from the Registry before deleting it
  50.     _headerRegistry -> DeleteContents ();
  51.     delete _headerRegistry;
  52.  
  53. //DAS    delete _headerRegistryOld;
  54.     _headerInstances -> ClearInstances ();
  55.     delete _headerInstances;
  56. }
  57.  
  58. int
  59. STEPfile::SetFileType(FileTypeCode ft) 
  60. {
  61.     FileType (ft);
  62.  
  63.     switch (_fileType) 
  64.       {
  65.     case (VERSION_OLD):
  66.       ENTITY_NAME_DELIM = '@';
  67.       FILE_DELIM = "STEP;";
  68.       END_FILE_DELIM = "ENDSTEP;";
  69. /*DAS
  70.       if (!_headerRegistryOld) 
  71.           _headerRegistryOld = 
  72.             new Registry(& s_Header_Section_Schema_N279Init);
  73. */
  74.  
  75.       break;
  76.     case (VERSION_UNKNOWN):
  77.     case (VERSION_CURRENT):
  78.       ENTITY_NAME_DELIM = '#';
  79.       FILE_DELIM = "ISO-10303-21;";
  80.       END_FILE_DELIM = "END-ISO-10303-21;";
  81.       break;
  82.     case (WORKING_SESSION):
  83.       ENTITY_NAME_DELIM = '#';
  84.       FILE_DELIM = "STEP_WORKING_SESSION;";
  85.       END_FILE_DELIM = "END-STEP_WORKING_SESSION;";
  86.       break;
  87.  
  88.     default:
  89.       // some kind of error
  90.       cerr << "Internal error:  " << __FILE__ <<  __LINE__ 
  91.            << "\n" << _POC_ "\n";
  92.       return 0;
  93.       }
  94.     return 1;
  95. }
  96.  
  97.  
  98. /******************************************************/
  99. const char*
  100. STEPfile::TruncFileName(const char* filename) const
  101. {
  102.     char* tmp = strrchr(filename,'/');
  103.     if (tmp) return tmp++;
  104.     else return filename;
  105.     
  106. }
  107.  
  108.  
  109. /******************************************************/
  110. Severity
  111. STEPfile::ReadExchangeFile(const char* filename)
  112. {
  113.     _error.ClearErrorMsg();
  114.     _errorCount = 0;
  115.     istream* in = OpenInputFile(filename);
  116.     if (_error.severity() < SEVERITY_WARNING) 
  117.       {      
  118.     CloseInputFile(in);
  119.     return _error.severity();  
  120.       }
  121.     
  122.     instances ().ClearInstances ();
  123.     if (_headerInstances)
  124.     _headerInstances->ClearInstances ();
  125.     _headerId = 5;
  126.     Severity rval = AppendFile (in);
  127.     CloseInputFile(in);
  128.     return rval;
  129. }
  130.  
  131. Severity 
  132. STEPfile::AppendExchangeFile (const char* filename)
  133. {
  134.     _error.ClearErrorMsg();
  135.     _errorCount = 0;
  136.     istream* in = OpenInputFile(filename);
  137.     if (_error.severity() < SEVERITY_WARNING) 
  138.       {          
  139.     CloseInputFile(in);
  140.     return _error.severity();  
  141.       }
  142.     Severity rval = AppendFile (in);
  143.     CloseInputFile(in);
  144.     return rval;
  145. }
  146.  
  147. /******************************************************/
  148. Severity
  149. STEPfile::ReadWorkingFile(const char* filename) 
  150. {
  151.     _error.ClearErrorMsg();
  152.     _errorCount = 0;
  153.     istream* in = OpenInputFile(filename);
  154.     if (_error.severity() < SEVERITY_WARNING) 
  155.       {      
  156.     CloseInputFile(in);
  157.     return _error.severity();  
  158.       }
  159.  
  160.     instances ().ClearInstances();
  161.     _headerInstances->ClearInstances ();
  162.     SetFileType(WORKING_SESSION);
  163.  
  164.     Severity rval = AppendFile (in);
  165.     SetFileType();
  166.     CloseInputFile(in);
  167.     return rval;
  168. }
  169.  
  170.  
  171. Severity
  172. STEPfile::AppendWorkingFile(const char* filename)
  173. {
  174.     _error.ClearErrorMsg();
  175.     _errorCount = 0;
  176.     istream* in = OpenInputFile(filename);
  177.     if (_error.severity() < SEVERITY_WARNING) 
  178.       {          
  179.     CloseInputFile(in);
  180.     return _error.severity();  
  181.       }
  182.     SetFileType(WORKING_SESSION);
  183.     Severity rval = AppendFile (in);
  184.     SetFileType();
  185.     CloseInputFile(in);
  186.     return rval;
  187. }
  188.  
  189.  
  190.  
  191. /******************************************************/
  192. istream*
  193. STEPfile::OpenInputFile (const char* filename)
  194. {
  195.     //  if there's no filename to use, fail
  196.     if (! (strcmp (filename, "") || strcmp (FileName (), "")) ) 
  197.       {
  198.       _error.AppendToUserMsg("Unable to open file for input. No current file name.\n");
  199.       _error.GreaterSeverity(SEVERITY_INPUT_ERROR);
  200.       return (0);
  201.       }        
  202.     else  {
  203.     if (!SetFileName (filename)) 
  204.       {
  205.           char msg[BUFSIZ];
  206.           sprintf(msg,"Unable to find file for input: \'%s\'. File not read.\n",filename);
  207.           _error.AppendToUserMsg(msg);
  208.           _error.GreaterSeverity(SEVERITY_INPUT_ERROR);
  209.           return (0);
  210.       }
  211.     }
  212.     //  istream* in = new istream(FileName(), io_readonly, a_useonly);
  213.     // port 29-Mar-1994 kcm
  214.     istream* in = new ifstream(FileName());
  215.     // default for ostream is readonly and protections are set to 644 
  216. //    if ( !in || !(in -> readable ()) )
  217.     if ( !in || !(in -> good ()) )
  218.       {
  219.           char msg[BUFSIZ];
  220.           sprintf(msg,"Unable to open file for input: \'%s\'. File not read.\n",filename);
  221.           _error.AppendToUserMsg(msg);
  222.           _error.GreaterSeverity(SEVERITY_INPUT_ERROR);
  223.           return (0);
  224.       }
  225.     return in;
  226. }
  227.  
  228. /******************************************************/
  229. void
  230. STEPfile::CloseInputFile(istream* in)
  231. {
  232.     delete in;
  233. }
  234.  
  235.     
  236. /******************************************************/
  237. void
  238. STEPfile::ReadWhiteSpace (istream& in)
  239. {
  240.  
  241.   char c = ' ';
  242.   while ((c == ' ') || (c == '\n') || (c == '\t'))  {
  243.     in >> c; 
  244.   }
  245.   in.putback (c);
  246. }
  247.  
  248. /***************************
  249. ***************************/
  250. ofstream*
  251. STEPfile::OpenOutputFile(const char* filename)
  252. {
  253.     if (!filename) 
  254.       {
  255.       if (!FileName())
  256.         { 
  257.         _error.AppendToUserMsg("No current file name.\n");
  258.         _error.GreaterSeverity(SEVERITY_INPUT_ERROR);
  259.         }
  260.       }
  261.     else 
  262.       {
  263.       if (!SetFileName (filename)) 
  264.         {
  265.         char msg[BUFSIZ];
  266.         sprintf(msg,"can't find file: %s\nFile not written.\n",filename);
  267.         _error.AppendToUserMsg(msg);
  268.         _error.GreaterSeverity(SEVERITY_INPUT_ERROR);
  269.         }          
  270.       }
  271.  
  272.    // if (TruncFileName(FileName())))
  273. //    MakeBackupFile();
  274. //    ostream* out  = new ostream(FileName(), io_writeonly, a_create);  
  275.     // - port 29-Mar-1994 kcm
  276.     ofstream* out  = new ofstream(FileName());  
  277.     // default for ostream is writeonly and protections are set to 644 
  278.     if (!out) 
  279.       {
  280.       _error.AppendToUserMsg("unable to open file for output\n");
  281.       _error.GreaterSeverity(SEVERITY_INPUT_ERROR);
  282.       }
  283.     return out;
  284. }
  285.  
  286. void
  287. STEPfile::CloseOutputFile(ostream* out) 
  288. {
  289.     delete out;
  290. }
  291.  
  292.  
  293.  
  294. /******************************************************/
  295. int 
  296. STEPfile::IncrementFileId (int fileid) 
  297.     return (fileid + FileIdIncr()); 
  298. }
  299.  
  300.  
  301. void 
  302. STEPfile::SetFileIdIncrement()
  303. {
  304.     if (instances ().MaxFileId() < 0) _fileIdIncr = 0;
  305.     else _fileIdIncr = (int)((((instances().MaxFileId() + 99)/1000) + 1) * 1000);
  306. }
  307.