360 lines
		
	
	
		
			9.0 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			360 lines
		
	
	
		
			9.0 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
//
 | 
						|
// DECOMPRS.CPP
 | 
						|
//
 | 
						|
//  Source file for ArchiveLib 2.0
 | 
						|
//
 | 
						|
//  Copyright (c) Greenleaf Software, Inc. 1994-1996
 | 
						|
//  All Rights Reserved
 | 
						|
//
 | 
						|
// CONTENTS
 | 
						|
//
 | 
						|
//  ALDecompressor::operator new()
 | 
						|
//  ALDecompressor::ALDecompressor()
 | 
						|
//  ALDecompressor::~ALDecompressor()
 | 
						|
//  deleteALDecompressor()
 | 
						|
//  ALDecompress()
 | 
						|
//
 | 
						|
// DESCRIPTION
 | 
						|
//
 | 
						|
//  This file contains functions from the base class of ALDecompressor.
 | 
						|
//
 | 
						|
// REVISION HISTORY
 | 
						|
//
 | 
						|
//   February 14, 1996  2.0A : New release
 | 
						|
//
 | 
						|
 | 
						|
#include "arclib.h"
 | 
						|
#if !defined( AL_IBM )
 | 
						|
#pragma hdrstop
 | 
						|
#endif
 | 
						|
 | 
						|
//
 | 
						|
// NAME
 | 
						|
//
 | 
						|
//  ALDecompressor::operator new()
 | 
						|
//
 | 
						|
// PLATFORMS/ENVIRONMENTS
 | 
						|
//
 | 
						|
//  Windows
 | 
						|
//  C++
 | 
						|
//
 | 
						|
// SHORT DESCRIPTION
 | 
						|
//
 | 
						|
//  Memory allocation operator needed with DLL.
 | 
						|
//
 | 
						|
// C++ SYNOPSIS
 | 
						|
//
 | 
						|
//  #include "arclib.h"
 | 
						|
//
 | 
						|
//  void * ALDecompressor::operator new( size_t size )
 | 
						|
//
 | 
						|
// C SYNOPSIS
 | 
						|
//
 | 
						|
//  None.
 | 
						|
//
 | 
						|
// VB SYNOPSIS
 | 
						|
//
 | 
						|
//  None.
 | 
						|
//
 | 
						|
// DELPHI SYNOPSIS
 | 
						|
//
 | 
						|
//  None.
 | 
						|
//
 | 
						|
// ARGUMENTS
 | 
						|
//
 | 
						|
//  size  :  The number of bytes needed to create a new ALDecompressor object.
 | 
						|
//
 | 
						|
// DESCRIPTION
 | 
						|
//
 | 
						|
//  When using a DLL, it is easy to create 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.
 | 
						|
//
 | 
						|
// RETURNS
 | 
						|
//
 | 
						|
//  A pointer to the newly allocated storage area, or 0 if no storage
 | 
						|
//  was available.
 | 
						|
//
 | 
						|
// EXAMPLE
 | 
						|
//
 | 
						|
//  None.
 | 
						|
//
 | 
						|
// SEE ALSO
 | 
						|
//
 | 
						|
// REVISION HISTORY
 | 
						|
//
 | 
						|
//   May 23, 1994  1.0A  : First release
 | 
						|
//
 | 
						|
//   February 14, 1996  2.0A : New release
 | 
						|
//
 | 
						|
 | 
						|
#if defined( AL_BUILDING_DLL )
 | 
						|
 | 
						|
void AL_DLL_FAR * AL_PROTO
 | 
						|
ALDecompressor::operator new( size_t size )  /* Tag internal function */
 | 
						|
{
 | 
						|
    return ::new char[ size ];
 | 
						|
}
 | 
						|
 | 
						|
#endif
 | 
						|
 | 
						|
//
 | 
						|
// NAME
 | 
						|
//
 | 
						|
//  ALDeompressor::ALDecompressor()
 | 
						|
//
 | 
						|
// PLATFORMS/ENVIRONMENTS
 | 
						|
//
 | 
						|
//  Console  Windows  PM
 | 
						|
//  C++
 | 
						|
//
 | 
						|
// SHORT DESCRIPTION
 | 
						|
//
 | 
						|
//  Construct a decompressor object.
 | 
						|
//
 | 
						|
// C++ SYNOPSIS
 | 
						|
//
 | 
						|
//  #include "arclib.h"
 | 
						|
//
 | 
						|
//  ALDecompressor::ALDecompressor( 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
 | 
						|
//
 | 
						|
