windows-nt/Source/XPSP1/NT/base/win32/lz32/winlza/lz_common.h
2020-09-26 16:20:57 +08:00

153 lines
4.7 KiB
C

/*
** common.h - housekeeping for Lempel-Ziv compression / expansion DOS
** command-line programs, DOS static library module, and Windows
** DLL
**
** Author: DavidDi
*/
// Headers
///////////
#ifdef LZA_DLL
#include <windows.h>
#include <port1632.h>
#endif
#include <lzdos.h>
#include "translat.h"
// Set up type for function argument pointers.
#ifdef LZA_DLL
#define ARG_PTR FAR
#else
#define ARG_PTR // nada
#endif
// Constants
/////////////
#define chEXTENSION_CHAR '_'
#define pszEXTENSION_STR "_"
#define pszNULL_EXTENSION "._"
#define NOTIFY_START_COMPRESS 0 // file processing notifications
#define NOTIFY_START_EXPAND 1 //
#define NOTIFY_START_COPY 2 //
#define BLANK_ERROR 0 // error condition requiring no error
// message display
// Types
/////////
// Callback notification procedure.
typedef BOOL (*NOTIFYPROC)(CHAR ARG_PTR *pszSource, CHAR ARG_PTR *pszDest,
WORD wProcessFlag);
// Flag indicating whether or not rgbyteInBuf[0], which holds the last byte
// from the previous input buffer, should be read as the next input byte.
// (Only used so that at least one unReadUChar() can be done at all input
// buffer positions.)
typedef struct tagLZI {
BYTE *rgbyteRingBuf; // ring buffer for expansion
BYTE *rgbyteInBuf; // input buffer for reads
BYTE *pbyteInBufEnd; // pointer past end of rgbyteInBuf[]
BYTE *pbyteInBuf; // pointer to next byte to read from
BYTE *rgbyteOutBuf; // output buffer for writes
BYTE *pbyteOutBufEnd; // pointer past end of rgbyteOutBuf[]
BYTE *pbyteOutBuf; // pointer to last byte to write from
// Flag indicating whether or not rgbyteInBuf[0], which holds the last byte
// from the previous input buffer, should be read as the next input byte.
// (Only used so that at least one unReadUChar() can be done at all input
// buffer positions.)
BOOL bLastUsed;
// Actually, rgbyteInBuf[] has length (ucbInBufLen + 1) since rgbyteInBuf[0]
// is used when bLastUsed is TRUE.
INT cbMaxMatchLen; // longest match length for current algorithm
LONG cblInSize, // size in bytes of input file
cblOutSize; // size in bytes of output file
DWORD ucbInBufLen, // length of input buffer
ucbOutBufLen; // length of output buffer
DWORD uFlags; // LZ decoding description byte
INT iCurRingBufPos; // ring buffer offset
INT *leftChild; // parents and left and right
INT *rightChild; // children that make up the
INT *parent; // binary search trees
INT iCurMatch, // index of longest match (set by LZInsertNode())
cbCurMatch; // length of longest match (set by LZInsertNode())
} LZINFO;
typedef LZINFO *PLZINFO;
// Macros
//////////
#define FOREVER for(;;)
#ifndef MAX
#define MAX(a, b) (((a) > (b)) ? (a) : (b))
#endif
#ifndef MIN
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
#endif
// Prototypes
//////////////
// compress.c
extern INT Compress(NOTIFYPROC pfnNotify, CHAR ARG_PTR *pszSource,
CHAR ARG_PTR *pszDest, BYTE byteAlgorithm,
BOOL bDoRename, PLZINFO pLZI);
// expand.c
extern INT Expand(NOTIFYPROC pfnNotify, CHAR ARG_PTR *pszSource,
CHAR ARG_PTR *pszDest, BOOL bDoRename, PLZINFO pLZI);
extern INT ExpandOrCopyFile(INT doshSource, INT doshDest, PLZINFO pLZI);
// dosdir.asm
extern INT GetCurDrive(VOID);
extern INT GetCurDir(LPSTR lpszDirBuf);
extern INT SetDrive(INT wDrive);
extern INT SetDir(LPSTR lpszDirName);
extern INT IsDir(LPSTR lpszDir);
extern INT IsRemoveable(INT wDrive);
// utils.c
extern CHAR ARG_PTR *ExtractFileName(CHAR ARG_PTR *pszPathName);
extern CHAR ARG_PTR *ExtractExtension(CHAR ARG_PTR *pszFileName);
extern VOID MakePathName(CHAR ARG_PTR *pszPath, CHAR ARG_PTR *pszFileName);
extern CHAR MakeCompressedName(CHAR ARG_PTR *pszFileName);
extern LPWSTR ExtractFileNameW(LPWSTR pszPathName);
extern LPWSTR ExtractExtensionW(LPWSTR pszFileName);
extern WCHAR MakeCompressedNameW(LPWSTR pszFileName);
extern VOID MakeExpandedName(CHAR ARG_PTR *pszFileName,
BYTE byteExtensionChar);
extern INT CopyDateTimeStamp(INT_PTR doshFrom, INT_PTR doshTo);
extern BOOL LZIsCharLowerA(char cChar);
extern BOOL LZIsCharUpperA(char cChar);
extern LPSTR LZCharNextA(LPCSTR lpCurrentChar);
extern LPSTR LZCharPrevA(LPCSTR lpStart, LPCSTR lpCurrentChar);
#undef IsCharLower
#undef IsCharUpper
#undef CharNext
#undef CharPrev
#define IsCharLower LZIsCharLowerA
#define IsCharUpper LZIsCharUpperA
#define CharNext LZCharNextA
#define CharPrev LZCharPrevA