windows-nt/Source/XPSP1/NT/multimedia/directx/dinput/pid/baggage.h
2020-09-26 16:20:57 +08:00

217 lines
5.4 KiB
C

/***************************************************************************
* Baggage.h
*
* Copyright (C) 1999 Microsoft Corporation. All Rights Reserved.
*
* File: pidi.h
* Content: DirectInput PID internal include file
*
*@@BEGIN_MSINTERNAL
* History:
* Date By Reason
* ==== == ======
* 1999.01.04 OmSharma Lost a bet
*
*@@END_MSINTERNAL
*
***************************************************************************/
/***************************************************************************
*
* Debug / RDebug / Retail
*
* If either DEBUG or RDEBUG, set XDEBUG.
*
* Retail defines nothing.
*
***************************************************************************/
#if defined(DEBUG) || defined(RDEBUG) || defined(_DBG)
#define XDEBUG
#endif
typedef LPUNKNOWN PUNK;
typedef LPVOID PV, *PPV;
typedef CONST VOID *PCV;
typedef REFIID RIID;
typedef CONST GUID *PCGUID;
#define INTERNAL NTAPI /* Called only within a translation unit */
#define EXTERNAL NTAPI /* Called from other translation units */
#define INLINE static __inline
#define INTERNAL NTAPI /* Called only within a translation unit */
#define EXTERNAL NTAPI /* Called from other translation units */
#define INLINE static __inline
#define BEGIN_CONST_DATA data_seg(".text", "CODE")
#define END_CONST_DATA data_seg(".data", "DATA")
/*
* Arithmetic on pointers.
*/
#define pvSubPvCb(pv, cb) ((PV)((PBYTE)pv - (cb)))
#define pvAddPvCb(pv, cb) ((PV)((PBYTE)pv + (cb)))
#define cbSubPvPv(p1, p2) ((PBYTE)(p1) - (PBYTE)(p2))
/*
* Convert an object (X) to a count of bytes (cb).
*/
#define cbX(X) sizeof(X)
/*
* Convert an array name (A) to a generic count (c).
*/
#define cA(a) (cbX(a)/cbX(a[0]))
/*
* Convert a count of X's (cx) into a count of bytes
* and vice versa.
*/
#define cbCxX(cx, X) ((cx) * cbX(X))
#define cxCbX(cb, X) ((cb) / cbX(X))
/*
* Convert a count of chars (cch), tchars (ctch), wchars (cwch),
* or dwords (cdw) into a count of bytes, and vice versa.
*/
#define cbCch(cch) cbCxX( cch, CHAR)
#define cbCwch(cwch) cbCxX(cwch, WCHAR)
#define cbCtch(ctch) cbCxX(ctch, TCHAR)
#define cbCdw(cdw) cbCxX( cdw, DWORD)
#define cchCb(cb) cxCbX(cb, CHAR)
#define cwchCb(cb) cxCbX(cb, WCHAR)
#define ctchCb(cb) cxCbX(cb, TCHAR)
#define cdwCb(cb) cxCbX(cb, DWORD)
/*
* Zero an arbitrary buffer. It is a common error to get the second
* and third parameters to memset backwards.
*/
#define ZeroBuf(pv, cb) memset(pv, 0, cb)
/*
* Zero an arbitrary object.
*/
#define ZeroX(x) ZeroBuf(&(x), cbX(x))
/*
* land -- Logical and. Evaluate the first. If the first is zero,
* then return zero. Otherwise, return the second.
*/
#define fLandFF(f1, f2) ((f1) ? (f2) : 0)
/*
* lor -- Logical or. Evaluate the first. If the first is nonzero,
* return it. Otherwise, return the second.
*
* Unfortunately, due to the *nature* of the C language, this can
* be implemented only with a GNU extension. In the non-GNU case,
* we return 1 if the first is nonzero.
*/
#if defined(__GNUC__)
#define fLorFF(f1, f2) ((f1) ?: (f2))
#else
#define fLorFF(f1, f2) ((f1) ? 1 : (f2))
#endif
/*
* limp - logical implication. True unless the first is nonzero and
* the second is zero.
*/
#define fLimpFF(f1, f2) (!(f1) || (f2))
/*
* leqv - logical equivalence. True if both are zero or both are nonzero.
*/
#define fLeqvFF(f1, f2) (!(f1) == !(f2))
/*
* fInOrder - checks that i1 <= i2 < i3.
*/
#define fInOrder(i1, i2, i3) ((unsigned)((i2)-(i1)) < (unsigned)((i3)-(i1)))
/*
* fHasAllBitsFlFl - checks that all bits in fl2 are set in fl1.
*/
BOOL INLINE
fHasAllBitsFlFl(DWORD fl1, DWORD fl2)
{
return (fl1 & fl2) == fl2;
}
/*
* fEqualMask - checks that all masked bits are equal
*/
BOOL INLINE
fEqualMaskFlFl(DWORD flMask, DWORD fl1, DWORD fl2)
{
return ((fl1 ^ fl2) & flMask) == 0;
}
#define NEED_REALLOC
STDMETHODIMP EXTERNAL ReallocCbPpv(UINT cb, PV ppvObj);
STDMETHODIMP EXTERNAL AllocCbPpv(UINT cb, PV ppvObj);
#ifdef NEED_REALLOC
#define FreePpv(ppv) (void)ReallocCbPpv(0, ppv)
#else
void EXTERNAL FreePpv(PV ppv);
#define FreePpv(ppv) FreePpv(ppv)
#endif
#define FreePv(pv) LocalFree((HLOCAL)(pv))
HRESULT EXTERNAL hresDupPtszPptsz(LPCTSTR ptszSrc, LPTSTR *pptszDst);
#define AToU(dst, cchDst, src) \
MultiByteToWideChar(CP_ACP, 0, src, -1, dst, cchDst)
#define UToA(dst, cchDst, src) \
WideCharToMultiByte(CP_ACP, 0, src, -1, dst, cchDst, 0, 0)
/***************************************************************************
*
* Debugging macros needed by inline functions
*
* The build of debugging goo is in debug.h
*
***************************************************************************/
int EXTERNAL AssertPtszPtszLn(LPCTSTR ptszExpr, LPCTSTR ptszFile, int iLine);
#ifdef DEBUG
#define AssertFPtsz(c, ptsz) \
((c) ? 0 : AssertPtszPtszLn(ptsz, TEXT(__FILE__), __LINE__))
#define ValidateF(c, arg) \
((c) ? 0 : (RPF arg, ValidationException(), 0))
#define ConfirmF(c) \
((c) ? 0 : AssertPtszPtszLn(TEXT(#c), TEXT(__FILE__), __LINE__))
#else /* !DEBUG */
#define AssertFPtsz(c, ptsz)
#define ValidateF(c, arg)
#define ConfirmF(c) (c)
#endif
/*
* CAssertF - compile-time assertion.
*/
#define CAssertF(c) switch(0) case c: case 0:
#define AssertF(c) AssertFPtsz(c, TEXT(#c))
#define Clamp( MIN_, VAL_, MAX_ ) ( (VAL_ < MIN_) ? MIN_ : ((VAL_ > MAX_) ? MAX_ : VAL_) )
#define Clip( VAL_, MAX_) ( (VAL_ > MAX_) ? MAX_ : VAL_)