2020-09-30 17:12:32 +02:00

249 lines
4.6 KiB
C

/*++
Copyright (c) 1994 Microsoft Corporation
Module Name:
macros.h
Abstract:
Contains all internal macros used in INTERNET.DLL
Contents:
ROUND_UP_?K
ROUND_UP_DWORD
NEW
DEL
NEW_STRING
DEL_STRING
NEW_MEMORY
ZAP
PRIVATE
PUBLIC
GLOBAL
LOCAL
DEBUG_FUNCTION
SKIPWS
Author:
Richard L Firth (rfirth) 16-Nov-1994
Revision History:
16-Nov-1994 rfirth
Created
*/
// macros
// ROUND_UP_ - return (n) rounded up to the next (k) bytes
#define ROUND_UP_NK(n, k) (((n) + ((_ ## k ## K) - 1)) & -(_ ## k ## K))
#define ROUND_UP_2K(n) ROUND_UP_NK(n, 2)
#define ROUND_UP_4K(n) ROUND_UP_NK(n, 4)
#define ROUND_UP_8K(n) ROUND_UP_NK(n, 8)
#define ROUND_UP_16K(n) ROUND_UP_NK(n, 16)
// ROUND_UP_DWORD - return (n) rounded up to the next 4 bytes
#define ROUND_UP_DWORD(value) \
(((value) + sizeof(DWORD) - 1) & ~(sizeof(DWORD) - 1))
// ARRAY_ELEMENTS - returns number of elements in array
#define ARRAY_ELEMENTS(array) \
(sizeof(array)/sizeof(array[0]))
// NEW - allocates a new 'object' of type (obj). Memory is allocated with
// LocalAlloc and initialized to zeroes
#define NEW(object) \
(object FAR *)ALLOCATE_ZERO_MEMORY(sizeof(object))
// DEL - (should be DELETE, but that symbol is taken) - does opposite of NEW()
#define DEL(object) \
FREE_MEMORY(object)
// NEW_STRING - performs NEW for a string
#define NEW_STRING(string) \
NewString(string, 0)
// DEL_STRING - performs DEL for a string
#define DEL_STRING(string) \
FREE_MEMORY(string)
// NEW_MEMORY - performs NEW for arbitrary sized memory
#define NEW_MEMORY(n, type) \
(type FAR *)ALLOCATE_FIXED_MEMORY(n * sizeof(type))
// ZAP - zeroes an object (must be a variable, not a pointer)
#define ZAP(thing) \
ZeroMemory((PVOID)&thing, sizeof(thing))
// STRTOUL - character-width independent (compile-time controlled) strtoul
#define STRTOUL strtoul
// PRIVATE - make static items visible in debug version *FOR GLOBALS ONLY*. Use
// LOCAL in functions
#if INET_DEBUG
#define PRIVATE
#else
//#define PRIVATE static
#define PRIVATE
#endif // INET_DEBUG
// PUBLIC - just used as an aide-a-programmer pour le nonce
#define PUBLIC
// GLOBAL - same as PUBLIC, aide-a-programmer (for now) that tells you this
// thang has global scope
#define GLOBAL
// LOCAL - always expands to static, so you know that this thing only has
// local scope (within the current block)
#define LOCAL static
// DEBUG_FUNCTION - this is a debug-only routine (if it get compiled in retail
// version a compile-time error is generated)
#if INET_DEBUG
#define DEBUG_FUNCTION
#else
#define DEBUG_FUNCTION
#endif // INET_DEBUG
// SKIPWS - skips blank widespace on the front of a string
#define SKIPWS(s) while (*(s)==' ' || *(s)=='\t') (s)++;
// MAKE_LOWER - takes an assumed upper character and bit manipulates into a lower.
// (make sure the character is Upper case alpha char to begin, otherwise it corrupts)
#define MAKE_LOWER(c) (c | 0x20)
// MAKE_UPPER - takes an assumed lower character and bit manipulates into a upper.
// (make sure the character is Lower case alpha char to begin, otherwise it corrupts)
#define MAKE_UPPER(c) (c & 0xdf)
// FASTCALL - used to bypass problems that may arise with UNIX compilers
#ifdef FASTCALL
#undef FASTCALL
#endif
#ifdef unix
#define FASTCALL
#else
#define FASTCALL __fastcall
#endif
// macro to cast FILETIME to LONGLONG
#define FT2LL(x) ( ((LONGLONG)((x).dwLowDateTime)) | (((LONGLONG)((x).dwHighDateTime))<<32) )
// Inline function to handle adding LONGLONG to FILETIME.
static __inline
void AddLongLongToFT( IN OUT LPFILETIME lpft,
IN LONGLONG llVal )
{
LONGLONG llTmp;
llTmp = FT2LL(*lpft);
llTmp += llVal;
lpft->dwLowDateTime = ((LPDWORD)&llTmp)[0];
lpft->dwHighDateTime = ((LPDWORD)&llTmp)[1];
}
// Macro to compute the number of bytes between two pointers
// The type of this expression is size_t, a signed integral
// type matching the size of a pointer
#define PtrDifference(x,y) ((LPBYTE)(x) - (LPBYTE)(y))
// Macro to typecast 64-bit quantity to 32-bits
// Asserts in debug mode if the typecast loses information
#ifdef DBG
#define GuardedCast(x) ((x)<=0xFFFFFFFFL ? (DWORD)(x) : (InternetAssert(FALSE, __FILE__, __LINE__), 0))
#else
#define GuardedCast(x) (DWORD)(x)
#endif
// Macro for the most common case
#define PtrDiff32(x,y) (GuardedCast(PtrDifference(x,y)))