windows-nt/Source/XPSP1/NT/ds/xpress/xprs.h
2020-09-26 16:20:57 +08:00

201 lines
5.2 KiB
C

#ifndef _XPRS_H_
#define _XPRS_H_
/* ------------------------------------------------------------------------ */
/* */
/* Copyright (c) Microsoft Corporation, 2000-2001. All rights reserved. */
/* Copyright (c) Andrew Kadatch, 1991-2001. All rights reserved. */
/* */
/* Microsoft Confidential -- do not redistribute. */
/* */
/* ------------------------------------------------------------------------ */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include "xpress.h"
#ifdef _MSC_VER
#pragma code_seg ("PAGELK")
#ifdef _M_IX86
#pragma optimize ("tgaw", on)
#else
#pragma optimize ("tgw", on)
#endif /* _M_IX86 */
#endif
/* ------------------------ Configuration ----------------------------- */
/* ------------- */
#ifndef CODING_ALG
#define CODING_ALG 1
#endif
#define CODING_DIRECT2 (1 << 1)
#define CODING_DIRECT (1 << 2)
#define CODING_BY_BIT (1 << 3)
#define CODING_HUFF_LEN (1 << 4)
#define CODING_HUFF_PTR (1 << 5)
#define CODING_HUFF_ALL (1 << 6)
#define CODING (1 << CODING_ALG)
#define SUPPORT_CRC 0
#define BUFF_SIZE_LOG XPRESS_MAX_BLOCK_LOG
#define BUFF_SIZE (1<<BUFF_SIZE_LOG)
#if 1
#define MAX_OFFSET (BUFF_SIZE_LOG > 16 ? 16 : BUFF_SIZE_LOG)
#else
#define MAX_OFFSET 13
#endif
#if CODING == CODING_DIRECT2 && MAX_OFFSET > 13
#undef MAX_OFFSET
#define MAX_OFFSET 13
#define DIRECT2_LEN_LOG (16 - MAX_OFFSET)
#define DIRECT2_MAX_LEN ((1 << DIRECT2_LEN_LOG) - 1)
#endif
#if BUFF_SIZE < XPRESS_MAX_BLOCK
#error BUFF_SIZE should not be less than XPRESS_MAX_BLOCK
#endif
#if CODING == CODING_HUFF_LEN
#define MAX_LENGTH 32
#define HUFF_SIZE (MAX_LENGTH * 2)
#elif CODING & (CODING_HUFF_PTR | CODING_HUFF_ALL)
#if (256 / MAX_OFFSET) >= 32
#define MAX_LENGTH_LOG 5
#else
#define MAX_LENGTH_LOG 4
#endif
#define MAX_LENGTH (1 << MAX_LENGTH_LOG)
#if CODING == CODING_HUFF_PTR
#define HUFF_SIZE ((MAX_LENGTH * MAX_OFFSET + 1) & ~1)
#elif CODING == CODING_HUFF_ALL
#define HUFF_SIZE (256 + ((MAX_LENGTH * MAX_OFFSET + 1) & ~1))
#endif
#endif
#define MIN_MATCH 3 /* min acceptable match length */
#if CODING == CODING_HUFF_LEN
#define DECODE_BITS 8
#elif CODING & (CODING_HUFF_PTR | CODING_HUFF_ALL)
#define DECODE_BITS 10
#endif
/* ---------------------- Useful types ------------------------ */
/* ------------ */
#if defined (_M_IX86) && !defined (i386)
#define i386 1 /* ifdef i386 asm code will be used for some encodings */
#endif
#define uchar unsigned char /* useful types */
#define schar signed char
#ifdef _M_IX86
#define __unaligned /* x86 does not have __unaligned keyword */
#endif
#define int4 int /* any long enough integral type */
#define int2 short /* assert (2*sizeof(int2) == sizeof (int4)) */
#define xint int /* any int type >= 32 bits && >= sizeof (bitmask4) */
#define int32 int /* 32 bit type */
#define int16 short /* 16 bit type */
#define tag_t int32
#ifdef i386
#define bitmask4 int32 /* must be 32 bit for i386 */
#define bitmask2 int16
#else
#define bitmask4 int4 /* not important otherwise; shall not exceed xint */
#define bitmask2 int2
#endif
#define uint4 unsigned int4
#define uint2 unsigned int2
#define uxint unsigned xint
#define uint32 unsigned int32
#define uint16 unsigned int16
#define utag_t unsigned tag_t
#define ubitmask4 unsigned bitmask4
#define ubitmask2 unsigned bitmask2
#ifdef _MSC_VER
#if _MSC_VER >= 1200
#define INLINE __forceinline
#else
#define INLINE __inline
#endif
#pragma warning(disable:4127) /* conditional expression is constant */
#pragma warning(disable:4711) /* function XXX selected for automatic inline expansion */
#pragma warning(disable:4710) /* function XXX not expanded */
#pragma warning(disable:4100) /* unreferenced formal paramter */
#pragma warning(disable:4068) /* bogus "unknown pragma" */
#endif
#ifndef DEBUG
#define DEBUG 0
#endif
#if !defined (INLINE) || DEBUG
#undef INLINE
#define INLINE static
#endif
#if !DEBUG
#undef assert
#define assert(x)
#endif
#if CODING & (CODING_DIRECT | CODING_DIRECT2)
#define MIN_SIZE0 8
#elif CODING == CODING_BY_BIT
#define MIN_SIZE0 7
#elif CODING == CODING_HUFF_LEN
#define MIN_SIZE0 44
#elif CODING == CODING_HUFF_PTR
#define MIN_SIZE0 139
#elif CODING == CODING_HUFF_ALL
#define MIN_SIZE0 261
#else
#error wrong CODING
#endif
#define MIN_SIZE (MIN_SIZE0 + CRC_STAMP_SIZE)
#define CRC32_FIRST 0
#if SUPPORT_CRC
#define CRC_STAMP_SIZE sizeof (uint32)
#else
#define CRC_STAMP_SIZE 0
#endif
#if DEBUG
extern long xxx[];
#endif
#ifdef _MSC_VER
#pragma warning (disable: 4731) /* frame pointer register 'ebp' modified by inline assembly code */
#endif
#if CODING_ALG != 1 && CODING_ALG != 6
#error CODING_ALGs different from 1 and 6 are not supported anymore
#endif
#endif /* _XPRS_H_ */