714dd74636
git-svn-id: svn://10.65.10.50/trunk@5350 c028cbd2-c16b-5b4b-a496-9718f37d4682
422 lines
10 KiB
C++
Executable File
422 lines
10 KiB
C++
Executable File
//
|
|
// STOR.INL
|
|
//
|
|
// Source file for ArchiveLib 2.0
|
|
// Inline function definitions
|
|
//
|
|
// Copyright (c) Greenleaf Software, Inc. 1994-1996
|
|
// All Rights Reserved
|
|
//
|
|
// CONTENTS
|
|
//
|
|
// ALStorage::GetSize()
|
|
// ALStorage::IsOpen()
|
|
// ALStorage::ClearError()
|
|
// ALStorage::ReadChar()
|
|
// ALStorage::WriteChar()
|
|
//
|
|
// DESCRIPTION
|
|
//
|
|
// Inline functions for class ALStorage.
|
|
//
|
|
// REVISION HISTORY
|
|
//
|
|
// February 14, 1996 2.0A : New release
|
|
|
|
//
|
|
// NAME
|
|
//
|
|
// ALStorage::GetSize()
|
|
//
|
|
// PLATFORMS/ENVIRONMENTS
|
|
//
|
|
// Console Windows PM
|
|
// C++ C VB Delphi
|
|
//
|
|
// SHORT DESCRIPTION
|
|
//
|
|
// Returns the size of a storage object.
|
|
//
|
|
// C++ SYNOPSIS
|
|
//
|
|
// #include "arclib.h"
|
|
//
|
|
// inline long ALStorage::GetSize() const
|
|
//
|
|
// C SYNOPSIS
|
|
//
|
|
// #include "arclib.h"
|
|
//
|
|
// long ALStorageGetSize( hALStorage this_object );
|
|
//
|
|
// VB SYNOPSIS
|
|
//
|
|
// Declare Function ALStorageGetSize Lib "AL20LW"
|
|
// (ByVal this_object&) As Long
|
|
//
|
|
// DELPHI SYNOPSIS
|
|
//
|
|
// function ALStorageGetSize( this_object : hALStorage ) : LongInt;
|
|
//
|
|
// ARGUMENTS
|
|
//
|
|
// this_object : A reference or pointer to the ALStorage object whose
|
|
// size is desired. Note that the C++
|
|
// version of this call doesn't have an explicit argument
|
|
// here, since it has access to 'this' implicitly.
|
|
//
|
|
// DESCRIPTION
|
|
//
|
|
// Once an ALStorage object has been opened and closed, you can determine
|
|
// what size it was by looking at the mlSize member. This member is
|
|
// protected so people can't jack with it.
|
|
//
|
|
// Be sure to note that just creating a storage object doesn't initialize
|
|
// the mlSize member to its correct value. You have to open the file and
|
|
// close it. If you are creating the file, you need to do all your output
|
|
// as well.
|
|
//
|
|
// There is an important exception to this, however. When you read in
|
|
// a directory from an Archive, the size (and other stats) of the stored
|
|
// files are loaded and ready for perusal.
|
|
//
|
|
// RETURNS
|
|
//
|
|
// A long integer containing the file length.
|
|
//
|
|
// EXAMPLE
|
|
//
|
|
// SEE ALSO
|
|
//
|
|
// ALStorage::GetCrc32()
|
|
//
|
|
// REVISION HISTORY
|
|
//
|
|
// February 14, 1996 2.0A : New release
|
|
//
|
|
|
|
inline long AL_INLINE_PROTO
|
|
ALStorage::GetSize() const /* Tag public function */
|
|
{
|
|
return mlSize;
|
|
}
|
|
|
|
//
|
|
// NAME
|
|
//
|
|
// ALStorage::IsOpen()
|
|
//
|
|
// PLATFORMS/ENVIRONMENTS
|
|
//
|
|
// Console Windows PM
|
|
// C++ C VB Delphi
|
|
//
|
|
// SHORT DESCRIPTION
|
|
//
|
|
// Indicates whether a storage object is open or not.
|
|
//
|
|
// C++ SYNOPSIS
|
|
//
|
|
// #include "arclib.h"
|
|
//
|
|
// inline int ALStorage::IsOpen()
|
|
//
|
|
// C SYNOPSIS
|
|
//
|
|
// #include "arclib.h"
|
|
//
|
|
// int ALStorageIsOpen( hALStorage this_object );
|
|
//
|
|
// VB SYNOPSIS
|
|
//
|
|
// Declare Function ALStorageIsOpen Lib "AL20LW"
|
|
// (ByVal this_object&) As Integer
|
|
//
|
|
// DELPHI SYNOPSIS
|
|
//
|
|
// function ALStorageIsOpen( this_object : hALStorage ) : Integer;
|
|
//
|
|
// ARGUMENTS
|
|
//
|
|
// this_object : A reference or pointer to the ALStorage object whose
|
|
// status is desired. Note that the C++ version of this
|
|
// call doesn't have an explicit argument for this_object,
|
|
// since it has access to 'this' implicitly.
|
|
//
|
|
// DESCRIPTION
|
|
//
|
|
// Sometimes you might want to know if a storage object is open. This
|
|
// function does just that. It relies on the fact that an open storage
|
|
// object has its mpcBuffer allocated to determine this status.
|
|
//
|
|
// RETURNS
|
|
//
|
|
// A boolean value telling whether the file is open.
|
|
//
|
|
// EXAMPLE
|
|
//
|
|
// SEE ALSO
|
|
//
|
|
// ALStorage::Open(), ALStorage::Close()
|
|
//
|
|
// REVISION HISTORY
|
|
//
|
|
// February 14, 1996 2.0A : New release
|
|
//
|
|
|
|
inline int AL_INLINE_PROTO
|
|
ALStorage::IsOpen() /* Tag public function */
|
|
{
|
|
return mpcBuffer != 0;
|
|
}
|
|
|
|
//
|
|
// NAME
|
|
//
|
|
// ALStorage::ClearError()
|
|
//
|
|
// PLATFORMS/ENVIRONMENTS
|
|
//
|
|
// Console Windows PM
|
|
// C++ C VB Delphi
|
|
//
|
|
// SHORT DESCRIPTION
|
|
//
|
|
// Reset the error status for a storage object.
|
|
//
|
|
// C++ SYNOPSIS
|
|
//
|
|
// #include "arclib.h"
|
|
//
|
|
// void ALStorage::ClearError()
|
|
//
|
|
// C SYNOPSIS
|
|
//
|
|
// #include <arclib.h>
|
|
//
|
|
// void ALStorageClearError( hALStorage this_object );
|
|
//
|
|
// VB SYNOPSIS
|
|
//
|
|
// Declare Sub ALStorageClearError Lib "AL20LW" (ByVal this_object& )
|
|
//
|
|
// DELPHI SYNOPSIS
|
|
//
|
|
// procedure ALStorageClearError( this_object : hALStorage );
|
|
//
|
|
// ARGUMENTS
|
|
//
|
|
// this_object : A reference or pointer to the ALStorage object that
|
|
// is going to have its status reset. Note that the C++
|
|
// version of this call doesn't have an explicit argument
|
|
// here, since it has access to 'this' implicitly.
|
|
//
|
|
// DESCRIPTION
|
|
//
|
|
// An ALStorage object carries around a status object in its mStatus
|
|
// member. For various reasons, this member might get set to an error
|
|
// condition. Error conditions aren't cleared automatically by the library,
|
|
// so the user will have to manually clear it with a call to this function.
|
|
//
|
|
// This is a real simple function, so in C++ it will be implemented as
|
|
// an inline function. The rest of the supported languages don't have
|
|
// this luxury.
|
|
//
|
|
// RETURNS
|
|
//
|
|
// Nothing.
|
|
//
|
|
// EXAMPLE
|
|
//
|
|
// SEE ALSO
|
|
//
|
|
// ALStatus::SetError()
|
|
//
|
|
// REVISION HISTORY
|
|
//
|
|
// February 14, 1996 2.0A : New release
|
|
//
|
|
|
|
inline void AL_INLINE_PROTO
|
|
ALStorage::ClearError() /* Tag public function */
|
|
{
|
|
mStatus.SetError( AL_SUCCESS, 0 );
|
|
}
|
|
|
|
//
|
|
// NAME
|
|
//
|
|
// ALStorage::ReadChar()
|
|
//
|
|
// PLATFORMS/ENVIRONMENTS
|
|
//
|
|
// Console Windows PM
|
|
// C++ C VB Delphi
|
|
//
|
|
// SHORT DESCRIPTION
|
|
//
|
|
// Read a character from a storage object.
|
|
//
|
|
// C++ SYNOPSIS
|
|
//
|
|
// #include "arclib.h"
|
|
//
|
|
// inline int ALStorage::ReadChar()
|
|
//
|
|
// C SYNOPSIS
|
|
//
|
|
// #include "arclib.h"
|
|
//
|
|
// int ALStorageReadChar( hALStorage this_object );
|
|
//
|
|
// VB SYNOPSIS
|
|
//
|
|
// Declare Function ALStorageReadChar Lib "AL20LW"
|
|
// (ByVal this_object&) As Integer
|
|
//
|
|
// DELPHI SYNOPSIS
|
|
//
|
|
// function ALStorageReadChar( this_object : hALStorage ) : Integer;
|
|
//
|
|
// ARGUMENTS
|
|
//
|
|
// this_object : A reference or pointer to the ALStorage object that
|
|
// is going to be read from. Note that the C++
|
|
// version of this call doesn't have an explicit argument
|
|
// here, since it has access to 'this' implicitly.
|
|
//
|
|
// DESCRIPTION
|
|
//
|
|
// This is an inline function that is able to quickly do buffered I/O.
|
|
// By utilizing an I/O buffer we can make this routine very fast, since
|
|
// it doesn't have to call a virtual function. The virtual function
|
|
// only has to be called when LoadBuffer() gets called.
|
|
//
|
|
// Different compilers have different abilities to make this code inline,
|
|
// so sometimes it needs to be tinkered with. If you see anything in here
|
|
// that looks funny, that probably explains why.
|
|
//
|
|
//
|
|
// It is really important to keep this routine inline!!!!
|
|
//
|
|
// RETURNS
|
|
//
|
|
// Either the next character available from the I/O buffer, or
|
|
// AL_END_OF_FILE.
|
|
//
|
|
// EXAMPLE
|
|
//
|
|
// SEE ALSO
|
|
//
|
|
// REVISION HISTORY
|
|
//
|
|
// February 14, 1996 2.0A : New release
|
|
//
|
|
|
|
inline int AL_INLINE_PROTO
|
|
ALStorage::ReadChar() /* Tag public function */
|
|
{
|
|
int result;
|
|
|
|
AL_ASSERT( muWriteIndex == 0, "ReadChar(): Attempt to read while in write mode" ); /*Can't read if I've done a write!*/
|
|
result = muBufferValidData - muReadIndex;
|
|
if ( result <= 0 )
|
|
result = LoadBuffer( mlFilePointer );
|
|
AL_ASSERT( mpcBuffer != 0, "ReadChar(): Attempt to read from closed file" ); /*Potential disaster*/
|
|
if ( result < 0 )
|
|
return result;
|
|
else
|
|
return mpcBuffer[ muReadIndex++ ] & 0xff;
|
|
}
|
|
|
|
//
|
|
// NAME
|
|
//
|
|
// ALStorage::WriteChar()
|
|
//
|
|
// PLATFORMS/ENVIRONMENTS
|
|
//
|
|
// Console Windows PM
|
|
// C++ C VB Delphi
|
|
//
|
|
// SHORT DESCRIPTION
|
|
//
|
|
// Write a character to a storage object.
|
|
//
|
|
// C++ SYNOPSIS
|
|
//
|
|
// #include "arclib.h"
|
|
//
|
|
// inline int ALStorage::WriteChar( int c )
|
|
//
|
|
// C SYNOPSIS
|
|
//
|
|
// #include "arclib.h"
|
|
//
|
|
// int ALStorageWriteChar( hALStorage this_object, int c );
|
|
//
|
|
// VB SYNOPSIS
|
|
//
|
|
// Declare Function ALStorageWriteChar Lib "AL20LW"
|
|
// (ByVal this_object&, ByVal c%) As Integer
|
|
//
|
|
// DELPHI SYNOPSIS
|
|
//
|
|
// function ALStorageWriteChar( this_object : hALStorage;
|
|
// c : Integer ) : Integer;
|
|
//
|
|
// ARGUMENTS
|
|
//
|
|
// this_object : A reference or pointer to the ALStorage object that
|
|
// is going to be written to. Note that the C++
|
|
// version of this call doesn't have an explicit argument
|
|
// here, since it has access to 'this' implicitly.
|
|
//
|
|
// c : The character that is going to be written.
|
|
//
|
|
// DESCRIPTION
|
|
//
|
|
// This is an inline function that is able to quickly do buffered I/O.
|
|
// By utilizing an I/O buffer we can make this routine very fast, since
|
|
// it doesn't have to call a virtual function. The virtual function
|
|
// only has to be called when FlushBuffer() gets called.
|
|
//
|
|
// Different compilers have different abilities to make this code inline,
|
|
// so sometimes it needs to be tinkered with. If you see anything in here
|
|
// that looks funny, that probably explains why.
|
|
//
|
|
//
|
|
// It is really important to keep this routine inline!!!!
|
|
//
|
|
// RETURNS
|
|
//
|
|
// Either the character that we just wrote out, or an error < AL_SUCCESS.
|
|
//
|
|
// EXAMPLE
|
|
//
|
|
// SEE ALSO
|
|
//
|
|
// ALStorage::ReadChar(), ALStorage::WriteBuffer()
|
|
//
|
|
// REVISION HISTORY
|
|
//
|
|
// February 14, 1996 2.0A : New release
|
|
//
|
|
|
|
inline int AL_INLINE_PROTO
|
|
ALStorage::WriteChar( int c ) /* Tag public function */
|
|
{
|
|
int result;
|
|
|
|
/* assert( muReadIndex == 0 ); */ /* Can't write if I've done a read */
|
|
AL_ASSERT( mpcBuffer != 0, "WriteChar(): Attempt to write to closed file" ); /* Disaster! */
|
|
result = muBufferSize - muWriteIndex;
|
|
if ( result <= 0 )
|
|
result = FlushBuffer();
|
|
if ( result < 0 )
|
|
return mStatus;
|
|
else
|
|
return mpcBuffer[ muWriteIndex++ ] = (char) c;
|
|
}
|
|
|