315 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			315 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
//
 | 
						|
// _OPENF.CPP
 | 
						|
//
 | 
						|
//  Source file for ArchiveLib 1.0
 | 
						|
//
 | 
						|
//  Copyright (c) Greenleaf Software, Inc. 1994
 | 
						|
//  All Rights Reserved
 | 
						|
//
 | 
						|
// CONTENTS
 | 
						|
//
 | 
						|
//  ALOpenInputFile::operator new()
 | 
						|
//  ALOpenOutputFile::operator new()
 | 
						|
//  ALOpenFiles::operator new()
 | 
						|
//  ALOpenInputFile::ALOpenInputFile()
 | 
						|
//  ALOpenInputFile::~ALOpenInputFile()
 | 
						|
//  ALOpenOutputFile::ALOpenOutputFile()
 | 
						|
//  ALOpenOutputFile::~ALOpenOutputFile()
 | 
						|
//  ALOpenFiles::ALOpenFiles()
 | 
						|
//  ALOpenFiles::~ALOpenFiles()
 | 
						|
//
 | 
						|
// DESCRIPTION
 | 
						|
//
 | 
						|
//  The ALOpenInputFile, ALOpenOutputFile, and ALOpenFiles objects
 | 
						|
//  are all just simple little devices I use in functions to open files,
 | 
						|
//  then automatically close them when the function exits.  Even better,
 | 
						|
//  if the storage object was already open when we enter the function, 
 | 
						|
//  when we exit, we leave it open!  
 | 
						|
//
 | 
						|
// REVISION HISTORY
 | 
						|
//
 | 
						|
//  May 22, 1994  1.0A  : First release
 | 
						|
//
 | 
						|
//
 | 
						|
 | 
						|
#include "arclib.h"
 | 
						|
#pragma hdrstop
 | 
						|
 | 
						|
#include "_openf.h"
 | 
						|
 | 
						|
//
 | 
						|
// void * ALOpenInputFile::operator new( size_t size )
 | 
						|
//
 | 
						|
// ARGUMENTS:
 | 
						|
//
 | 
						|
//  size  : The size of the object being created.
 | 
						|
//
 | 
						|
// RETURNS
 | 
						|
//
 | 
						|
//  A pointer to the storage allocated for the object.
 | 
						|
//
 | 
						|
// DESCRIPTION
 | 
						|
//
 | 
						|
//  When we construct an object when using the DLL, trouble can arise.
 | 
						|
//  The main bad thing is that when we call the constructor from an
 | 
						|
//  EXE, we allocate the storage for the new object from inside our EXE.
 | 
						|
//  When we destroy the same object, the destructor frees up the memory
 | 
						|
//  inside the DLL.  This is bad, because you can mangle the heap inside 
 | 
						|
//  the DLL by trying to free an object that doesn't belong to it.
 | 
						|
//
 | 
						|
//  The fix to this conundrum is to allocate the object inside the DLL,
 | 
						|
//  and we can make this happen by overloading the new operator.  We don't
 | 
						|
//  bother unless it's a DLL deal.
 | 
						|
//
 | 
						|
//  This lecture will be repeated at times throughout the source in this
 | 
						|
//  project.
 | 
						|
//
 | 
						|
// REVISION HISTORY
 | 
						|
//
 | 
						|
//   May 22, 1994  1.0A  : First release
 | 
						|
//
 | 
						|
 | 
						|
#if defined( AL_BUILDING_DLL )
 | 
						|
void AL_DLL_FAR * AL_PROTO ALOpenInputFile::operator new( size_t size )
 | 
						|
{
 | 
						|
    return ::new char[ size ];
 | 
						|
}
 | 
						|
#endif
 | 
						|
 | 
						|
//
 | 
						|
// void * ALOpenOutputFile::operator new( size_t size )
 | 
						|
//
 | 
						|
// ARGUMENTS:
 | 
						|
//
 | 
						|
//  size  : The size of the object being created.
 | 
						|
//
 | 
						|
// RETURNS
 | 
						|
//
 | 
						|
//  A pointer to the storage allocated for the object.
 | 
						|
//
 | 
						|
// DESCRIPTION
 | 
						|
//
 | 
						|
//  See the function directly above.
 | 
						|
//
 | 
						|
// REVISION HISTORY
 | 
						|
//
 | 
						|
//   May 22, 1994  1.0A  : First release
 | 
						|
//
 | 
						|
 | 
						|
