392 lines
		
	
	
		
			8.8 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			392 lines
		
	
	
		
			8.8 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
| //
 | |
| // ENGN.CPP
 | |
| //
 | |
| //  Source file for ArchiveLib 2.0
 | |
| //
 | |
| //  Copyright (c) Greenleaf Software, Inc. 1994-1996
 | |
| //  All Rights Reserved
 | |
| //
 | |
| // CONTENTS
 | |
| //
 | |
| //  ALEngine::operator new()
 | |
| //  ALEngine::ALEngine()
 | |
| //  ALEngine::WriteEngineData()
 | |
| //  ALEngine::ReadEngineData()
 | |
| //  ALEngine::~ALEngine()
 | |
| //
 | |
| // DESCRIPTION
 | |
| //
 | |
| //  This file contains functions from the base class of ALEngine.
 | |
| //
 | |
| // REVISION HISTORY
 | |
| //
 | |
| //   February 14, 1996  2.0A : New release
 | |
| //
 | |
| 
 | |
| #include "arclib.h"
 | |
| #if !defined( AL_IBM )
 | |
| #pragma hdrstop
 | |
| #endif
 | |
| 
 | |
| //
 | |
| // NAME
 | |
| //
 | |
| //  ALEngine::operator new()
 | |
| //
 | |
| // PLATFORMS/ENVIRONMENTS
 | |
| //
 | |
| //  Console  Windows  PM
 | |
| //  C++
 | |
| //
 | |
| // SHORT DESCRIPTION
 | |
| //
 | |
| //  Memory allocator used when ArchiveLib resides in a 16 bit DLL.
 | |
| //
 | |
| // C++ SYNOPSIS
 | |
| //
 | |
| //  #include "arclib.h"
 | |
| //
 | |
| //  void * ALEngine::operator new( size_t size )
 | |
| //
 | |
| // C SYNOPSIS
 | |
| //
 | |
| //  None.
 | |
| //
 | |
| // VB SYNOPSIS
 | |
| //
 | |
| //  None.
 | |
| //
 | |
| // DELPHI SYNOPSIS
 | |
| //
 | |
| //  None.
 | |
| //
 | |
| // ARGUMENTS
 | |
| //
 | |
| //  size  :  The number of bytes that the compiler has decided will be
 | |
| //           necessary to construct a new ALEngine object.
 | |
| //
 | |
| // DESCRIPTION
 | |
| //
 | |
| //  When using a DLL, it is easy to get into a dangerous situation when
 | |
| //  creating objects whose ctor and dtor are both in the DLL.  The problem
 | |
| //  arises because when you create an object using new, the memory for
 | |
| //  the object will be allocated from the EXE.  However, when you destroy
 | |
| //  the object using delete, the memory is freed inside the DLL.  Since
 | |
| //  the DLL doesn't really own that memory, bad things can happen.
 | |
| //
 | |
| //  But, you say, won't the space just go back to the Windows heap regardless
 | |
| //  of who tries to free it?  Maybe, but maybe not.  If the DLL is using
 | |
| //  a subsegment allocation scheme, it might do some sort of local free
 | |
| //  before returning the space to the windows heap.  That is the point where
 | |
| //  you could conceivably cook your heap.
 | |
| //
 | |
| //  By providing our own version of operator new inside this class, we
 | |
| //  ensure that all memory allocation for the class will be done from
 | |
| //  inside the DLL, not the EXE calling the DLL.
 | |
| //
 | |
| //  Incidentally, I suspect that this function never gets called.  If an
 | |
| //  object of a derived archive class is being created, it should use
 | |
| //  its own new operator, rendering this one useless.
 | |
| //
 | |
| // RETURNS
 | |
| //
 | |
| //  A pointer to some memory that should have been pulled out of the
 | |
| //  heap for the DLL.
 | |
| //
 | |
| // EXAMPLE
 | |
| //
 | |
| // SEE ALSO
 | |
| //
 | |
| // REVISION HISTORY
 | |
| //
 | |
| //   February 14, 1996  2.0A : New release
 | |
| 
 | |
| #if defined( AL_BUILDING_DLL )
 | |
| void AL_DLL_FAR * AL_PROTO
 | |
| ALEngine::operator new( size_t size )  /* Tag internal function */
 | |
| {
 | |
|     return ::new char[ size ];
 | |
| }
 | |
| #endif
 | |
| 
 | |
| //
 | |
| // NAME
 | |
| //
 | |
| //  ALEngine::ALEngine()
 | |
| //
 | |
| // PLATFORMS/ENVIRONMENTS
 | |
| //
 | |
| //  Console  Windows  PM
 | |
| //  C++
 | |
| //
 | |
| // SHORT DESCRIPTION
 | |
| //
 | |
| //  Constructor for the base class ALEngine
 | |
