217 lines
5.4 KiB
C
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_)
|