📄 fileform.cpp
字号:
#include <fstream.h>
#include "fileform.h"
// file format registration
int mgcFileFormat::maxregistered = 32;
int mgcFileFormat::registered = 0;
mgcFileFormat::RegisteredFileFormat* mgcFileFormat::fileformat;
int mgcFileFormat::not_openable = -2;
int mgcFileFormat::not_recognized = -1;
int mgcFileFormat::default_format = 0;
// error handling
int mgcFileFormat::verbose = 0;
unsigned mgcFileFormat::error = 0;
const unsigned mgcFileFormat::allocation_failed = 0x00000001;
const unsigned mgcFileFormat::exceeded_maximum = 0x00000002;
const char* mgcFileFormat::message[2] = {
"failed to allocate memory",
"exceeded maximum file formats (contact eberly@cs.unc.edu)"
};
//===========================================================================
int mgcFileFormat::
CreateDataBase ()
{
static int first_time = 1;
if ( first_time == 0 )
return first_time;
first_time = 0;
fileformat = new RegisteredFileFormat[maxregistered];
if ( !fileformat ) {
Report(allocation_failed);
return first_time;
}
default_format = 0; // first registered file format
return first_time;
}
//---------------------------------------------------------------------------
void mgcFileFormat::
DestroyDataBase ()
{
// Borland CodeGuard claims that fileformat has not been deleted
// on clean-up. Probably this routine never gets called.
delete[] fileformat;
maxregistered = 0;
registered = 0;
}
//---------------------------------------------------------------------------
int mgcFileFormat::
AddFileFormat (FFquery query, FFgethead gethead, FFputhead puthead,
FFdata getdata, FFdata putdata, FFmessage getmessage,
FFmessage putmessage)
{
if ( registered == maxregistered ) { // reallocate needs to be done
Report(exceeded_maximum);
return -1;
}
int newid = registered++;
fileformat[newid].id = newid;
fileformat[newid].query = query;
fileformat[newid].gethead = gethead;
fileformat[newid].puthead = puthead;
fileformat[newid].getdata = getdata;
fileformat[newid].putdata = putdata;
fileformat[newid].getmessage = getmessage;
fileformat[newid].putmessage = putmessage;
return newid;
}
//---------------------------------------------------------------------------
int mgcFileFormat::
Query (char* name)
{
for (int i = 0; i < registered; i++) {
int result = fileformat[i].query(name);
if ( result == -1 ) // file cannot be opened
return not_openable;
if ( result == 0 ) // file not recognized by this format
continue;
if ( result == +1 ) // file recognized by this format
return fileformat[i].id;
}
return not_recognized;
}
//---------------------------------------------------------------------------
int mgcFileFormat::
Number (unsigned single_error)
{
int result;
for (result = -1; single_error; single_error >>= 1)
result++;
return result;
}
//---------------------------------------------------------------------------
void mgcFileFormat::
Report (unsigned single_error)
{
if ( verbose )
cout << "mgcFileFormat: " << message[Number(single_error)] << endl;
else
ofstream("fileform.err",ios::out|ios::app)
<< "mgcFileFormat: " << message[Number(single_error)] << endl;
error |= single_error;
}
//---------------------------------------------------------------------------
void mgcFileFormat::
Report (ostream& ostr)
{
for (unsigned single_error = 1; single_error; single_error <<= 1)
if ( error & single_error )
ostr << "mgcFileFormat: " << message[Number(single_error)]
<< endl;
error = 0;
}
//===========================================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -