⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fileform.cpp

📁 3D Game Engine Design Source Code非常棒
💻 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 + -