142 lines
3 KiB
C
142 lines
3 KiB
C
|
/*
|
|||
|
** copylz.c - CopyLZFile() and buffer management functions.
|
|||
|
**
|
|||
|
** Author: DavidDi
|
|||
|
**
|
|||
|
** This module is compiled twice - once with LZA_DLL defined for the Windows
|
|||
|
** DLL, and once without LZDLL defined for static DOS library.
|
|||
|
*/
|
|||
|
|
|||
|
|
|||
|
// Headers
|
|||
|
///////////
|
|||
|
|
|||
|
#include <basedll.h>
|
|||
|
#define LZA_DLL
|
|||
|
#include "lz_common.h"
|
|||
|
#include "lz_buffers.h"
|
|||
|
#include "lz_header.h"
|
|||
|
|
|||
|
#include "lzpriv.h"
|
|||
|
|
|||
|
|
|||
|
/*
|
|||
|
** int APIENTRY LZStart(void);
|
|||
|
**
|
|||
|
** If the global buffers are not already initialized, allocates buffers in
|
|||
|
** preparation for calls to CopyLZFile(). Increments the global buffer lock
|
|||
|
** count. Sets the global buffers' base pointers and lengths.
|
|||
|
**
|
|||
|
** Arguments: void
|
|||
|
**
|
|||
|
** Returns: int - TRUE if successful. LZERROR_GLOBALLOC if unsuccessful.
|
|||
|
**
|
|||
|
** Globals: none
|
|||
|
*/
|
|||
|
|
|||
|
INT APIENTRY LZStart(VOID)
|
|||
|
{
|
|||
|
return(TRUE);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/*
|
|||
|
** VOID APIENTRY LZDone(void);
|
|||
|
**
|
|||
|
** If any of the global buffers have not already been freed, frees them and
|
|||
|
** resets the buffers' base array pointers to NULL. Decrements the global
|
|||
|
** buffer lock count.
|
|||
|
**
|
|||
|
** Arguments: void
|
|||
|
**
|
|||
|
** Returns: VOID
|
|||
|
**
|
|||
|
** Globals: none
|
|||
|
*/
|
|||
|
VOID APIENTRY LZDone(VOID)
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
** CopyLZFile()
|
|||
|
**
|
|||
|
** Alias for LZCopy(). Originally, LZCopy() and
|
|||
|
** CopyLZFile() were intended for different purposes, but they were confused
|
|||
|
** and misused so much they were made identical.
|
|||
|
*/
|
|||
|
LONG APIENTRY CopyLZFile(HFILE doshSource, HFILE doshDest)
|
|||
|
{
|
|||
|
return(LZCopy(doshSource, doshDest));
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
** LZCopy()
|
|||
|
**
|
|||
|
** Expand a compressed file, or copy an uncompressed file.
|
|||
|
**
|
|||
|
** Arguments: doshSource - source DOS file handle
|
|||
|
** doshDest - destination DOS file handle
|
|||
|
**
|
|||
|
** Returns: LONG - Number of bytes written if copy was successful.
|
|||
|
** One of the LZERROR_ codes if unsuccessful.
|
|||
|
**
|
|||
|
** Globals: none
|
|||
|
*/
|
|||
|
LONG APIENTRY LZCopy(HFILE doshSource, HFILE doshDest)
|
|||
|
{
|
|||
|
INT f;
|
|||
|
LONG lRetVal;
|
|||
|
PLZINFO pLZI;
|
|||
|
|
|||
|
// If it's a compressed file handle, translate to a DOS handle.
|
|||
|
if (doshSource >= LZ_TABLE_BIAS)
|
|||
|
{
|
|||
|
LZFile *lpLZ; // pointer to LZFile struct
|
|||
|
HANDLE hLZFile; // handle to LZFile struct
|
|||
|
|
|||
|
if ((hLZFile = rghLZFileTable[doshSource - LZ_TABLE_BIAS]) == NULL)
|
|||
|
{
|
|||
|
return(LZERROR_BADINHANDLE);
|
|||
|
}
|
|||
|
|
|||
|
if ((lpLZ = (LZFile *)GlobalLock(hLZFile)) == NULL)
|
|||
|
{
|
|||
|
return(LZERROR_GLOBLOCK);
|
|||
|
}
|
|||
|
|
|||
|
doshSource = lpLZ->dosh;
|
|||
|
doshDest = ConvertDosFHToWin32(doshDest);
|
|||
|
|
|||
|
GlobalUnlock(hLZFile);
|
|||
|
}
|
|||
|
else {
|
|||
|
doshDest = ConvertDosFHToWin32(doshDest);
|
|||
|
doshSource = ConvertDosFHToWin32(doshSource);
|
|||
|
}
|
|||
|
|
|||
|
// Initialize buffers
|
|||
|
pLZI = InitGlobalBuffersEx();
|
|||
|
|
|||
|
if (!pLZI) {
|
|||
|
return(LZERROR_GLOBALLOC);
|
|||
|
}
|
|||
|
|
|||
|
ResetBuffers();
|
|||
|
|
|||
|
// Expand / copy file.
|
|||
|
if ((f = ExpandOrCopyFile(doshSource, doshDest, pLZI)) != TRUE) {
|
|||
|
// Expansion / copy failed.
|
|||
|
lRetVal = (LONG)f;
|
|||
|
} else {
|
|||
|
// Expansion / copy successful - return number of bytes written.
|
|||
|
lRetVal = pLZI->cblOutSize;
|
|||
|
}
|
|||
|
|
|||
|
// Free global buffers.
|
|||
|
FreeGlobalBuffers(pLZI);
|
|||
|
|
|||
|
return(lRetVal);
|
|||
|
}
|
|||
|
|
|||
|
|