//  This is the base class constructor for Decompressor objects.  Since this
 | 
						|
//  class has a pure virtual function, you aren't going to be able to
 | 
						|
//  call this guy directly.  Instead, it is called from the constructor
 | 
						|
//  for guys such as ALGlDecompressor and ALPkDecompressor.
 | 
						|
//
 | 
						|
// RETURNS
 | 
						|
//
 | 
						|
//  Nothing.
 | 
						|
//
 | 
						|
// EXAMPLE
 | 
						|
//
 | 
						|
// SEE ALSO
 | 
						|
//
 | 
						|
// REVISION HISTORY
 | 
						|
//
 | 
						|
//   November 13, 1995  2.00A : First release.
 | 
						|
//
 | 
						|
//   February 14, 1996  2.0A : New release
 | 
						|
 | 
						|
 | 
						|
AL_PROTO
 | 
						|
ALDecompressor::ALDecompressor( ALCompressionType compression_type_int,  /* Tag public function */
 | 
						|
                                const char AL_DLL_FAR *compression_type_string )
 | 
						|
  : ALEngine( compression_type_int, compression_type_string )
 | 
						|
{
 | 
						|
}
 | 
						|
 | 
						|
//
 | 
						|
// NAME
 | 
						|
//
 | 
						|
//  ALDecompressor::~ALDecompressor()
 | 
						|
//
 | 
						|
// PLATFORMS/ENVIRONMENTS
 | 
						|
//
 | 
						|
//  Console  Windows  PM
 | 
						|
//  C++  C  VB  Delphi
 | 
						|
//
 | 
						|
// SHORT DESCRIPTION
 | 
						|
//
 | 
						|
//  The ALDecompressor destructor.
 | 
						|
//
 | 
						|
// C++ SYNOPSIS
 | 
						|
//
 | 
						|
//  #include "arclib.h"
 | 
						|
//
 | 
						|
//  ALDecompressor::~ALDecompressor();
 | 
						|
//
 | 
						|
// C SYNOPSIS
 | 
						|
//
 | 
						|
//  void deleteALDecompressor( hALDecompressor this_object );
 | 
						|
//
 | 
						|
// VB SYNOPSIS
 | 
						|
//
 | 
						|
//  Declare Sub deleteALDecompressor Lib "AL20LW" (ByVal this_object&)
 | 
						|
//
 | 
						|
// DELPHI SYNOPSIS
 | 
						|
//
 | 
						|
//  procedure deleteALDecompressor( this_object : hALDecompressor );
 | 
						|
//
 | 
						|
// ARGUMENTS
 | 
						|
//
 | 
						|
//  None.
 | 
						|
//
 | 
						|
// DESCRIPTION
 | 
						|
//
 | 
						|
//  This destructor will be called as the derived class is destroyed, such
 | 
						|
//  as ALPkDecompressor or ALGlDecompressor.  It doesn't have to do anything,
 | 
						|
//  so conceivably this function could just be eliminated, and we could use
 | 
						|
//  the compiler-generated one.  But, I guess we just don't like to leave
 | 
						|
//  anything up to chance.
 | 
						|
//
 | 
						|
// RETURNS
 | 
						|
//
 | 
						|
//  Nothing.
 | 
						|
//
 | 
						|
// EXAMPLE
 | 
						|
//
 | 
						|
// SEE ALSO
 | 
						|
//
 | 
						|
// REVISION HISTORY
 | 
						|
//
 | 
						|
//   November 13, 1995  2.00A : First release.
 | 
						|
//
 | 
						|
//   February 14, 1996  2.0A : New release
 | 
						|
 | 
						|
AL_PROTO
 | 
						|
ALDecompressor::~ALDecompressor()  /* Tag public function */
 | 
						|
{
 | 
						|
}
 | 
						|
 | 
						|
#if !defined( AL_NO_C )
 | 
						|
 | 
						|
extern "C" AL_LINKAGE void AL_FUNCTION
 | 
						|
deleteALDecompressor( hALDecompressor this_object )  /* Tag public function */
 | 
						|
{
 | 
						|
    AL_ASSERT_OBJECT( this_object, ALDecompressor, "deleteALDecompressor()" );
 | 
						|
    delete (ALDecompressor *) this_object;
 | 
						|
}
 | 
						|
 | 
						|
#endif
 | 
						|
 | 
						|
//
 | 
						|
// NAME
 | 
						|
//
 | 
						|
//  ALDecompressor::Decompress()
 | 
						|
//
 | 
						|
// PLATFORMS/ENVIRONMENTS
 | 
						|