| //
 | |
| // C++ SYNOPSIS
 | |
| //
 | |
| //  #include "arclib.h"
 | |
| //
 | |
| //  ALEngine::ALEngine( ALCompressionType compression_type_int,
 | |
| //                      const char *compression_type_string );
 | |
| //
 | |
| // C SYNOPSIS
 | |
| //
 | |
| //  None.
 | |
| //
 | |
| // VB SYNOPSIS
 | |
| //
 | |
| //  None.
 | |
| //
 | |
| // DELPHI SYNOPSIS
 | |
| //
 | |
| //  None.
 | |
| //
 | |
| // ARGUMENTS
 | |
| //
 | |
| //  compression_type_int    :  An integer used to indicate the compression
 | |
| //                             type.  This needs to be selected from the
 | |
| //                             enumerated type defined in ALDEFS.H.  This
 | |
| //                             value is usually what gets stored in an
 | |
| //                             archive to indicate what compression type was
 | |
| //                             used.
 | |
| //
 | |
| //  compression_type_string :  A pointer to a C-style string describing the
 | |
| //                             type of compression.  This isn't used in
 | |
| //                             any algorithms, it's on hand as a U/I aid.
 | |
| //
 | |
| // DESCRIPTION
 | |
| //
 | |
| //  ALEngine is a base class that is a parent to both ALCompressor and
 | |
| //  ALDecompressor.  It is really not much of a class, and only exists for
 | |
| //  as a placeholder for a couple of data members (initialized in the ctor),
 | |
| //  and a couple of virtual functions.  Since this class has a couple of
 | |
| //  pure virtual functions, you can't invoke it directly.  It gets called
 | |
| //  as part of the construction of the derived classes.
 | |
| //
 | |
| // RETURNS
 | |
| //
 | |
| //  Nothing.
 | |
| //
 | |
| // EXAMPLE
 | |
| //
 | |
| // SEE ALSO
 | |
| //
 | |
| // REVISION HISTORY
 | |
| //
 | |
| //   February 14, 1996  2.0A : New release
 | |
| //
 | |
| 
 | |
| AL_PROTO
 | |
| ALEngine::ALEngine( ALCompressionType compression_type_int,  /* Tag public function */
 | |
|                     const char AL_DLL_FAR *compression_type_string )
 | |
|     : miCompressionType( compression_type_int ),
 | |
|       mszCompressionType( compression_type_string )
 | |
| {
 | |
| }
 | |
| 
 | |
| //
 | |
| // NAME
 | |
| //
 | |
| //  ALEngine::WriteEngineData()
 | |
| //
 | |
| // PLATFORMS/ENVIRONMENTS
 | |
| //
 | |
| //  Console  Windows  PM
 | |
| //  C++
 | |
| //
 | |
| // SHORT DESCRIPTION
 | |
| //
 | |
| //  Writes out private engine data.
 | |
| //
 | |
| // C++ SYNOPSIS
 | |
| //
 | |
| //  #include "arclib.h"
 | |
| //
 | |
| //  int ALEngine::WriteEngineData( ALStorage * archive );
 | |
| //
 | |
| // C SYNOPSIS
 | |
| //
 | |
| //  None.
 | |
| //
 | |
| // VB SYNOPSIS
 | |
| //
 | |
| //  None.
 | |
| //
 | |
| // DELPHI SYNOPSIS
 | |
| //
 | |
| //  None.
 | |
| //
 | |
| // ARGUMENTS
 | |
| //
 | |
| //  archive  :  A pointer to the storage object that is usually the target of
 | |
| //              the compression.  This doesn't have to be an archive,
 | |
| //              so maybe the parameter has a bad name.  You could just
 | |
| //              as easily be writing this out to an ALCompressedObject,
 | |
| //              or even a raw binary compressed file.
 | |
| //
 | |
| // DESCRIPTION
 | |
| //
 | |
| //  Compression engines can write private data out to the archive
 | |
| //  directory to provide customization information. For example, the
 | |
| //  Greenleaf compression engine writes its compression level
 | |
| //  using this function.  By default, there is no data, which is what
 | |
| //  this function writes out, a 0 length string.
 | |
| //
 | |
| //  Any engine that doesn't have any customized data that needs to be
 | |
| //  stored can just use the default version of this function right here.
 | |
| //
 | |
| // RETURNS
 | |
| //
 | |
| //  AL_SUCCESS, or < AL_SUCCESS if something bad happens.
 | |
| //
 | |
| // EXAMPLE
 | |
| //
 | |
| // SEE ALSO
 | |
| //
 | |
| // REVISION HISTORY
 | |
| //
 | |
| //   February 14, 1996  2.0A : New release
 | |
| //
 | |
| 
 | |
| int AL_PROTO
 | |