#if defined( AL_BUILDING_DLL )
 | 
						|
void AL_DLL_FAR * AL_PROTO ALOpenOutputFile::operator new( size_t size )
 | 
						|
{
 | 
						|
    return ::new char[ size ];
 | 
						|
}
 | 
						|
#endif
 | 
						|
 | 
						|
//
 | 
						|
// void * ALOpenFiles::operator new( size_t size )
 | 
						|
//
 | 
						|
// ARGUMENTS:
 | 
						|
//
 | 
						|
//  size  : The size of the object being created.
 | 
						|
//
 | 
						|
// RETURNS
 | 
						|
//
 | 
						|
//  A pointer to the storage allocated for the object.
 | 
						|
//
 | 
						|
// DESCRIPTION
 | 
						|
//
 | 
						|
//  See the function directly above.
 | 
						|
//
 | 
						|
// REVISION HISTORY
 | 
						|
//
 | 
						|
//   May 22, 1994  1.0A  : First release
 | 
						|
//
 | 
						|
 | 
						|
#if defined( AL_BUILDING_DLL )
 | 
						|
void AL_DLL_FAR * AL_PROTO ALOpenFiles::operator new( size_t size )
 | 
						|
{
 | 
						|
    return ::new char[ size ];
 | 
						|
}
 | 
						|
#endif
 | 
						|
 | 
						|
 | 
						|
//
 | 
						|
// ALOpenInputFile::ALOpenInputFile( ALStorage &file )
 | 
						|
//
 | 
						|
// ARGUMENTS:
 | 
						|
//
 | 
						|
//  file  : The storage object that has to opened.
 | 
						|
//
 | 
						|
// RETURNS
 | 
						|
//
 | 
						|
//  Nothing, this is a constructor.
 | 
						|
//
 | 
						|
// DESCRIPTION
 | 
						|
//
 | 
						|
//  You can stick this constructor at the start of a function, and it
 | 
						|
//  opens up an ALStorage object for you.  You can then take it for
 | 
						|
//  granted that it is open.  You can also take it for granted that
 | 
						|
//  the storage object will be closed by the destructor when the
 | 
						|
//  function exits.  All of this saves a lot of repetitive code.
 | 
						|
//
 | 
						|
// REVISION HISTORY
 | 
						|
//
 | 
						|
//   May 22, 1994  1.0A  : First release
 | 
						|
//
 | 
						|
 | 
						|
AL_PROTO ALOpenInputFile::ALOpenInputFile( ALStorage AL_DLL_FAR &file )
 | 
						|
{
 | 
						|
    mpFile = &file;
 | 
						|
    miFileWasOpen = file.IsOpen();
 | 
						|
    if ( !miFileWasOpen )
 | 
						|
        file.Open();
 | 
						|
}
 | 
						|
 | 
						|
//
 | 
						|
// ALOpenInputFile::~ALOpenInputFile()
 | 
						|
//
 | 
						|
// ARGUMENTS:
 | 
						|
//
 | 
						|
//  None.
 | 
						|
//
 | 
						|
// RETURNS
 | 
						|
//
 | 
						|
//  None, it is a destructor.
 | 
						|
//
 | 
						|
// DESCRIPTION
 | 
						|
//
 | 
						|
//  At the end of the function, it is time to close the storage object.
 | 
						|
//  But only if it wasn't open when the constructor was called.
 | 
						|
//
 | 
						|
// REVISION HISTORY
 | 
						|
//
 | 
						|
//   May 22, 1994  1.0A  : First release
 | 
						|
//
 | 
						|
 | 
						|
AL_PROTO ALOpenInputFile::~ALOpenInputFile()
 | 
						|
{
 | 
						|
    if ( !miFileWasOpen )
 | 
						|
        mpFile->Close();
 | 
						|
}
 | 
						|
 | 
						|
//
 | 
						|
// ALOpenOutputFile::ALOpenOutputFile( ALStorage &file )
 | 
						|
//
 | 
						|
// ARGUMENTS:
 | 
						|
//
 | 
						|
//  file :  The ALStorage object that needs to be created.
 | 
						|
//
 | 
						|
// RETURNS
 | 
						|
//
 | 
						|
//  Nothing, it is a constructor.
 | 
						|
//
 | 
						|
// DESCRIPTION
 | 
						|
//
 | 
						|
//  This is just like ALOpenInputFile, except instead of calling 
 | 
						|
//  ALStorage::Open(), it calls ALStorage::Create().  Note that if
 | 
						|