//
 | 
						|
//  Console  Windows  PM
 | 
						|
//  C++  C  VB  Delphi
 | 
						|
//
 | 
						|
// SHORT DESCRIPTION
 | 
						|
//
 | 
						|
//  Decompress from an input object to an output object.
 | 
						|
//
 | 
						|
// C++ SYNOPSIS
 | 
						|
//
 | 
						|
//  #include "arclib.h"
 | 
						|
//
 | 
						|
//  int ALDecompressor::Decompress( ALStorage &input_object,
 | 
						|
//                                  ALStorage &output_object );
 | 
						|
//
 | 
						|
// C SYNOPSIS
 | 
						|
//
 | 
						|
//  #include "arclib.h"
 | 
						|
//
 | 
						|
//  int ALDecompress( hALDecompressor this_object,
 | 
						|
//                    hALStorage input,
 | 
						|
//                    hALStorage output );
 | 
						|
//
 | 
						|
// VB SYNOPSIS
 | 
						|
//
 | 
						|
//  Declare Function ALDecompress Lib "AL20LW"
 | 
						|
//    (ByVal this_object&, ByVal input&, ByVal output& ) As Integer
 | 
						|
//
 | 
						|
// DELPHI SYNOPSIS
 | 
						|
//
 | 
						|
//  function ALDecompress( this_object : hALDecompressor;
 | 
						|
//                         input : hALStorage;
 | 
						|
//                         output : hALStorage ) : Integer;
 | 
						|
//
 | 
						|
// ARGUMENTS
 | 
						|
//
 | 
						|
//  this_object  :  A reference or pointer to the ALDecompressor object that
 | 
						|
//                  is going to perform the decompression.  Note that the C++
 | 
						|
//                  version of this call doesn't have an explicit argument
 | 
						|
//                  here, since it has access to 'this' implicitly.
 | 
						|
//
 | 
						|
//  input        :  A pointer or reference to the input storage object
 | 
						|
//                  that is going to be decompressed.
 | 
						|
//
 | 
						|
//  output       :  A pointer or reference to the output object that is
 | 
						|
//                  going to receive the decompressed data.
 | 
						|
//
 | 
						|
// DESCRIPTION
 | 
						|
//
 | 
						|
//  An ALDecompressor object only knows how to do one thing, and that is
 | 
						|
//  expressed by way of this function.  Decompress() takes an input file,
 | 
						|
//  and reads until it hits an EOF.  Output bytes are written to the
 | 
						|
//  output object in plaintext.  The exact format of the input is determined
 | 
						|
//  by the derived class.  ALDecompressor is an abstract base class that
 | 
						|
//  can't be instantiated by itself.
 | 
						|
//
 | 
						|
//  Since the class can't be instantiated by itself, it's kind of bogus
 | 
						|
//  to even suggest that ALDecompressor::Decompress() is a separate function,
 | 
						|
//  as I have done here.  In reality, the only thing that really exists
 | 
						|
//  here is a C function that can be used to call the virtual function
 | 
						|
//  set up by a derived class.
 | 
						|
//
 | 
						|
// RETURNS
 | 
						|
//
 | 
						|
//  A success or failure code.  Hopefully AL_SUCCESS, but values less
 | 
						|
//  than 0 are possible (as errors.)
 | 
						|
//
 | 
						|
// EXAMPLE
 | 
						|
//
 | 
						|
// SEE ALSO
 | 
						|
//
 | 
						|
// REVISION HISTORY
 | 
						|
//
 | 
						|
//   November 13, 1995  2.00A : First release.
 | 
						|
//
 | 
						|
//   February 14, 1996  2.0A : New release
 | 
						|
 | 
						|
#if !defined( AL_NO_C )
 | 
						|
extern "C" AL_LINKAGE int AL_FUNCTION
 | 
						|
ALDecompress( hALDecompressor this_object, /* Tag public function */
 | 
						|
              hALStorage input,
 | 
						|
              hALStorage output,
 | 
						|
              long compressed_length )
 | 
						|
{
 | 
						|
    AL_ASSERT_OBJECT( this_object, ALDecompressor, "ALDecompress" );
 | 
						|
    AL_ASSERT_OBJECT( input, ALStorage, "ALDecompress" );
 | 
						|
    AL_ASSERT_OBJECT( output, ALStorage, "ALDecompress" );
 | 
						|
    return ( (ALDecompressor *) this_object )->Decompress( *(ALStorage *) input, *(ALStorage *) output, compressed_length );
 | 
						|
}
 | 
						|
#endif
 | 
						|
 |