| ALEngine::WriteEngineData( ALStorage AL_DLL_FAR * archive )  /* Tag protected function */
 | |
| {
 | |
|     return archive->WriteGlShort( 0 );
 | |
| }
 | |
| 
 | |
| //
 | |
| // NAME
 | |
| //
 | |
| //  ALEngine::ReadEngineData()
 | |
| //
 | |
| // PLATFORMS/ENVIRONMENTS
 | |
| //
 | |
| //  Console  Windows  PM
 | |
| //  C++
 | |
| //
 | |
| // SHORT DESCRIPTION
 | |
| //
 | |
| //  Read the customized engine data from a storage object.
 | |
| //
 | |
| // C++ SYNOPSIS
 | |
| //
 | |
| //  #include "arclib.h"
 | |
| //
 | |
| //  int ALEngine::ReadEngineData( ALStorage * archive )
 | |
| //
 | |
| // C SYNOPSIS
 | |
| //
 | |
| //  None.
 | |
| //
 | |
| // VB SYNOPSIS
 | |
| //
 | |
| //  None.
 | |
| //
 | |
| // DELPHI SYNOPSIS
 | |
| //
 | |
| //  None.
 | |
| //
 | |
| // ARGUMENTS
 | |
| //
 | |
| //  archive  :  A pointer to the storage object that is usually the source of
 | |
| //              the decompression.  This doesn't have to be an archive,
 | |
| //              so maybe the parameter has a bad name.  You could just
 | |
| //              as easily be reading this in from an ALCompressedObject,
 | |
| //              or even a raw binary compressed file.
 | |
| //
 | |
| // DESCRIPTION
 | |
| //
 | |
| //  Compression engines can write private data out to the archive
 | |
| //  directory to provide customization information. For example, the
 | |
| //  Greenleaf compression engine reads its compression level
 | |
| //  using this function.  By default, no data is read  in.  This
 | |
| //  function expects to find a zero length string, and complains
 | |
| //  with a fatal error if it doesn't.
 | |
| //
 | |
| //  Any engine that doesn't have any customized data that needs to be
 | |
| //  stored can just use the default version of this function right here.
 | |
| //
 | |
| // RETURNS
 | |
| //
 | |
| //  AL_SUCCESS, or < AL_SUCCESS if something bad happened.
 | |
| //
 | |
| // EXAMPLE
 | |
| //
 | |
| // SEE ALSO
 | |
| //
 | |
| // REVISION HISTORY
 | |
| //
 | |
| //   February 14, 1996  2.0A : New release
 | |
| //
 | |
| 
 | |
| int AL_PROTO
 | |
| ALEngine::ReadEngineData( ALStorage AL_DLL_FAR * archive )  /* Tag protected function */
 | |
| {
 | |
|     short temp;
 | |
|     int status = archive->ReadGlShort( temp );
 | |
|     AL_ASSERT( temp == 0, "ReadEngineData: engine data not 0 length" );
 | |
|     return status;
 | |
| }
 | |
| 
 | |
| //
 | |
| // NAME
 | |
| //
 | |
| //  ALEngine::~ALEngine()
 | |
| //
 | |
| // PLATFORMS/ENVIRONMENTS
 | |
| //
 | |
| //  Console  Windows  PM
 | |
| //  C++
 | |
| //
 | |
| // SHORT DESCRIPTION
 | |
| //
 | |
| //  The destructor for ALEngine.
 | |
| //
 | |
| // C++ SYNOPSIS
 | |
| //
 | |
| //  #include "arclib.h"
 | |
| //
 | |
| //  ALEngine::~ALEngine()
 | |
| //
 | |
| // C SYNOPSIS
 | |
| //
 | |
| //  None.
 | |
| //
 | |
| // VB SYNOPSIS
 | |
| //
 | |
| //  None.
 | |
| //
 | |
| // DELPHI SYNOPSIS
 | |
| //
 | |
| //  None.
 | |
| //
 | |
| // ARGUMENTS
 | |
| //
 | |
| //  None.
 | |
| //
 | |
| // DESCRIPTION
 | |
| //
 | |
| //  This virtual destructor has virtually nothing to do.  At least in
 | |
| //  the debug version of the library it checks the type of this.
 | |
| //
 | |
| // RETURNS
 | |
| //
 | |
| //  Nothing.
 | |
| //
 | |
| // EXAMPLE
 | |
| //
 | |
| // SEE ALSO
 | |
| //
 | |
| // REVISION HISTORY
 | |
| //
 | |
| //   February 14, 1996  2.0A : New release
 | |
| //
 | |
| 
 | |
| AL_PROTO
 | |
| ALEngine::~ALEngine()  /* Tag public function */
 | |
| {
 | |
|     AL_ASSERT( GoodTag(), "~ALEngine: attempt to delete invalid object" );
 | |
| }
 | |
| 
 |