//  the file is already open, we keep track of the fact and leave it
 | 
						|
//  alone.
 | 
						|
//
 | 
						|
// REVISION HISTORY
 | 
						|
//
 | 
						|
//   May 22, 1994  1.0A  : First release
 | 
						|
//
 | 
						|
 | 
						|
AL_PROTO ALOpenOutputFile::ALOpenOutputFile( ALStorage AL_DLL_FAR &file )
 | 
						|
{
 | 
						|
    mpFile = &file;
 | 
						|
    miFileWasOpen = file.IsOpen();
 | 
						|
    if ( !miFileWasOpen )
 | 
						|
        file.Create();
 | 
						|
}
 | 
						|
 | 
						|
//
 | 
						|
// ALOpenOutputFile::~ALOpenOutputFile()
 | 
						|
//
 | 
						|
// ARGUMENTS:
 | 
						|
//
 | 
						|
//  None.
 | 
						|
//
 | 
						|
// RETURNS
 | 
						|
//
 | 
						|
//  Nothing.
 | 
						|
//
 | 
						|
// DESCRIPTION
 | 
						|
//
 | 
						|
//  If the file was closed when the constructor was called, we close
 | 
						|
//  it in the constructor.  
 | 
						|
//
 | 
						|
// REVISION HISTORY
 | 
						|
//
 | 
						|
//   May 22, 1994  1.0A  : First release
 | 
						|
//
 | 
						|
 | 
						|
AL_PROTO ALOpenOutputFile::~ALOpenOutputFile()
 | 
						|
{
 | 
						|
    if ( !miFileWasOpen )
 | 
						|
        mpFile->Close();
 | 
						|
}
 | 
						|
 | 
						|
//
 | 
						|
// ALOpenFiles::ALOpenFiles( ALStorage &input,
 | 
						|
//                           ALStorage &output )
 | 
						|
//
 | 
						|
// ARGUMENTS:
 | 
						|
//
 | 
						|
//  input  :  The storage object that needs to be opened, maybe.
 | 
						|
//
 | 
						|
//  output :  The storage object that needs to be created, maybe.
 | 
						|
//
 | 
						|
// RETURNS
 | 
						|
//
 | 
						|
//  Nothing.
 | 
						|
//
 | 
						|
// DESCRIPTION
 | 
						|
//
 | 
						|
//  This is just a combination of the ALOpenOutputFile() and 
 | 
						|
//  ALOpenInputFile() guys rolled into one.  To combine them, we
 | 
						|
//  just create this object that contains one of both objects.
 | 
						|
//
 | 
						|
//  So this guy takes care of opening an input file and an output
 | 
						|
//  file right there at the same time.  The most exciting part of it
 | 
						|
//  is that they both get closed up in the destructor.
 | 
						|
//
 | 
						|
//  So all the constructor has to do here is call the other two
 | 
						|
//  constructors in an initializer list.
 | 
						|
// 
 | 
						|
// REVISION HISTORY
 | 
						|
//
 | 
						|
//   May 22, 1994  1.0A  : First release
 | 
						|
//
 | 
						|
 | 
						|
AL_PROTO ALOpenFiles::ALOpenFiles( ALStorage AL_DLL_FAR &input,
 | 
						|
                                   ALStorage AL_DLL_FAR &output )
 | 
						|
    : mInputFile( input ), mOutputFile( output )
 | 
						|
{
 | 
						|
}
 | 
						|
 | 
						|
//
 | 
						|
// ALOpenFiles::~ALOpenFiles()
 | 
						|
//
 | 
						|
// ARGUMENTS:
 | 
						|
//
 | 
						|
//  None.
 | 
						|
//
 | 
						|
// RETURNS
 | 
						|
//
 | 
						|
//  Nothing.
 | 
						|
//
 | 
						|
// DESCRIPTION
 | 
						|
//
 | 
						|
//  This guy closes the two files, if they were closed when the constructor
 | 
						|
//  was called.  We don't have to do anything explicitly, because the
 | 
						|
//  two data members of this object do so in their destructors.
 | 
						|
//
 | 
						|
// REVISION HISTORY
 | 
						|
//
 | 
						|
//   May 22, 1994  1.0A  : First release
 | 
						|
//
 | 
						|
 | 
						|
AL_PROTO ALOpenFiles::~ALOpenFiles()
 | 
						|
{
 | 
						|
}
 | 
						|
 |